透明度不一致,看起来像渲染订单问题

时间:2016-12-29 15:47:52

标签: three.js transparency

我正在使用r82。

我有一个有多种材质的网格。我可以很好地改变它们的不透明度,但它们是如何渲染的,我称之为“splotchy”。我一直在使用ThreeJs,并且 EDIT:能够以更加一致的方式使用相同模型获得过去版本(r67)中的透明度。所以我想知道是否有一些东西现在我需要设置我之前不需要设置或者我只是忽略了什么。在重新访问我的旧代码并再次测试它时,我发现它是相同的存在透明度问题。这只是一个问题,没有那么明显的“污点”(而且测试不够,我敢肯定)。这是截图。enter image description here

以下是我拍摄的一些照片,可以更好地突出问题。我的外墙为浅灰色,模型中的地板为深灰色,可以切换外墙以便可见或不可见。在这些照片中,我有一面紫色的外墙和一面墙的另一边的房间地板。

Outside wall purple face

Inside floor green face

根据相机的角度,即使相机与相机之间只有一个面,它也会使绿色地板的一部分看不见。 transparent green face partially invisible

材料都是双面的,在透明度开启之前没有任何迹象。我发现了一个类似的问题,建议更改mesh.setFaceCulling(或类似的东西),但这似乎来自旧版本,而不是在r82中。

提前感谢您的帮助!

修改  我开始研究旧版本的threeJS和当前版本的源代码,看看在透明度方面做了哪些不同的事情。我发现了透明对象,它是一个对象的数组(我相信面部),它们将被渲染并基于“reversePainterSortStable”进行排序。还有另一个对象列表(我相信材料对象,可能是?),它们使用“painterSortStable”调用opaqueObjects。因此,看看更改排序顺序是否会改变透明状态时的结果我改变了它,以便透明对象按“painterSortStable”进行排序,并确实改变了事情的显示方式(授予它以后不解决我的问题)它只是删除了一些问题点并创建了新的问题)。

所以简短的版本,看起来它是面孔的renderOrder的一个问题。

话虽这么说,我试着找到r67版本的代码如何处理面部的“renderOrder”,因为它不是(据我所知)可以在该版本中设置并自动完成的。但是我没有这么好的追踪它到底是如何完成的。

所以我看到两种可能性。 1)找出过去的版本如何正确地做透明度(至少为了我的目的)并更改当前版本中的逻辑以使用它。或者2)找到如何根据场景中的摄像机位置正确设置人脸的renderOrder。将首先考虑第二个选项,但认为将其记录给那些希望帮助回答或有类似问题的人是好的。

编辑2: 所以挖掘了三个J的源代码,并注意到我在上一个编辑中提到的transparentObjects数组。第一个,我不能为我的生活弄清楚它是如何填充的,因为它似乎不会被添加到代码中的任何地方。第二个是我认为它正在填充整个建筑物/网格的副本(见下面的截图)。

enter image description here

z索引似乎都是一样的。以及ids和对象都是“网格”类型(我看过的那些,被授予,因为有几千个)。所以我想弄清楚为什么它会添加添加到数组中的内容,但是当我偶然发现没有找到透明对象数组实际填充的代码的位置时。

编辑3:

WestLangley,我尝试将外墙材料的深度测试设置为假并得到了这个。就像我在回复评论中所说的那样,即使它确实有效,它也无法解决建筑物内部相机所遇到的问题,但也想跟进(请参阅下面的快照)。

enter image description here

0 个答案:

没有答案