为什么 pointsize 不默认为 webgl 中的标准值?

Why doesn't pointsize default to a standard value in webgl?

我一直在使用 Webgl 开发渲染引擎,我注意到 gl.POINTS 原语的行为不一致。在 Chrome 中的 mac 上,点按预期呈现并可见,尽管默认值非常小。当我 运行 我的 Windows 10 PC 上 Chrome 上的相同代码时,none 点默认可见。如果我在顶点着色器中明确设置点大小(例如“gl_PointSize = 1.0”),这些点就会变得可见,这表明在 Windows 上它们默认为一个非常小的值,小于我的mac.

这很烦人 - 它引入了跨浏览器的意外行为,并要求我在我的顶点着色器中进行调用,否则这将是不必要的,并且可能会增加执行开销。

我的问题 - 这是预期的行为,还是我发现了 Chrome 中的错误,如果是预期的 - 当我们旨在跨浏览器和设备标准化时,为什么这是默认行为?谢谢。

根据OpenGL ES documentation

If gl_PointSize is not written to, its value is undefined in subsequent pipeline stages

这意味着点的渲染需要显式写入这个变量,否则结果将是未定义的。

我认为在未指定时将此值定义为 0.0(您在 Windows 上看到的)可以被认为是一个不错的选择,因为 WebGL 倾向于避免“未定义”而支持“零” -定义”。 Chrome 在 macOS 上的行为在这种情况下可能会被误导,尽管显然 1.0 大小的绘图点可以被认为更有用,可以在屏幕上看到一些东西。

实际上,在各种图形 API 中存在一些与 gl_PointSize 相关的不一致。例如,GLSL 程序中的 gl_PointSizeOpenGL 桌面 实现中是 可选 并且将使用 glPointSize() 指定的点大小默认情况下,在初始 OpenGL 状态下又定义为 1.0。同时,OpenGL ES 2.0+(因此 WebGL)根本没有定义 glPointSize() 方法,并且 gl_PointSize 成为 GLSL 代码中的必需项,以避免未定义的行为。

所以我认为出现不同的行为是由于在 macOS / Windows 上使用不同的图形库(层)来实现 Chrome 中的 WebGL。但是由于 gl_PointSize 无论如何对于绘制点都是强制性的 - 没有必要调查哪种未定义的行为更好或更正确。