我已经阅读glTeximage2D
上的documentation并且有点困惑,在这种情况下,OpenGL会将纹理值钳制到[0,1]。我在纹理中使用GL_RED
作为格式,文档说:
format 确定数据中每个元素的组成。它可以 假设其中一个符号值:
GL_RED 每个元素都是一个红色组件。 GL将其转换为浮点并通过将0连接到绿色和蓝色以及将1连接到alpha来将其组装成RGBA元素。每个组件都被钳制到[0,1]范围内。
这基本上不是说OpenGL总是会压缩值而不管内部格式如何?
然而,当我将纹理上传为:
glTexImage2D(GL_TEXTURE_2D, 0, GL_R16F, width, height, 0, GL_RED, GL_FLOAT, data);
OpenGL以GL_R16F
内部格式 来限制我的数据。但是,如果我将内部格式更改为GL_R16
,它们会被限制。文档在哪里根据内部格式说明有关钳位的内容?
答案 0 :(得分:1)
OpenGL Wiki about Image Format 包含有关此内容的更多信息。
OpenGL具有用于编写其颜色格式枚举的特定语法。它看起来像这样:
GL_[components][size][type]
:没有类型后缀表示无符号规范化整数格式。
_SNORM
:签名的规范化整数格式。F
:浮点数。因此,GL_RGBA32F
是一种浮点格式,其中每个组件都是32位IEEE浮点值。I
:签名的整数格式。因此GL_RGBA8I
给出一个有符号整数格式,其中四个分量中的每一个都是[-128, 127]
范围内的整数。UI
:无符号整数格式。对于整数大小,值从[0, MAX_INT]
开始。
与像素相关传输OpenGL Wiki about Pixel Transfer 包括那个。
将数据传输到图像时,像素值将转换为浮点或整数值。如果图像格式已标准化,则写入的值将被钳制为[0,1]并进行标准化。如果图像格式是整数,则逐字复制整数输入值。