我已经建立了一个最小的SceneKit项目,其中的场景包含一个球体,一个平面和一个定向光。
定向光会投射阴影并将其shadowMode
设置为deferred
。一切正常。场景被照亮了,球体在平面上投射了阴影。
当我设置一个最小的颜色叠加层SCNTechnique
并将其分配给SCNView
的{{1}}属性时,控制台将显示以下消息:
technique
但是,该技术有效并且渲染了颜色叠加层和阴影:
当我在Shader Debugger中捕获帧时,一切似乎都很好:
“调试导航器”中也没有明显的内容
我明显缺少什么吗?外观上一切正常,但我想知道是否错过了关键步骤以防止发生此错误。
PS我知道使用着色器修改器可以达到相同的结果,但是我想使用SCNTechnique来创建后处理效果。
以下是重要部分的快速概述。如果您想运行该示例,则可以克隆GitHub存储库。
这是[SceneKit] Error: Pass DeferredShadow is not linked to the rendering graph and will be ignored check it's input/output
和方向性SCNView
的设置方式:
SCNLight
该技术有两次通过。一种是在其view.allowsCameraControl = true
view.showsStatistics = true
view.backgroundColor = UIColor.black
let dirLight = SCNLight()
dirLight.type = .directional
dirLight.castsShadow = true
dirLight.shadowMode = .deferred
dirLight.shadowColor = UIColor.black.withAlphaComponent(0.75)
let dirLightNode = SCNNode()
dirLightNode.light = dirLight
dirLightNode.eulerAngles = SCNVector3(-Float.pi / 2, 0, 0)
设置为categoryBitmask
的对象上绘制颜色叠加层,另一种将整个场景绘制到颜色渲染目标上。这是该技术的2
文件:
.plist
使用的金属着色器:
<dict>
<key>passes</key>
<dict>
<key>pass_draw_overlay</key>
<dict>
<key>draw</key>
<string>DRAW_SCENE</string>
<key>program</key>
<string></string>
<key>metalVertexShader</key>
<string>colour_overlay_vertex</string>
<key>metalFragmentShader</key>
<string>colour_overlay_fragment</string>
<key>includeCategoryMask</key>
<string>2</string>
<key>inputs</key>
<dict>
<key>colorSampler</key>
<string>COLOR</string>
</dict>
<key>outputs</key>
<dict>
<key>color</key>
<string>OVERLAY</string>
</dict>
</dict>
<key>pass_combine</key>
<dict>
<key>colorStates</key>
<dict>
<key>clear</key>
<false/>
</dict>
<key>inputs</key>
<dict>
<key>colorSampler</key>
<string>COLOR</string>
<key>overlaySampler</key>
<string>OVERLAY</string>
</dict>
<key>outputs</key>
<dict>
<key>color</key>
<string>COLOR</string>
</dict>
<key>metalFragmentShader</key>
<string>combine_fragment</string>
<key>metalVertexShader</key>
<string>combine_vertex</string>
<key>program</key>
<string></string>
<key>draw</key>
<string>DRAW_QUAD</string>
</dict>
</dict>
<key>sequence</key>
<array>
<string>pass_draw_overlay</string>
<string>pass_combine</string>
</array>
<key>targets</key>
<dict>
<key>OVERLAY</key>
<dict>
<key>type</key>
<string>color</string>
</dict>
</dict>
</dict>