2012-12-26 39 views
2

所以,有很多不同的颜色空间,名称为RGB。有些是线性的,有些是伽玛射线。我假设哪一个正在使用因显示器而异。我应该如何在directx/opengl中解释RGB颜色?

哪一个我应该将directx或opengl着色器中的rgb值解释为?

是否有一个'安全'的色彩空间,我可以假设一个典型的用户将使用?比如说,游戏行业的每个人都假设他们的用户会使用RGB空间吗?

或者有没有办法来检测显示器正在使用的颜色空间?

我需要知道,以便我可以转换为标准色彩空间,如CIE XYZ。如果它有点不对,这很好,但我希望尽可能的接近典型的硬件。

回答

3

没有进一步的规定,进入OpenGL的颜色直接进入显示器,仅应用了视频伽玛斜坡。 OpenGL中的所有颜色操作都是线性的。

但是,OpenGL确实提供了特殊的sRGB纹理格式,它在进行颜色操作之前首先线性化来自颜色空间的纹理颜色。为了补充这一点,还支持sRGB帧缓冲格式。

另请参见这些进一步信息http://www.g-truc.net/post-0263.htmlhttp://www.arcsynthesis.org/gltut/Texturing/Tut16%20Free%20Gamma%20Correction.html

当然对于一些应用sRGB是一个不适宜的色彩空间(小,以低的​​保真度在8位)。在这些情况下,我建议使用“原始颜色”OpenGL图像和帧缓冲格式,并在着色器中执行颜色转换。对于纹理(假设R = X,G = Y,B = Z),使用一些接触色彩空间(XYZ非常适合此)与某种HDR图像格式(即每个通道10个或更多位)。渲染到屏幕外的帧缓冲区对象,并在最终的后处理步骤中从XYZ帧缓冲区转换到屏幕色彩空间。

或者有没有办法来检测显示器正在使用的颜色空间?

OpenGL不处理设备管理。您将不得不使用操作系统的设施来确定输出设备的颜色配置文件。