为什么像素颜色在 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,否则启用抖动可能会给您带来更好的视觉效果。
我正在使用符合这些规范的 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,否则启用抖动可能会给您带来更好的视觉效果。