SceneKit:是否可以在透明对象上投射阴影?
我想在OSX上的SceneKit中完全透明的平面上投下阴影。自从几个小时以来,我一直在努力解决这个问题,并没有找到任何解决方案。SceneKit:是否可以在透明对象上投射阴影?
我的目的是生成一个透明背景的几个对象的屏幕截图,只是在一个不可见的平面上的阴影。
你对我有什么建议吗?我可以用苹果SceneKit做这个吗?
我是否必须编写自己的着色器,我可以使用shadermodifiers进行这项工作,还是可以使用内置的函数?
我没有回答你的问题,但是我有一个解决办法:
- 渲染场景,并保持在图像存储
- 改变所有的材料在你的对象为纯黑色,无镜面
- 平面和天空更改为全白材料,灯白色
- 渲染场景到另一个图像
- 在第二图像,应用
CIColorInvert
和CIMaskToAlpha
核心图像滤镜 - 使用核心图像将Alpha遮罩应用于第一个渲染。
您将得到一个带有正确Alpha通道和透明阴影的图像。您需要调整材料和灯光才能获得想要的结果。
阴影可能在边缘变得更亮,唯一的方法是将其渲染为另一个图像,并在“Mask to Alpha”步骤后将其填充为黑色。
UPDATE:
我找人替代解决方案谁需要:
- 下创建3D模型白色平面,注意飞机的颜色必须是纯白色。
- 将平面材质的混合模式设置为
SCNBlendModeMultiply
。 - 将飞机材质的轻型模型设置为
SCNLightingModelLambert
。
这是可行的,因为任何颜色乘白色(1,,1,1)返回自己而兰伯特光模型将不考虑定向光,所以飞机将永远是背景颜色,看起来像透明。这种解决方案的另一个好处是你不需要改变灯光的阴影渲染模式。
对于习惯Xcode检查员的人。
首先,在你的模型下添加一个平面。然后阻止它写入colorBuffer。 其次,将您的灯光模型的阴影渲染模式更改为延迟。请注意,您必须使用可投射阴影的灯光。
油性郭,你的解决方案的工作。这里的解决方案是在代码:
光源的配置:
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)
太棒了!你还应该确保你的飞机不能投射阴影。 – ooOlly
任何运气找到实际的办法做这个? – jfisk
你解决了吗? – ooOlly
有同样的问题,有人解决了吗? – larva