0

我正在尝试在 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 位是否相同?我只想知道如何使用它。

4

1 回答 1

5

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

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

夹紧呢?

钳位无关紧要,因为 GL_RGBA16 是无符号标准化格式。[0, 65535] 范围内的整数值被转换为 [0, 1],就像 GL_RGBA8 将 [0, 255] 转换为 [0, 1] 一样。这不是“钳制”;这就是您的格式要求 OpenGL 执行的操作。精度更高的格式只会提供更好的精度;他们不提供更大的数字。

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

于 2013-01-10T19:57:10.773 回答