我在桌面应用程序(Windows/Linux、GLSL 4.2)中使用包含 float 32 数据(GL_RGBA32F 格式)的 1D、2D 和 3D OpenGL 纹理。
这些纹理包含预先计算的物理数据的结果,并且可能包含一些预计算失败的 NAN 值(这在我的应用程序中是“正常”,某些情况无法计算,这种情况很少见,但“正常”)
我需要在着色器中检测这些值。
GLSL 采样器中处理 NAN 值是否有任何标准?
更具体地说:
确定写入纹理中的 NAN 值可以通过“textureXXX”GLSL 方法读取为 NAN 吗?
如果使用非 NEAREST 过滤调用“textureXXX”方法,并且其中一个插值是 NAN,我应该得到 NAN 值作为结果吗?
谢谢。
编辑:
正如答案所说,OpenGL 规范中对 NaN 支持没有任何要求。
所以我会:
将 NaN 值替换为“特殊”值,以防纹理中的 NaN 值在 GLSL 中未读取为 NaN
自己实现mipmapping
根据“特殊”值测试所有值
这是额外的工作,但似乎有必要确保在不同平台/不同硬件上支持我的无效值。
最佳答案
根据我对规范的解释,答案都是“否”。我为此找到的最确凿的证据位于最新 GLSL 规范的第 4.7.1 节“范围和精度”(例如 GLSL 4.20 规范的第 65 页):
Operations and built-in functions that operate on a NaN are not required to return a NaN as the result.
texture()
GLSL 调用是内置函数,因此我相信此规则适用于它们,并且您不能指望它们为包含 NaN 值的纹理返回 NaN。
关于opengl - OpenGL 纹理中的 NAN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33873795/