【问题标题】:Cocos3D - background shown through meshesCocos3D - 通过网格显示的背景
【发布时间】:2014-12-18 00:33:46
【问题描述】:

我导入了从 Blender 创建的 .pod 文件,蓝色背景通过睫毛和眉毛网格显示。有谁知道我为什么会遇到这种情况?

没有额外的材料(除了头发的根部看起来很正常)。

她的左肩添加了新的绿色材料,眉毛和睫毛开始显示背景

【问题讨论】:

  • 如果你看的足够近,眉毛和睫毛还在。从技术上讲,它们是具有透明背景的 .png 文件,因此在其背后显示纹理背后的纹理是正确的。但在这种情况下,眉毛/睫毛后面的纹理是皮肤,而不是蓝色背景。
  • 很奇怪。如果您想创建一个显示此问题的 Xcode 项目的 ZIP,请将其放在 Dropbox 之类的地方,然后将 ZIP 文件的链接发送到 support@brenwill.com,我会看看它。
  • 顺便说一句...在实际设备上运行它时,您会得到相同的效果吗?模拟器通常会显示设备上未出现的工件。
  • 我尝试在 iPhone 5 上加载并观察到相同的行为。我已将 xCode 项目链接发送到上面的电子邮件。我真的很感谢你在这方面的帮助。非常感谢。

标签: blender cocos3d


【解决方案1】:

这个问题是由场景中节点的渲染顺序引起的。

在第一个模型中,首先绘制头发,然后是皮肤,然后是眉毛和睫毛。在第二个模型中,头发、眉毛和睫毛都画在皮肤之前。当头发或睫毛下的皮肤被绘制时,深度缓冲区表明已经绘制了更接近相机的东西,并且引擎不会费心渲染这些皮肤像素。但是因为睫毛、眉毛和头发都包含透明度,所以我们最终会透过它们直接看到背景。

深度缓冲区的这种设计使用是所有 3D 渲染的关键。这就是引擎如何知道不渲染被另一个对象视觉遮挡的像素的方式,否则我们所看到的只是要渲染的最后一个对象。但是,在渲染包含透明度的重叠对象时,获取渲染顺序很重要正确,以便更远的物体在更近的透明物体后面被首先渲染。

Cocos3D 中,有几个工具可供您订购透明对象以进行渲染:

  1. 第一个也是主要的工具是由CC3Scene 管理的drawingSequencer。您可以配置几种不同类型的绘图序列器。默认的序列器足够聪明,可以先渲染所有不透明的对象,然后按照与相机的距离递减顺序渲染包含透明度的对象(首先渲染更远的对象)。这对大多数场景最有效,尤其是在物体四处移动并且可以不可预测地在彼此前面移动的情况下。不幸的是,在您自定义的CC3Scene 初始化代码(您根据问题 cmets 发送给我)中,您将默认绘图排序器替换为不根据距离对透明对象进行排序的排序器。如果您删除该更改,则一切正常。

  2. 未明确按距离排序的对象(如上面的第 1 部分)按照它们添加到场景的顺序进行渲染。因此,您还可以通过确保将对象按照您希望它们渲染的顺序添加到场景中来定义渲染顺序。这适用于静态模型,例如您的第一个角色(如果您将其更改为在皮肤之后添加头发)。

  3. CC3Node 也有一个zOrder 属性,它允许您显式地覆盖呈现顺序,以便具有较大zOrder 值的对象在具有较小zOrder 值的对象之前呈现。当您有一个无法按渲染顺序添加组件的静态模型,或者临时覆盖可能在彼此前面经过的两个透明对象的渲染顺序时,这很有用。使用zOrder 属性确实依赖于使用drawingSequencer 来使用它(默认绘图序列器会这样做)。

  4. 最后,您可以在渲染特定节点时暂时关闭深度测试或遮罩,方法是将这些节点上的shouldDisableDepthTestshouldDisableDepthMask 属性设置为YES

【讨论】:

  • 感谢 Bill 提供的富有洞察力的解决方案。我还不太明白你上面的所有观点,因为我是 Cocos3D 的新手,需要更多时间才能完全理解你的解决方案。同时,我设法使用您上面的建议解决了这个问题。再次感谢您的帮助。
猜你喜欢
  • 2018-04-17
  • 1970-01-01
  • 1970-01-01
  • 2016-04-14
  • 2013-08-16
  • 1970-01-01
  • 1970-01-01
  • 2023-02-13
  • 1970-01-01
相关资源
最近更新 更多