SceneKit:是否可以在透明对象上投射阴影?

时间:2015-06-22 08:52:08

标签: macos shadow scenekit

我试图在OSX上的SceneKit中的一个完全透明的平面上投射阴影。我几个小时以来一直在努力解决这个问题而且没有任何解决方案。

我的目的是生成一个透明背景的几个对象的屏幕截图,以及隐形平面上的阴影。

你对我如何用苹果SceneKit制作这个有什么建议吗?

我是否必须编写自己的着色器,我可以使用着色器修改器进行此操作还是可以使用内置函数?

3 个答案:

答案 0 :(得分:9)

<强>更新

我为需要的人找到了另一种解决方案:

  1. 在3D模型下创建一个白色平面,请注意平面的颜色必须是纯白色。
  2. 将飞机物料的混合模式设为SCNBlendModeMultiply
  3. 将飞机物料的灯光模型设置为SCNLightingModelLambert
  4. 这是有效的,因为任何颜色乘以白色(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

答案 1 :(得分: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)

答案 2 :(得分:1)

我对你的问题没有答案,但我有一个解决方法:

  1. 渲染场景并将图像保留在内存中
  2. 将对象中的所有素材更改为纯黑色,无镜面
  3. 将飞机和天空变为全白色材质,点亮为白色
  4. 将场景渲染到另一个图像
  5. 在第二张图片上,应用CIColorInvertCIMaskToAlpha核心图像过滤器
  6. 使用Core Image将Alpha Mask应用于第一个渲染。
  7. 您将获得具有正确Alpha通道和透明阴影的图像。您需要调整材料和灯光以获得所需的结果。

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