0

我正在创建一个 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、L、1)提供给我。但是实际使用什么数据类型来存储该浮点数?它是否存储为单个 32 位浮点数,然后使其看起来像 GLSL 中的 vec4?

我问是因为如果我要切换到 GL_R32F 或类似的东西,我的纹理会占用与亮度相同数量的视频内存吗?有没有办法不将亮度数据从 0 钳位到 1。除了添加 alpha 来执行“填充”值(指示不应渲染纹素的值,如 NaN 或 -9999.0 之类的东西)之外,还有其他常见的方法吗)?

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

4

1 回答 1

0

有趣的是,自从我最初提出这个问题以来,我还没有成为 vispy 库的维护者。这是我自己的问题的答案,只是为了结束这个问题。很多答案都来自这里,最初是在评论中回答的:

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

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

于 2020-10-03T11:45:19.870 回答