在场景包中的透明地板/平面上显示阴影

Posted

技术标签:

【中文标题】在场景包中的透明地板/平面上显示阴影【英文标题】:Showing a shadow on a transparent floor/plane in scenekit 【发布时间】:2017-10-13 01:16:18 【问题描述】:

试图弄清楚如何在不可见的平面上渲染阴影,所以我的sceneView 的背景会显示出来。

THREE.js 有一个 ShadowMaterial 正是这样做的 - 只渲染阴影。

目前的想法是制作一个看起来很简单的自定义金属着色器,但我不确定如何敲掉地板以显示除阴影之外的所有内容。

这是一个影子捕捉器的示例:https://knowledge.autodesk.com/search-result/caas/sfdcarticles/sfdcarticles/Maya-2015-Shadow-Catching-with-Use-Background-material.html

【问题讨论】:

你用的是什么阴影?阴影映射,阴影体积?另外,您目前是否能够在您的sceneView 3d 对象上绘图? 动态阴影使用环境光和聚光灯SNNodes,不确定苹果在幕后做什么。我可以将UIViews 放在我的 SceneKit 视图上 【参考方案1】:

好的,在 Github 上查看这个示例项目:

https://github.com/carolight/Metal-Shadow-Map/blob/master/Shadows/Shader.metal#L67

该链接指向执行阴影贴图测试的着色器。基本上,它标准化正在渲染的片段的 Z 位置,并将其与阴影贴图的 Z-Buffer 进行比较。如果它小于阴影-Z,则像素被完全点亮(第 67 行),否则它会略微着色(第 69 行)。

您想要做的是在第 69 行写入 (0,0,0, shadow_opacity),在第 67 行写入 (0,0,0,0)。这应该会发出透明像素。将 shadow_opacity 设置为 [0.0..1.0] 的统一。

其余设置显示在example 中。将平面/相机倾斜到所需的设置,如果您真的不希望在场景中绘制立方体/花瓶/main pass 中的任何内容(279 行)。 (但是,请注意shadow pass 并保留在那里)。

【讨论】:

以上是关于在场景包中的透明地板/平面上显示阴影的主要内容,如果未能解决你的问题,请参考以下文章

场景视图控制栏

不透明度和文本阴影的奇怪行为

UITableView 中的阴影不一致

osg利用矩阵投影在平面上产生阴影

Flutter:如何为透明容器添加阴影?

Android中的阴影透明背景[关闭]