GLES2.0+ framebuffer fade artifacts
GLES2.0+ framebuffer fade artifacts
我正在使用 GLES 2.0 或 3.0 在 android 上编写一个简单的测试程序。 (如果解决方案只对其中一个有效,那么我将采用该解决方案。)
问题:
- 基本上我 运行 在褪色时遇到奇怪的像素伪像。
- 问题可能是 "hidden" 通过提高截止阈值,但是淡入淡出仍然具有不完整的一致性,就我的目的而言,这不起作用。
示例:
- Example Pictures (Sorry, I cant post images directly yet)
- 已降低帧缓冲区分辨率,使瑕疵更加明显。
- 此问题出现在所有测试的设备上(Nexus 7 2012 和 2013、Galaxy Tab S 8.4、Galaxy S6 Edge、Galaxy Note 4)
- 在较新的设备上,问题似乎只是统一的粉红色小点,在较旧的设备上,问题似乎确实不完整,如链接图片所示。
- 运行 最终渲染的模糊通道也不在考虑范围内,因为这需要节能且移动友好。
布局:
- 我创建了 2 个帧缓冲区。 (使用 GLES20.GL_UNSIGNED_SHORT_5_6_5
格式。)
- 我将第一个设置为渲染目标。
- 我绘制了一个四边形,它是帧缓冲区缓冲区的大小。
- 四边形片段着色器设置为渲染一个在圆圈中移动的黑点。
- 四边形也可以采用纹理并将其与点混合。
- 然后我切换回屏幕渲染。
- 我使用之前设置的渲染目标作为纹理渲染另一个四边形。
- 然后在每一帧切换纹理时重复此过程。
渲染代码:
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 的情况下获得更好的结果,尽管在我的设备选择上进行的实验似乎没有效果,但在其他设备上可能会。
我正在使用 GLES 2.0 或 3.0 在 android 上编写一个简单的测试程序。 (如果解决方案只对其中一个有效,那么我将采用该解决方案。)
问题:
- 基本上我 运行 在褪色时遇到奇怪的像素伪像。
- 问题可能是 "hidden" 通过提高截止阈值,但是淡入淡出仍然具有不完整的一致性,就我的目的而言,这不起作用。
示例:
- Example Pictures (Sorry, I cant post images directly yet)
- 已降低帧缓冲区分辨率,使瑕疵更加明显。
- 此问题出现在所有测试的设备上(Nexus 7 2012 和 2013、Galaxy Tab S 8.4、Galaxy S6 Edge、Galaxy Note 4)
- 在较新的设备上,问题似乎只是统一的粉红色小点,在较旧的设备上,问题似乎确实不完整,如链接图片所示。
- 运行 最终渲染的模糊通道也不在考虑范围内,因为这需要节能且移动友好。
布局:
- 我创建了 2 个帧缓冲区。 (使用 GLES20.GL_UNSIGNED_SHORT_5_6_5 格式。)
- 我将第一个设置为渲染目标。
- 我绘制了一个四边形,它是帧缓冲区缓冲区的大小。
- 四边形片段着色器设置为渲染一个在圆圈中移动的黑点。
- 四边形也可以采用纹理并将其与点混合。
- 然后我切换回屏幕渲染。
- 我使用之前设置的渲染目标作为纹理渲染另一个四边形。
- 然后在每一帧切换纹理时重复此过程。
渲染代码:
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 的情况下获得更好的结果,尽管在我的设备选择上进行的实验似乎没有效果,但在其他设备上可能会。