当前位置:首页 > 编程笔记 > 正文
已解决

【mapboxgl源码解析】深度测试问题

来自网友在路上 175875提问 提问时间:2023-11-08 22:21:45阅读次数: 75

最佳答案 问答题库758位专家为你答疑解惑

mapbox所有图层深度测试

globeAtmosphere(不写深度) new DepthMode(gl.LEQUAL, DepthMode.ReadOnly, [0, 1]);
circle(不写深度) painter.depthModeForSublayer(0, DepthMode.ReadOnly);
line(不写深度) painter.depthModeForSublayer(0, DepthMode.ReadOnly);
symbol(不写深度) painter.depthModeForSublayer(0, DepthMode.ReadOnly);
background (默认也是写深度的) painter.depthModeForSublayer(0, pass === ‘opaque’ ? DepthMode.ReadWrite : DepthMode.ReadOnly);
fill painter.depthModeForSublayer(1, painter.renderPass === ‘opaque’ ? DepthMode.ReadWrite : DepthMode.ReadOnly);、
raster(默认也是写深度的) painter.depthModeForSublayer(coord.overscaledZ - minTileZ,layer.paint.get(‘raster-opacity’) === 1 ? DepthMode.ReadWrite : DepthMode.ReadOnly, gl.LESS);
fillExtrusion new DepthMode(gl.LEQUAL, DepthMode.ReadWrite, painter.depthRangeFor3D);
globeRaster new DepthMode(gl.LEQUAL, DepthMode.ReadWrite, painter.depthRangeFor3D);

painter.depthModeForSublayer方法解析

    depthModeForSublayer(n: number, mask: DepthMaskType, func: ?DepthFuncType): $ReadOnly<DepthMode> {if (!this.opaquePassEnabledForLayer()) return DepthMode.disabled;const depth = 1 - ((1 + this.currentLayer) * this.numSublayers + n) * this.depthEpsilon;return new DepthMode(func || this.context.gl.LEQUAL, mask, [depth, depth]);}

先了解下gl.depthRange,该函数接受两个参数,分别表示深度值的最小和最大范围。通常情况下,这些值默认为0.0和1.0,就是会将计算后的深度值映射到0-1
这里可以看到gl.depthRange(depth, depth),far和near相同,注意:[这将导致深度缓冲区的所有深度值都将被截断到depth,这可能会导致渲染效果的一些问题,因为深度测试和深度缓冲区的比较将不再有效]
但是这里为什么要这么做呢?主要是为了手动写入该图层的深度值,值大小=depth,后续图层遮挡关系就由depth来决定啦

还有注意下这里的n是干啥的没看懂

painter.depthRangeFor3D解析

[0, 1 - ((style.order.length + 2) * this.numSublayers * this.depthEpsilon)]; // 算出来如0.99957275390625

这个是3D图层如fillExtrusion和globeRaster来用的,目前看3D图层的depth算法算出的肯定会小于其他图层的

查看全文

99%的人还看了

猜你感兴趣

版权申明

本文"【mapboxgl源码解析】深度测试问题":http://eshow365.cn/6-35614-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!