带有硬件加速功能的Android Emulator Color Banding OpenGL ES 3.0

时间:2018-04-11 13:39:31

标签: android opengl-es android-emulator hardware-acceleration opengl-es-3.0

只有在我的Android模拟器上使用硬件加速渲染时,我似乎对色谱的低端失去了相当大的精确度。

使用硬件加速(ANGLE D3D11或Desktop Native OpenGL): enter image description here

没有硬件加速(SwiftShader): enter image description here

当试图渲染光线照明时,条纹显然是非线性的,变得非常突兀。

我已设置getWindow().setFormat(PixelFormat.RGBA_8888);并在片段着色器中使用precision highp float;

我们使用Android Studio 3.1.1,Windows 10,OpenGL ES 3.0。

*编辑:这是一个并排增加亮度和对比度 enter image description here

1 个答案:

答案 0 :(得分:1)

这看起来sRGB颜色在某些时候以线性8位格式存储,然后转换回sRGB。这将导致您正在观察的那种低亮度不精确度。

在致电eglCreateWindowSurface时,请尝试在{EGL_COLORSPACE_KHR, EGL_COLORSPACE_SRGB_KHR, EGL_NONE}参数中传递attrib_list。如果您使用的是GLSurfaceView,则需要实施EGLWindowSurfaceFactory并致电setEGLWindowSurfaceFactory。这需要EGL_KHR_gl_colorspace扩展名。

public class EGLFactory implements GLSurfaceView.EGLWindowSurfaceFactory {
  private static final int EGL_GL_COLORSPACE_KHR = 0x309D;
  private static final int EGL_GL_COLORSPACE_SRGB_KHR = 0x3089;
  public EGLSurface createWindowSurface(EGL10 egl, EGLDisplay display,
                                        EGLConfig config, Object nativeWindow) {
    final int[] attribList = {
      EGL_GL_COLORSPACE_KHR,
      EGL_GL_COLORSPACE_SRGB_KHR,
      EGL10.EGL_NONE
    };
    return egl.eglCreateWindowSurface(display, config, nativeWindow, attribList);
  }
  public void destroySurface(EGL10 egl, EGLDisplay display, EGLSurface surface) {
    egl.eglDestroySurface(display, surface);
  }
}

如果您想了解有关sRGB的更多信息,请参阅以下内容:http://blog.johnnovak.net/2016/09/21/what-every-coder-should-know-about-gamma/