OpenGL 亮度内部数据类型

OpenGL Luminance internal data type

我正在创建一个 2D 纹理,但我对我的纹理实际存储的数据类型感到困惑。我的输入是一个 2D 32 位浮点数组,现在被归一化为 0-1。我正在使用类似于此的调用创建纹理:

glTexImage2D(self._target, 0, GL_LUMINANCE, GL_LUMINANCE, gl.GL_UNSIGNED_BYTE, (2048, 8192))

并用类似这样的东西推送数据:

glTexSubImage2D(self._target, 0, x, y, GL_LUMINANCE, GL_FLOAT, data)

我知道因为我使用的是亮度,所以数据作为浮点数固定在 0 到 1 之间(这就是我对其进行归一化的原因),并且在 GLSL 中作为 vec4(L,L,大号,1)。但是实际用于存储该浮点数的数据类型是什么?它是否存储为单个 32 位浮点数,然后使其看起来像 GLSL 中的 vec4?

我问是因为如果我要切换到 GL_R32F 或类似的东西,我的纹理会占用与亮度相同的显存量吗?有什么方法可以不将亮度数据从 0 钳位到 1。除了添加 alpha 来执行 "fill" 值之外,还有其他常用方法吗(表示不应渲染纹素的值,如 NaN 或 -9999.0或其他)?

感谢您的帮助。我正在使用包装 pyopengl 的 vispy python 包。

有趣的是,自从我最初问这个问题后,我并没有成为 vispy 库的维护者。这是我自己的问题的答案,只是为了解决这个问题。很多答案都来自这里,最初是在评论中回答的:

https://www.khronos.org/opengl/wiki/Image_Format

在纹理中,您可以指定一个类型,它是规范化的无符号或有符号整数、浮点数或有符号或无符号整数(未规范化)。规范化类型将获取您提供给它们的任何数据,并根据该数据的数据类型将它们规范化为 0-1。因此,如果你给它 uint8 数据,它会除以 255。如果你给它 uint16,它会除以 65535。无论类型如何,你都会在着色器中看到 0-1 浮点数。其他 non-normalized 类型(浮点数、sign/unsigned non-normalized 整数)将在其原始范围内。