Webgl getShaderPrecisionFormat返回值

Webgl getShaderPrecisionFormat返回值,webgl,opengl-es-2.0,Webgl,Opengl Es 2.0,我对getShaderPrecisionFormat方法、它的用途以及它告诉我的内容感到困惑,因为对我来说,它总是为所有参数返回完全相同的精度,只有INT/FLOAT之间的差异 要明确的是: 与gl.LOW\u FLOAT、gl.MEDIUM\u FLOAT和gl.HIGH\u FLOAT组合使用gl.FRAGMENT\u着色器和gl.VERTEX\u着色器的调用始终返回 WebGLShaderPrecisionFormat { precision: 23, rangeMax: 127, ran

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

要明确的是:

与gl.LOW\u FLOAT、gl.MEDIUM\u FLOAT和gl.HIGH\u FLOAT组合使用gl.FRAGMENT\u着色器和gl.VERTEX\u着色器的调用始终返回

WebGLShaderPrecisionFormat { precision: 23, rangeMax: 127, rangeMin: 127 }
WebGLShaderPrecisionFormat  { precision: 0, rangeMax: 24, rangeMin: 24 }
与gl.LOW_INT、gl.MEDIUM_INT和gl.HIGH_INT组合使用gl.FRAGMENT_着色器和gl.VERTEX_着色器的调用始终返回

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

我还尝试提供另外两个参数“范围”和“精度”,但无法得到任何不同的结果。我想我犯了一个错误,但是从我自己的角度来看,我无法正确地使用它。

看起来您正确地使用了这些调用

如果你在台式机/笔记本电脑上运行,结果并不令人惊讶。我希望WebGL能够在此类系统上的完整OpenGL实现之上分层。即使这些系统支持ES2.0,它主要与WebGL功能级别相匹配,也很可能只是一个简化的API,最终使用与完整OpenGL实现相同的底层驱动程序/GPU功能

完整的OpenGL并不真正支持精度。它在GLSL中有关键字,但这只是为了与OpenGLES的源代码兼容性。用GLSL 4.50规范的话来说:

添加精度限定符是为了OpenGL ES的代码可移植性,而不是功能性。它们的语法与OpenGL ES中的相同,如下所述,但它们没有语义含义,这对用于存储或操作变量的精度没有影响

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


如果你在手机或平板电脑等移动设备上尝试相同的东西,很可能会得到不同的结果。许多移动GPU支持16位浮点(也称为“半浮点”),并利用它们。它们中的一些在半浮点数上的运行速度比在浮点数上的运行速度快,而且即使操作本身并不快,减少内存使用和带宽也是有益的。减少内存/带宽的使用对于提高移动设备的性能和能效至关重要。

我看到了与您相同的行为。我认为这是因为我们的浏览器在低、中、高三个方面使用相同的精度。如果我转到下一页的测试
getShaderPrecisionFormat
,我会看到所有测试都通过了。所以我不认为有什么不对劲@安东:是的,我也在这一页上,也得出了同样的结论,但我想确保我没有遗漏什么,因为这是可疑的,也很容易成为我的错误。:)你在哪种硬件上运行这个?在移动设备上使用半浮点数(16位浮点数)相当常见。我不认为桌面GPU的精度通常低于32位。如果到目前为止您在台式机/笔记本电脑上进行了检查,请在典型的平板电脑或手机上运行,您可能会看到一些不同的东西。@RetoKoradi您是对的,我只在笔记本电脑上进行了测试。谢谢,我从来没有想过精度会有一个下限,但在谷歌上搜索之后,这似乎并不少见。我很乐意接受这个答案。