SceneKit SCNTechnique与延迟的阴影组合会引发错误

时间:2019-01-30 15:44:28

标签: ios swift scenekit metal

问题

我已经建立了一个最小的SceneKit项目,其中的场景包含一个球体,一个平面和一个定向光。 定向光会投射阴影并将其shadowMode设置为deferred。一切正常。场景被照亮了,球体在平面上投射了阴影。

当我设置一个最小的颜色叠加层SCNTechnique并将其分配给SCNView的{​​{1}}属性时,控制台将显示以下消息:

technique

但是,该技术有效并且渲染了颜色叠加层阴影:

The rendered scene

当我在Shader Debugger中捕获帧时,一切似乎都很好:

The rendering graph

“调试导航器”中也没有明显的内容

The debug navigator

问题

我明显缺少什么吗?外观上一切正常,但我想知道是否错过了关键步骤以防止发生此错误。

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>

0 个答案:

没有答案