环境:WebGL,Chrome。使用透明png作为模型的纹理时,我有以下行为:
答案 0 :(得分:30)
您遇到深度缓冲问题,它与着色器或混合模式无关。
正在发生的事情是,渲染透明几何体的顺序会影响您在其后面渲染的能力。这是因为深度缓冲区没有透明或不透明的概念。因此,即使它们在视觉上没有对场景做出贡献,这些透明像素仍会将自己写入深度缓冲区,之后,您在其后面绘制的任何像素都将被丢弃,因为它们“不可见”。但是,如果您首先在透明对象后面绘制几何图形,它将正确显示,因为它会在透明深度放置到位之前写入框架中以丢弃它。
这甚至是大型商业游戏引擎在某种程度上仍然存在的问题,所以不要因为它而感到不舒服而导致一些混乱。 :)
这个问题没有“完美的解决方案”,但它真正归结为尝试如此构建你的场景:
只需标记透明的几何体位并在其他所有内容之后渲染它们,您将解决此问题的90%,但问题可能仍然存在于重叠的透明对象。这对你来说可能不是问题,取决于你的场景,但是如果它仍然造成了文物,你需要在绘制之前按深度对透明对象进行排序。
答案 1 :(得分:4)
答案 2 :(得分:0)
我是webgl的新手,并且总体上使用图形。但是也许theoricall在每个实例处调用drawElements两次或两次以上也可以解决问题? 还有一篇关于字体几乎相同问题的文章,作者解决了它,只需设置参数 {alpha:false} 对我来说,这没有任何意义,但是它有效。