在Scenekit中透明的地板/平面上显示阴影

5

我想找出如何在不可见平面上渲染阴影,以便我的sceneView的背景显示出来。

THREE.js有一个ShadowMaterial可以实现这一点 - 只有阴影被渲染。

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

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


你使用的是哪种阴影?是阴影映射还是阴影体积?此外,你现在能否在sceneView上绘制3D对象? - James Poag
使用环境光和聚光灯的SNNodes实现动态阴影,不确定苹果在底层做了什么。我能够将UIView放置在我的SceneKit视图上方。 - jfisk
1个回答

5

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

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

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

您要做的是在第69行中写入(0,0,0,阴影不透明度),在第67行中写入(0,0,0,0)。这应该产生透明像素。将阴影不透明度设置为[0.0..1.0]的统一值。

其余设置显示在示例中。将平面/相机倾斜到所需的设置,如果您不真正想要它在场景中,则跳过在main pass中绘制立方体/花瓶/任何其他物品(第279行)。 (但请注意shadow pass并保留它)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接