GLES2.0+ framebuffer fade artifacts

GLES2.0+ framebuffer fade artifacts

我正在使用 GLES 2.0 或 3.0 在 android 上编写一个简单的测试程序。 (如果解决方案只对其中一个有效,那么我将采用该解决方案。)

问题:

示例:

布局:

渲染代码:

int i = 0;
@Override public void onDrawView() {
    setRenderTarget(mRenderTexture[i]);
    mTestShader.setTexture0(mRenderTexture[(i + 1) % 2].getTextureHandle());
    mTestShader.draw(mBlitQuad);
    setRenderTarget(null);
    mBlitShader.setTexture0(mRenderTexture[i].getTextureHandle());
    mBlitShader.draw(mBlitQuad);
    i = ++i % 2;
}

着色器代码:

precision highp float;

uniform float u_GlobalTime;
uniform vec3 u_Resolution;
uniform sampler2D u_Texture0;

varying vec2 v_TexCoord;

void main(void) {
    vec2 uv = v_TexCoord * 2.0 - 1.0;
    uv.x *= u_Resolution.z;
    vec2 pos = vec2(cos(u_GlobalTime), sin(u_GlobalTime)) * 0.5;
    vec4 circle = vec4(1.0 - smoothstep(0.09, 0.11, length(pos - uv)));
    vec4 px = max(texture2D(u_Texture0, v_TexCoord), circle) - 0.025;
    gl_FragColor = step(0.15, px) * px;
}

对这个问题有帮助吗?

编辑:
感谢 Jerem,在谷歌搜索抖动后,我找到了 GLES20.glDisable(GLES20.GL_DITHER)。这对解决这个问题有很大帮助,并且在较新的设备上它可以完美运行。在较旧的设备上,我仍然 运行 进入人工制品 HERE

EDIT2:
经过更多测试后,切换到具有均匀 RGB 颜色的缓冲区格式似乎已经成功了 GLES30。GL_UNSIGNED_SHORT_5_5_5_1。我猜这与 GPU 如何压缩帧缓冲区有关,因为绿色更明显。 (了解它不喜欢 5_6_5 格式的具体原因仍然会有帮助。)
应用两个修复后的最终结果:i.imgur.[=72= .png.

它是一个多部分解决方案,调用 GLES20.glDisable(GLES20.GL_DITHER),将渲染缓冲区格式设置为 GLES30。GL_UNSIGNED_SHORT_5_5_5_1,正如 Jerem 所说,您也可以在禁用 alpha 的情况下获得更好的结果,尽管在我的设备选择上进行的实验似乎没有效果,但在其他设备上可能会。