Javascript 透明面跳跃?

Javascript 透明面跳跃?,javascript,webgl,three.js,Javascript,Webgl,Three.js,我一直在做一个WebGL项目,它运行在Three.js库之上。我正在渲染几个半透明网格,我注意到,根据倾斜摄影机的角度,不同的对象位于顶部 为了说明这个问题,我用三个半透明的立方体做了一个快速演示。当您将图像旋转过垂直于屏幕的方向时,最小立方体的后半部分“跳跃”,不再可见。然而,它不应该仍然可见吗?我试着调整一些混合方程式,但似乎没有什么不同 我想知道的是这是否是WebGL/Three中的一个bug,或者是我可以修复的东西。任何洞察都将不胜感激:)好吧,这是他们发明所有硬件加速图形业务时无法解决

我一直在做一个WebGL项目,它运行在Three.js库之上。我正在渲染几个半透明网格,我注意到,根据倾斜摄影机的角度,不同的对象位于顶部

为了说明这个问题,我用三个半透明的立方体做了一个快速演示。当您将图像旋转过垂直于屏幕的方向时,最小立方体的后半部分“跳跃”,不再可见。然而,它不应该仍然可见吗?我试着调整一些混合方程式,但似乎没有什么不同


我想知道的是这是否是WebGL/Three中的一个bug,或者是我可以修复的东西。任何洞察都将不胜感激:)

好吧,这是他们发明所有硬件加速图形业务时无法解决的问题,听起来我们将不得不处理这一问题很长一段时间

这里的问题是,图形卡不会对多边形或对象进行排序。图形卡是“哑”的,你告诉它画一个对象,它会画出代表它的像素,在另一个称为zbuffer(或depthbuffer)的不可见“图像”中,它会画出代表对象的像素,但不是颜色,它会画出每个像素到相机的距离。之后绘制的任何其他对象,图形卡将检查每个像素到相机的距离,如果距离更远,则不会绘制(除非禁用该检查)

这大大加快了速度,并为实体对象之间提供了良好的交点。但它不能很好地发挥透明度。假设您有两个透明对象,并且希望A在B后面绘制。您需要告诉图形卡先绘制A,然后绘制B。只要它们不相交,这就可以了。为了绘制两个相交的透明对象,图形必须对所有多边形进行排序,因为图形卡不这样做,所以您必须这样做

这是其中一件你需要了解的事情,并针对你的情况进行特别调整


在three.js中,如果设置
material.transparent=true
,我们将对该对象进行排序,使其在前面的其他对象之前绘制。但是,如果您想将它们相交,我们无法真正帮助您。

看起来嵌套模型是通过深度测试筛选出来的。在绘制任何透明模型之前,尝试调用
gl.disable(gl.DEPTH\u TEST)
,如果它跳转或不跳转的话。+1作为解释。我修改了WestLangley现有的JSFIDLE,向感兴趣的人演示了这个问题: