opengl - OpenGL 纹理中的 NAN

标签 opengl glsl nan

我在桌面应用程序(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/

相关文章:

c++ - QGLWidget::renderText 边界框

opengl - 尝试构建 opengl super 示例代码时遇到麻烦

Python - 重新索引每月值

opengl - GLSL 150+ 中textureCube 的替代品?

c++ - sfml 中的着色器覆盖整个屏幕

javascript - if条件不影响div的显示

c - C中的 union 改变浮点加法的机器行为

c++ - OpenGL 中的故障面部变形目标动画 (C++)

c++ - OpenGL 半球纹理贴图

math - glsl中光的半向量是什么?