如何在GLSL中使用RGBA16

How to use RGBA16 in GLSL?

本文关键字:RGBA16 GLSL      更新时间:2023-10-16

我试图在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位来说是一样的吗?我只是想知道如何使用它。

Sampler2D转换成经典的8位RGBA…

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

夹紧怎么办?

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

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