webgl – getShaderPrecisionFormat返回值

我对方法getShaderPrecisionFormat,它用于什么以及它告诉我的内容感到困惑,因为对我来说它总是为所有参数返回完全相同的精度,只有INT / FLOAT之间的差异.

要清楚:

使用gl.FRAGMENT_SHADER和gl.VERTEX_SHADER与gl.LOW_FLOAT,gl.MEDIUM_FLOAT和gl.HIGH_FLOAT组合调用总是返回

WebGLShaderPrecisionFormat { precision: 23, rangeMax: 127, rangeMin: 127 }

使用gl.FRAGMENT_SHADER和gl.VERTEX_SHADER与gl.LOW_INT,gl.MEDIUM_INT和gl.HIGH_INT组合调用总是返回

WebGLShaderPrecisionFormat  { precision: 0, rangeMax: 24, rangeMin: 24 }

我也尝试提供两个额外的参数“range”和“precision”,但无法得到任何不同的结果.我假设我犯了一个错误,但从docs我无法弄清楚我自己如何正确使用它.

最佳答案 看起来你正确使用这些电话.

如果您在台式机/笔记本电脑上运行,结果就不足为奇了.我希望WebGL能够在这些系统上的完整OpenGL实现之上进行分层.即使这些系统支持ES 2.0(大部分与WebGL功能级别匹配),也很可能只是一个简化的API,最终使用与完整OpenGL实现相同的底层驱动程序/ GPU功能.

完整的OpenGL并不真正支持精度.它确实有GLSL中的关键字,但这只是源代码与OpenGL ES的兼容性.用GLSL 4.50规范来说:

Precision qualifiers are added for code portability with OpenGL ES, not for functionality. They have the same syntax as in OpenGL ES, as described below, but they have no semantic meaning, which includes no effect on the precision used to store or operate on variables.

然后继续定义IEEE 32位浮点数的使用,它具有您从调用中看到的23位精度.

如果您在移动设备上尝试相同的操作(如手机或平板电脑),则很可能会得到不同的结果.许多移动GPU支持16位浮点数(又名“半浮点数”),并利用它们.它们中的一些可以比浮子更快地在半浮点上操作,并且即使操作本身不是更快,减少的存储器使用和带宽也是有益的.减少内存/带宽使用对移动设备至关重要,可提高性能和功效.

点赞