为什么透明材质会造成遮挡?
Why do transparent materials result in occlusion?
我有一个 threejs 场景,其中有几个网格(平面)都具有透明材质。渲染器已打开透明度,您可以看出是这种情况,因为 <body>
具有蓝到黑的渐变样式。
<body style="background: linear-gradient(to bottom, #1e5799 0%,#000000 100%);">
下面是我创建平面几何的方法:
const geometry = new THREE.PlaneBufferGeometry( 15, 15, 1 );
然后旋转它们使它们相交。
请注意,在某些地方,它们是合成的,两种材质混合在一起,但在其他地方,一个平面的一部分遮挡了另一个平面的一部分。我的理解是,一个平面被认为是另一个平面的 "in front",这决定了它们的绘制顺序。但是,为什么一个透明的平面会遮挡另一个?。
也就是说,即使不可能以正确的顺序绘制相交平面,我仍然希望它们不正确合成, 但它们被遮挡了。
简短的回答是深度测试和 alpha 混合不能很好地协同工作。如果首先绘制的四边形更接近,则深度缓冲区将为整个四边形区域写入,而不管 alpha 值。之后绘制的粒子进一步无法通过深度测试,因此不会被绘制。
对此的部分解决方案通常是片段着色器中的 alpha 测试。 If (color.a < 0.01) {discard;}
或者禁用深度测试。
使用 material alphaTest
属性 删除这些工件。
在您的 material 上将 depthWrite 设置为 false:
material.depthWrite = false;
当您将其设置为 false 时,material 不再对深度缓冲区产生影响。对不起,我无法进一步解释,这只是个人经历。
Three.jsr73
我有一个 threejs 场景,其中有几个网格(平面)都具有透明材质。渲染器已打开透明度,您可以看出是这种情况,因为 <body>
具有蓝到黑的渐变样式。
<body style="background: linear-gradient(to bottom, #1e5799 0%,#000000 100%);">
下面是我创建平面几何的方法:
const geometry = new THREE.PlaneBufferGeometry( 15, 15, 1 );
然后旋转它们使它们相交。
请注意,在某些地方,它们是合成的,两种材质混合在一起,但在其他地方,一个平面的一部分遮挡了另一个平面的一部分。我的理解是,一个平面被认为是另一个平面的 "in front",这决定了它们的绘制顺序。但是,为什么一个透明的平面会遮挡另一个?。
也就是说,即使不可能以正确的顺序绘制相交平面,我仍然希望它们不正确合成, 但它们被遮挡了。
简短的回答是深度测试和 alpha 混合不能很好地协同工作。如果首先绘制的四边形更接近,则深度缓冲区将为整个四边形区域写入,而不管 alpha 值。之后绘制的粒子进一步无法通过深度测试,因此不会被绘制。
对此的部分解决方案通常是片段着色器中的 alpha 测试。 If (color.a < 0.01) {discard;}
或者禁用深度测试。
使用 material alphaTest
属性 删除这些工件。
在您的 material 上将 depthWrite 设置为 false:
material.depthWrite = false;
当您将其设置为 false 时,material 不再对深度缓冲区产生影响。对不起,我无法进一步解释,这只是个人经历。
Three.jsr73