如何在GLSL中使用RGBA16?

时间:2013-01-10 16:30:27

标签: c++ opengl glsl shader

我正试图在GLSL中绘制一些深度图之王,我需要至少一个10比特的通道。我决定使用GL_R16或GL_RGBA12 - 它们是最近的一个,而GL_R16将花费更少的GPU内存(因为它会......对吗?)。

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA12, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);

问题出现了:如何使GLSL正确使用它? Sampler2D将其转换为经典的8位RGBA ... 夹紧怎么样?在GLSL中,每个分量颜色归一化为[0,1] - 对于16位是否相同? 我想知道的只是如何使用它。

1 个答案:

答案 0 :(得分:4)

  

Sampler2D将其转换为经典的8位RGBA ...

不,它没有。 sampler2d不知道或不关心格式(除非它是整数格式,在这种情况下,您会得到未定义的行为)。它将其转换为 float ;仅此而已。

  

夹紧怎么样?

Clamping无关紧要,因为GL_RGBA16是无符号的规范化格式。范围[0,65535]上的整数值转换为[0,1],就像GL_RGBA8将[0,255]转换为[0,1]一样。这不是“夹紧”;这就是你的格式说OpenGL要做的事情。更高精度的格式只能提供更好的精度;他们没有提供更大的数字。

如果您想将16位整数实际上作为整数,那么您需要使用实际存储整数的格式。 GL_RGBA16UI存储16位无符号整数。当然,这需要OpneGL 3.x +硬件。而且你必须使用usampler2d