我正在创建一个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包。
答案 0 :(得分:0)
有趣的是,自从我最初问这个问题以来,我还没有成为vispy库的维护者。这是我自己的问题的答案,仅供参考。许多答案来自这里,最初是在评论中回答的:
https://www.khronos.org/opengl/wiki/Image_Format
在纹理中,您可以指定类型为标准化无符号或有符号整数,浮点数或有符号或无符号整数(未标准化)的类型。标准化类型将采用您提供的所有数据,并根据该数据的数据类型将其标准化为0-1。因此,如果给它提供uint8数据,它将除以255。如果给它提供uint16,数据将除以65535。不管哪种类型,您在着色器中都将看到0-1浮点数。其他非标准化类型(浮点型,有符号/无符号非标准化整数)将在其原始范围内。