我一直在开发一个在 Three.js 库之上运行的 WebGL 项目。我正在渲染几个半透明网格,我注意到根据倾斜相机的角度,顶部会出现不同的对象。
为了说明这个问题,我使用三个半透明立方体做了一个快速演示。当您将图像旋转到垂直于屏幕的方向时,最小立方体的后半部分会“跳跃”并且不再可见。不过,应该还是看得见的吧?我尝试调整一些混合方程,但这似乎没有什么区别。
我想知道这是否是 WebGL/3 中的错误,或者我可以修复的问题。任何见解将不胜感激:)
好吧,当他们发明所有这些硬件加速图形业务时,这是他们无法解决的问题,听起来我们将不得不在很长一段时间内处理这个问题。
这里的问题是显卡不会对多边形或对象进行排序。显卡是“哑”的,你告诉它绘制一个对象,它会绘制代表该对象的像素,并且在另一个称为 zbuffer(或深度缓冲区)的不可见“图像”中,将绘制代表该对象的像素但它不是绘制颜色,而是绘制每个像素到相机的距离。之后您绘制的任何其他对象,显卡都会检查每个像素到相机的距离,如果距离较远,则不会绘制它(除非您禁用该检查)。
这大大加快了速度,并为您提供了实体对象之间良好的交叉点。但它在透明度方面表现不佳。假设您有 2 个透明对象,并且希望将 A 绘制在 B 后面。您需要告诉显卡先绘制 A,然后再绘制 B。只要它们不相交,这种方法就可以正常工作。为了绘制两个相交的透明对象,图形必须对所有多边形进行排序,并且由于显卡不这样做,所以你必须这样做。
这是您需要了解并针对您的情况进行专门调整的事情之一。
在 Three.js 中,如果设置material.transparent = true
我们将对该对象进行排序,以便它在前面的其他对象之前(更早)绘制。但如果您想将它们相交,我们无法真正帮助您。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)