设置 gl.depthFunc(gl.ALWAYS) 的副作用

Side effects of setting gl.depthFunc(gl.ALWAYS)

正在编写 web gl 3D 地图应用程序。在大范围缩小时,我体验到不可避免的 z-fighting。对于近距离缩放,在 Chrome/Firefox 上很少出现 z-fighting,但在 Edge / Safari 上或多或少总是存在。

发现将 depthFunc 更改为 gl.ALWAYS 可以消除 Edge 上的问题(尚未在 Safari 上测试)。 https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/depthFunc

根据我的测试经验,depthFunc 参数可以产生巨大的影响,据我所知,depthFunc 参数是一种权衡。如此担心奇怪的副作用。设置为 gl.ALWAYS,会产生什么不良影响?

你这样做实际上是在禁用深度测试,你也可以调用 gl.disable(gl.DEPTH_TEST)(同时通过在上下文创建期间传递 depth: false 来创建没有深度缓冲区的上下文)。 =12=]

通过禁用深度测试,您的渲染将变得依赖于顺序, 所以不管你最后画什么,都会在它之前渲染的所有东西之上,不管它的投影是什么。这同样适用于网格中的单个三角形,如果您具有非凸几何体或禁用背面剔除,这将成为一个问题。正如评论中已经指出的那样,另一个警告是 每个 片段都会被完全处理,无论它是否会被遮挡。

我建议研究其他方法来缓解 z-fighting,从优化视图体积到使用多边形偏移到替代 z-buffer 编码,有多种方法可供选择。