2015-06-22 96 views
2

我想在OSX上的SceneKit中完全透明的平面上投下阴影。自从几个小时以来,我一直在努力解决这个问题,并没有找到任何解决方案。SceneKit:是否可以在透明对象上投射阴影?

我的目的是生成一个透明背景的几个对象的屏幕截图,只是在一个不可见的平面上的阴影。

你对我有什么建议吗?我可以用苹果SceneKit做这个吗?

我是否必须编写自己的着色器,我可以使用shadermodifiers进行这项工作,还是可以使用内置的函数?

+0

任何运气找到实际的办法做这个? – jfisk

+0

你解决了吗? – ooOlly

+0

有同样的问题,有人解决了吗? – larva

回答

1

我没有回答你的问题,但是我有一个解决办法:

  1. 渲染场景,并保持在图像存储
  2. 改变所有的材料在你的对象为纯黑色,无镜面
  3. 平面和天空更改为全白材料,灯白色
  4. 渲染场景到另一个图像
  5. 在第二图像,应用CIColorInvertCIMaskToAlpha核心图像滤镜
  6. 使用核心图像将Alpha遮罩应用于第一个渲染。

您将得到一个带有正确Alpha通道和透明阴影的图像。您需要调整材料和灯光才能获得想要的结果。

阴影可能在边缘变得更亮,唯一的方法是将其渲染为另一个图像,并在“Mask to Alpha”步骤后将其填充为黑色。

7

UPDATE:

我找人替代解决方案谁需要:

  1. 下创建3D模型白色平面,注意飞机的颜色必须是纯白色。
  2. 将平面材质的混合模式设置为SCNBlendModeMultiply
  3. 将飞机材质的轻型模型设置为SCNLightingModelLambert

这是可行的,因为任何颜色乘白色(1,,1,1)返回自己而兰伯特光模型将不考虑定向光,所以飞机将永远是背景颜色,看起来像透明。这种解决方案的另一个好处是你不需要改变灯光的阴影渲染模式。

对于习惯Xcode检查员的人。

enter image description here enter image description here


SceneKit: What's New

首先,在你的模型下添加一个平面。然后阻止它写入colorBuffer。 其次,将您的灯光模型的阴影渲染模式更改为延迟。请注意,您必须使用可投射阴影的灯光。 plane's material inspector

light's attributes inspector

+0

只有在sceneKit视图 – jfisk

+0

上有背景设置才能正常工作。谢谢! – Claus

+0

请分享一下代码 – Nassif

4

油性郭,你的解决方案的工作。这里的解决方案是在代码:

光源的配置:

light.shadowColor = UIColor(red: 0, green: 0, blue: 0, alpha: 0.4) 
light.shadowMode = .deferred 

而对于地板(即SCNFloor你的下面。):

material.diffuse.contents = UIColor.white 
material.colorBufferWriteMask = SCNColorMask(rawValue: 0) 
+1

太棒了!你还应该确保你的飞机不能投射阴影。 – ooOlly