在scenekit中的透明地板/飞机上显示阴影

时间:2017-05-14 00:58:50

标签: opengl-es-2.0 scenekit metal

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

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

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

以下是影子捕手的示例:https://knowledge.autodesk.com/search-result/caas/sfdcarticles/sfdcarticles/Maya-2015-Shadow-Catching-with-Use-Background-material.html

1 个答案:

答案 0 :(得分:4)

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

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

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

你要做的是为第69行写入(0,0,0,shadow_opacity),为第67行写入(0,0,0,0)。这应该发出透明像素。将shadow_opacity设置为[0.0..1.0]的制服。

其余设置显示在example中。将飞机/摄像机倾斜到所需的设置,如果您不想在场景中(279行),请跳过main pass中的立方体/花瓶/任何内容。 (但请注意shadow pass并将其保留在那里。)