glTexImage2D
采用internalFormat
(指定位数和数据类型/编码(,format
(没有位数和编码(和type
。
例如,是否可以让 OpenGL 将包含 32 位整数的传递像素数据从格式GL_RGB_INTEGER
和类型GL_INT
转换为内部格式GL_RGB32F
?
维基文章 https://www.khronos.org/opengl/wiki/Pixel_Transfer#Format_conversion 向我建议,通过说明以下内容是可能的:
用户指定的像素必须在用户指定的格式(具有格式和类型(和由图像的图像格式控制的内部表示之间转换。
但是我无法从着色器中的浮点采样器读取。
_INTEGER
像素传输格式仅用于将数据传输到整数图像格式。您正在填充浮点纹理,因此不符合条件。你应该得到一个OpenGL错误。
事实上,您链接到的文章详细说明了这一点:
此外,如果指定了"_INTEGER"但图像格式不是整数,则传输将失败。
GL_RGBA32F
不是完整的图像格式。
如果删除_INTEGER
部分,则像素传输将"工作"。OpenGL 将假定整数数据是规范化值,因此您将获得范围 [-1, 1] 上的浮点值。也就是说,如果传递 32 位整数值 1,则相应的浮点值将为1/(2^31-1)
,这是一个非常小的数字(因此,几乎可以肯定只有 0.0(。
如果您希望 OpenGL 像通过 C 转换(float)1
一样强制转换整数......好吧,实际上没有办法做到这一点。您只需要自己转换数据即可。