为什么像素颜色在 OpenGL ES 2.0 中不准确?

Why pixel colour is not accurate in OpenGL ES 2.0?

我正在使用符合这些规范的 EGLConfig:

EGL10.EGL_RED_SIZE, 5,
EGL10.EGL_GREEN_SIZE, 6,
EGL10.EGL_BLUE_SIZE, 5,
EGL10.EGL_DEPTH_SIZE, 16,
EGL10.EGL_RENDERABLE_TYPE, 4,
EGL10.EGL_SAMPLE_BUFFERS, 1,
EGL10.EGL_SAMPLES, 4,

着色器:

private final static String vertexShaderCode =
    "uniform mat4 uMVPMatrix;" +
    "attribute vec4 vPosition;" +
    "void main() {" +
    "  gl_Position = uMVPMatrix * vPosition;" +
    "}";

private final static String fragmentShaderCode =
    "precision mediump float;" +
    "uniform vec4 vColor;" +
    "void main() {" +
    "  gl_FragColor = vColor;" +
    "}";

onSurfaceCreated:

GLES20.glClearColor(1f, 1f, 1f, 1f);
// Initialising shapes

onDrawFrame:

GLES20.glClear( GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT);
// Drawing shapes

实际问题是形状颜色不纯,整个屏幕区域都会出现这种情况(有更多更亮的像素):

真实颜色为 0.55f、0.8f、0.3f。

OpenGL 默认对渲染输出执行抖动。当输出缓冲区的颜色深度相对较低时,这一点尤其明显,就像 RGB565 配置代码请求的情况一样。

要禁用抖动,请在初始化 OpenGL 状态时添加此调用,例如在 onSurfaceCreated():

GLES20.glDisable(GLES20.GL_DITHER);

抖动的目的当然是为了提高视觉质量。除非您要求输出颜色完全 accurate/uniform,否则启用抖动可能会给您带来更好的视觉效果。