【问题标题】:SceneKit: Is it possible to cast an shadow on an Transparent Object?SceneKit:是否可以在透明对象上投射阴影?
【发布时间】:2015-09-07 15:40:52
【问题描述】:

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

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

你对我有什么建议可以用苹果 SceneKit 制作吗?

我是否必须编写自己的着色器,我可以使用着色器修改器来完成这项工作,还是可以使用内置功能?

【问题讨论】:

  • 运气好能找到实际的方法吗?
  • 你解决了吗?
  • 遇到同样的问题,有人解决了吗?
  • @Iarva,你可以查看我的新答案。
  • 请在给定的链接stackoverflow.com/questions/46661670/…查看我的答案

标签: macos shadow scenekit


【解决方案1】:

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

  1. 渲染场景并将图像保存在内存中
  2. 将对象中的所有材质更改为纯黑色,无镜面反射
  3. 将飞机和天空改为全白材质,灯光改为白色
  4. 将场景渲染到另一个图像
  5. 在第二张图片上,应用CIColorInvertCIMaskToAlpha Core Image 滤镜
  6. 使用 Core Image 将 Alpha Mask 应用到第一个渲染。

您将获得具有正确 Alpha 通道和透明阴影的图像。您将需要调整材质和灯光以获得所需的结果。

边缘的阴影可能会变亮,唯一的解决方法是将其渲染为另一张图像,并在 Mask to Alpha 步骤后用黑色填充。

【讨论】:

    【解决方案2】:

    更新:

    我为任何需要的人找到了替代解决方案:

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

    这是有效的,因为任何颜色乘白色 (1, ,1, 1) 返回自身并且朗伯光模型不会考虑定向光,因此平面将始终是看起来透明的背景颜色。此解决方案的另一个好处是您无需更改灯光的阴影渲染模式。

    对于曾经检查过 Xcode 的人来说。


    根据SceneKit: What's New.

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

    【讨论】:

    • 只有在sceneKit视图上设置了背景时才有效
    【解决方案3】:

    郭油,您的解决方案有效。这里的解决方案在代码中:

    光源配置:

    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)
    

    【讨论】:

    • 太棒了!您还应该确保您的飞机不会投射阴影。
    猜你喜欢
    • 2015-06-29
    • 2017-07-09
    • 2019-03-10
    • 2022-06-14
    • 2021-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多