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

jfi*_*isk 5 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

Jam*_*oag 5

好的,请查看 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] 的统一值。

其余设置如示例所示。将飞机/相机倾斜到所需的设置,如果main pass您真的不想在场景中绘制立方体/花瓶/任何东西,请跳过绘制它(第279行)。(但是,请记下shadow pass并将其保留在那里)。