Three.js / WebGL - 透明平面隐藏在它们后面的其他平面

IT技术 javascript three.js webgl depth zbuffer
2021-02-19 09:45:23

当你在 Three.js/WebGL 中有两个平面并且其中一个或两个都是透明的时,有时后面的平面会被上面的透明平面隐藏。为什么是这样?

6个回答

假设您正在使用一些透明的 *.png 图像。那么这会有所帮助:

new THREE.MeshBasicMaterial( { side:THREE.BackSide,map:texture, depthWrite: false, depthTest: false });
您可能想要使用 THREE.DoubleSide 以便从两侧都可以看到它。
2021-04-22 09:45:23
出于某种原因,这side: THREE.BackSide部分阻止了我的图像全部渲染。但除此之外,其余的都很棒!
2021-04-27 09:45:23
它适用于我的情况,但有什么影响?现在什么情况下将开始不起作用?
2021-05-13 09:45:23

设置depthWrite属性来false解决我的问题。

new THREE.MeshBasicMaterial({ 
    opacity: 0.25, 
    transparent: true, 
    side: THREE.DoubleSide, 
    depthWrite: false
});
谢谢。不再有“透明黑匣子问题”!
2021-04-26 09:45:23

尝试添加alphaTest: 0.5到材料中。

注意:alphaTest是一个阈值,它将使纹理中的半透明区域完全不透明(当像素不透明度> 阈值时)或完全透明(当像素不透明度< 阈值时)。这可能会导致丑陋的边缘。
2021-05-06 09:45:23
试过了,没有用:/我想这是一个 webgl 问题,所以我必须重新设计我的游戏如何显示飞机。虽然它看起来有点被黑了。
2021-05-07 09:45:23
我有一个基于画布的纹理映射到它显示文本的平面。在某些角度/位置,我遇到了纹理材料透明度的问题,这修复了它,谢谢!
2021-05-11 09:45:23

这不是错误,它只是 OpenGL(以及 WebGL)的工作方式。透明表面不能很好地与 z 缓冲区配合使用,因此必须手动排序并从后到前渲染。三个 JS 正在尝试为您执行此操作(这就是为什么当您设置 X 值 > 0 时问题消失的原因),但无法像您展示的那样稳健地处理相交几何的情况。

我已经在不同的 SO question 中更深入地解释了这个问题,所以你可能想参考它。

谢谢你的回答,但你告诉我最好重新设计我的游戏还是一个解决方案可追寻的黑客 Three.JS?
2021-04-18 09:45:23
@Toji 你提到的问题并不是在处理完全相同的问题。在另一个问题中,只有对象/纹理的一部分是透明的,在这个问题中,整个平面都是透明的,这很容易通过简单地禁用depthWrite透明平面整体来解决。
2021-05-06 09:45:23

fwiw,如果你有很多平行平面(看不到你的样本,谷歌无法解析你的域),很容易让它们沿着垂直轴排序。对于飞机列表 [ABCD],抽签顺序将是 [ABCD] 或 [DCBA],仅此而已!因此,排序不需要对性能造成影响。走的时候把它们整理好。

您的问题与人们的行为有关,我无法回答 :) 但是,如果您的多边形相互交叉,那么除了 K-Buffers 或原始 A-Buffer 算法等每个片段的解决方案之外,没有简单的正确解决方案,除非您专门监管三角形交叉点并动态细分它们。
2021-05-06 09:45:23
问题是我有一些飞机应该与其他飞机交叉。就像它们是 3d 平剑一样。我可以问一下,在提出这个问题这么长时间之后,您是如何找到这个问题的,并且 4 个支持者是如何来到这里的?
2021-05-07 09:45:23