当您在 Three.js / WebGL 中有两个平面并且其中一个或两个都是透明的时,有时后面的平面会被上面的透明平面隐藏。为什么是这样?
问问题
22799 次
7 回答
24
假设您正在使用一些透明的 *.png 图像。那么这会有所帮助:
new THREE.MeshBasicMaterial( { side:THREE.BackSide,map:texture, depthWrite: false, depthTest: false });
于 2012-12-06T10:21:16.133 回答
22
设置depthWrite
属性来false
解决我的问题。
new THREE.MeshBasicMaterial({
opacity: 0.25,
transparent: true,
side: THREE.DoubleSide,
depthWrite: false
});
于 2016-01-14T09:11:34.580 回答
21
尝试添加alphaTest: 0.5
到材料中。
于 2012-06-23T13:24:43.857 回答
14
这不是一个错误,它只是 OpenGL(以及因此,WebGL)的工作方式。透明表面不能很好地与 z 缓冲区配合使用,因此必须手动排序并从后到前渲染。三个 JS 正在尝试为您执行此操作(这就是为什么当您设置 X 值 > 0 时问题消失的原因)但无法像您展示的那样可靠地处理相交几何体的情况。
我已经在另一个 SO question中更深入地解释了这个问题,所以你可能想参考一下。
于 2012-06-22T23:27:32.670 回答
6
fwiw,如果你有很多平行平面(看不到你的样本,谷歌无法解析你的域),很容易让它们沿着垂直轴排序。对于飞机列表 [ABCD],抽签顺序将是 [ABCD] 或 [DCBA],仅此而已!因此,排序不需要对性能造成影响。只要在你去的时候保持它们的顺序。
于 2012-10-25T15:01:33.287 回答
1
设置MeshrenderOrder
来解决我的问题,下面是我的代码,你可以修改 node.renderOrder
值:
loader.load(model_url, (gltf)=>{
let scene = gltf.scene
scene.traverse((node)=>{
if(node.isMesh){
node.material.transparent = true
if(node.name === 'car_windows'){
node.material.opacity = 0.4
node.material.side = 0
node.renderOrder = 110
}
if(node.name === 'car_body'){
node.material.opacity = 0.4
node.renderOrder = 100
}
if(node.name === 'car_seats'){
node.material.opacity = .5
node.renderOrder = 90
}
mesh_arr.push(node)
mesh_objs[node.name] = node
}
})
})
于 2019-08-09T07:18:03.463 回答
1
这对我有用,不要使用文字布尔值 true 尝试使用 1 。
object3d.material.transparent = 1;
于 2021-05-17T06:00:13.497 回答