2015-08-09 56 views
0

我使用一个EGLConfig规格如下:为什么在OpenGL ES 2.0中像素颜色不准确?

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 

法案ual问题在于形状颜色并不牢固,这发生在整个屏幕区域(有更亮的像素): enter image description here

实际颜色是0.55f,0.8f,0.3f。

+1

这部分非常类似于http://stackoverflow.com/questions/31204343/opengl-es-2-0-solid-colour-colour-value-precision-issue。但另一个问题更多地集中在颜色的实际价值上,颜色不统一只是其中的一个方面。所以它看起来不够接近,因此被标记为重复。 –

+0

我看到了这个问题,但不知何故,当我测试时我错过了它真正起作用。 – YeeApple

回答

1

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

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

GLES20.glDisable(GLES20.GL_DITHER); 

抖动的目的当然是提高视觉质量。除非您要求输出颜色完全准确/统一,否则启用抖动可能会为您提供更好的视觉效果。