将 SCNTechnique 与金属着色器结合使用时写入深度目标不起作用

问题描述 投票:0回答:1

我有一个带有多个渲染通道设置的 SCNTechnique。在其中一个通道中,我对激光雷达相机的深度进行采样,并希望将其写入目标以在不同的渲染通道中使用。如果我写入颜色目标,效果很好。一旦我将目标更改为深度目标,目标就会充满 0,并且我所做的任何操作都不会影响它。这是我的片段着色器:

fragment float depth_fragment(depth_out_vertex_t vert [[stage_in]],
                              depth2d<float, access::sample> depthSampler [[texture(0)]])
{
    float depth = depthSampler.sample(s, vert.uv);
    return depth;
};

和我的 .plist 条目:

<key>draw_depth</key>
<dict>
    <key>draw</key>
    <string>DRAW_QUAD</string>
    <key>program</key>
    <string>doesntexist</string>
    <key>metalVertexShader</key>
    <string>depth_vertex</string>
    <key>metalFragmentShader</key>
    <string>depth_fragment</string>
    <key>inputs</key>
    <dict>
        <key>depthSampler</key>
        <string>depthSymbol</string>
    </dict>
    <key>outputs</key>
    <dict>
        <key>depth</key>
        <string>depth_scene</string>
    </dict>
</dict>
...
<key>targets</key>
<dict>
    <key>depth_scene</key>
    <dict>
        <key>type</key>
        <string>depth</string>
    </dict>
</dict>

我像这样访问它:

fragment half4 depth_fragment(out_vertex_t vert [[stage_in]],
                              depth2d<float, access::sample> cameraDepthSampler [[texture(0)]]) {
    float camDepth = cameraDepthSampler.sample(s, vert.uv);
    return half4(half3(camDepth), 1);
}

知道我可能做错了什么吗?我从来没有能够从片段着色器写入深度目标以任何形式工作。仅当我不使用金属着色器(仅绘制通道)时它才有效。如果您想知道,我将使用金属着色器渲染深度符号,以便在输入可用之前对输入执行一些必要的转换。 heightSymbol 来自激光雷达相机的原始深度图像。或者,是否有办法更改颜色目标以不将输出值限制在 0...1 范围内?这就是我在使用颜色目标时遇到的问题。

shader scenekit metal scntechnique
1个回答
0
投票

我能够按照此论坛帖子中的指南解决这个问题。关键见解:“输入”中的键需要与 Metal 中的变量名称匹配。

fragment half4 depth_fragment(out_vertex_t vert [[stage_in]], depth2d<float, access::sample> cameraDepthSampler [[texture(0)]]) { float camDepth = cameraDepthSampler.sample(s, vert.uv); return half4(half3(camDepth), 1); }
基于此着色器,我们需要字典指定“cameraDepthSampler”作为输入名称:

<key>draw_depth</key> <dict> <key>draw</key> <string>DRAW_QUAD</string> <key>program</key> <string>doesntexist</string> <key>metalVertexShader</key> <string>depth_vertex</string> <key>metalFragmentShader</key> <string>depth_fragment</string> <key>inputs</key> <dict> <key>cameraDepthSampler</key> <string>depthSymbol</string> </dict> <key>outputs</key> <dict> <key>depth</key> <string>depth_scene</string> </dict> </dict> ... <key>targets</key> <dict> <key>depth_scene</key> <dict> <key>type</key> <string>depth</string> </dict> </dict>
    
© www.soinside.com 2019 - 2024. All rights reserved.