当您在Three.js/WebGL中有两个平面并且其中一个或两个透明时,有时后面的平面将被上面的透明平面隐藏。为什么是这样?Three.js/WebGL - 透明平面隐藏在它们后面的其他平面
回答
这不是一个错误,它只是OpenGL(以及WebGL)的工作原理。透明表面在Z缓冲区中播放不好,因此必须手动排序并将其渲染为背对背。三个JS试图为你做这件事(这就是为什么当你设置X值> 0时问题消失的原因),但不能稳健地处理像你显示的相交几何的情况。
我已经在different SO question中更深入地解释了该问题,因此您可能需要引用该问题。
尝试将alphaTest: 0.5
添加到材质。
已经尝试过,没有工作:/我想这是一个webgl问题,所以我必须重新设计我的游戏如何显示飞机。它会看起来有点黑客。 – MaiaVictor
我有一架基于画布的纹理映射到它显示文本的飞机。在某些角度/位置,我遇到了纹理材质透明度的问题,并修复了这个问题,非常感谢! – plyawn
注意:'alphaTest'是一个阈值,它会使纹理中的半透明区域完全不透明(当像素不透明度>阈值时)或完全透明(当像素不透明度<阈值时)。这可能会导致丑陋的边缘。 – Blaise
fwiw,如果您有很多平行平面(无法看到您的示例,Google无法解析您的域),很容易将它们沿垂直轴排序。对于飞机列表[A B C D],抽签顺序将是[A B C D]或[D C B A],而不是其他任何东西!所以排序时不会有性能问题。随时随地保持秩序。
问题是我有一些飞机应该穿过其他飞机。就好像他们是3d扁刀。我可以问一下,在问了这么长时间之后,你是如何发现这个问题的,以及4位upvoter是如何来到这里的? – MaiaVictor
您的问题与人们的行为无法回答:)但是,如果您的多边形相互交叉,除了像K-Buffers或原始的A-Buffer算法这样的片段外,没有简单的正确解决方案,除非特别警察三角形交叉点并在飞行中对它们进行镶嵌。 – bjorke
的depthWrite
属性设置为false
解决了我的问题。
new THREE.MeshBasicMaterial({
opacity: 0.25,
transparent: true,
side: THREE.DoubleSide,
depthWrite: false
});
谢谢。没有更多的“透明黑盒问题”! – Andy
- 1. wx.ComboBox隐藏在其他面板后面
- 2. 其他页面的半透明页面
- 3. 在透明页眉后面隐藏页面内容
- 4. 使UIView隐藏在透明UIView后面隐藏
- 5. 多个平面的透明度
- 6. 隐藏第二行透明面?
- 7. 照明平面(openGL)
- 8. Jackson/Jersey隐藏动态子平面
- 9. 如果鼠标在浏览器外面,Three.js平面被隐藏
- 10. 隐藏其他页面的按钮
- 11. 隐藏透明元素后面的满溢内容
- 12. 隐藏透明DIV后面的元素,但不包括背景
- 13. 一些面是透明的,其它是不透明
- 14. 自动完成列表隐藏在其他控件的后面
- 15. Highcharts工具提示隐藏在其他图表的后面
- 16. 隐藏在其他Flash元素后面的Flash fancybox弹出框
- 17. ModalPopupExtender隐藏在IFrame后面
- 18. VBS InputBox隐藏在其他窗口后面
- 19. CSS - 防止弹出隐藏在其他元素后面
- 20. CSS:菜单隐藏在其他父菜单后面
- 21. 我们可以在SceneKit中的透明平面上渲染阴影吗
- 22. 粘滞菜单 - 隐藏某些页面,但不隐藏其他页面
- 23. 如何在three.js中创建平面中的透明孔
- 24. GestureOverlayView隐藏其子/隐藏在父项后面
- 25. 将矢量映射到平面上并获得它与其他平面交叉点之间的角度
- 26. 非平面图平面化算法
- 27. RGB到YUV420平面和半平面?
- 28. 透明面板
- 29. 平局圈与透明度在图形页面
- 30. 如何在Java 3D中绘制透明平面?
感谢您的回答,但是您告诉我最好只是重新设计我的游戏,或者是一个解决方案,可追踪黑客Three.JS? – MaiaVictor
@Toji您提到的问题并不涉及完全相同的问题。在另一个问题中,只有部分对象/纹理是透明的,在这个问题中,整个平面是透明的,并且通过简单地为透明平面完全禁用'depthWrite',这很容易解决。 – Wilt