2016-10-03 79 views
1

在OpenGL ES中,颜色范围从0-1f。这些值是否直接映射到0-255,也就是8位?或者0-1f范围在高于8位时能达到更精细的颜色吗?Android OpenGL ES中的灰度颜色深度

我正在编程生成一个模式,其中rgb是相等的(因为它是灰度),所以这个图像是8位的。我想要在灰度上实现更深的颜色深度,例如16位,这可能吗?

回答

1

取决于您的输入/输出纹理格式;如果它是RGB565那么它将小于8位,如果它是RGB10_A2那么它将超过8位。

通常以比原始数据更高的精度完成纹理过滤(例如双线性或三线性),因此可能导致不完全例如8位纹理的1/256的倍数。

我想在灰度上实现更深的颜色深度,例如16位,这可能吗?

的OpenGL ES 3.0具有广泛的整数格式,OpenGL ES的ES 3.2具有FP16和FP32格式,因此它是绝对有可能以每信道超过8位存储相对任意的数据。

但是,真正的问题是出于什么目的?如果您打算在屏幕上显示该值,那么您可能没有任何设备能够实现每通道颜色16位的显示。几乎所有的消费级显示器和移动设备面板都是每个颜色通道8位(移动设备中,很多甚至不接受8位数据,但只在面板上显示6位或7位精度)。

+0

感谢您的回答。我正在做的是以编程方式生成一个我想要展示的模式,并且我希望在对比中实现非常好的差异。例如,如果我在rgb灰度中有一个最大值为250和最小值为248的模式,并在其间插入值,则这是我可以用8位分辨率显示的绝对最小对比度。我可以改变它的亮度,但最终我想更好地控制这些值。 此外,我不使用位图,我将颜色数据与顶点直接传递给着色器。这有什么区别吗? – Karam

+0

您可以进行某种色调映射 - 将输入颜色范围重新映射到不同的东西。查看一些想法的HDR色调映射技术;许多概念与您尝试的概念类似(将一个亮度范围向上或向下缩放到不同的显示范围)。这不是微不足道的 - 尤其是在扩展增加对比度时 - 您可能需要进行一些过滤以避免出现问题。但是,在一天结束时,您将达到您使用的面板的8位限制。 – solidpixel