我正在使用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.com/bQsG9YJ.png。
答案 0 :(得分:2)
它是一个多部分解决方案,调用GLES20.glDisable(GLES20.GL_DITHER),将渲染缓冲区格式设置为GLES30.GL_UNSIGNED_SHORT_5_5_5_1,正如Jerem所说,尽管实验,你也可以在禁用alpha的情况下获得更好的结果在我的设备选择上似乎没有任何影响,可能在其他设备上。