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算法算出的肯定会小于其他图层的