Krz*_*cho 0 c++ opengl shader glsl
我正在尝试在 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);
Run Code Online (Sandbox Code Playgroud)
问题来了:如何让 GLSL 正确使用它?Sampler2D 将其转换为经典的 8 位 RGBA...钳位怎么样?在 GLSL 中,每个分量颜色都归一化为 [0,1] - 16 位是否相同?我只想知道如何使用它。
Sampler2D 将其转换为经典的 8 位 RGBA...
不,它没有。Asampler2d不知道或不关心格式(除非它是整数格式,在这种情况下您会得到未定义的行为)。它把它转换成一个浮点数;而已。
夹子呢?
钳位无关紧要,因为 GL_RGBA16 是无符号的标准化格式。范围 [0, 65535] 上的整数值转换为 [0, 1],就像 GL_RGBA8 将 [0, 255] 转换为 [0, 1] 一样。这不是“夹紧”;这就是您的格式要求 OpenGL 执行的操作。更高精度的格式只会提供更好的精度;他们不提供更大的数字。
如果你想真正得到 16 位整数作为integers,那么你需要使用一种实际存储integers的格式。GL_RGBA16UI 存储 16 位无符号整数。当然,这需要 OpneGL 3.x+ 硬件。而且您必须使用usampler2d.