只有在我的Android模拟器上使用硬件加速渲染时,我似乎对色谱的低端失去了相当大的精确度。
使用硬件加速(ANGLE D3D11或Desktop Native OpenGL):
当试图渲染光线照明时,条纹显然是非线性的,变得非常突兀。
我已设置getWindow().setFormat(PixelFormat.RGBA_8888);
并在片段着色器中使用precision highp float;
。
我们使用Android Studio 3.1.1,Windows 10,OpenGL ES 3.0。
答案 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/