我有一个带有多个渲染通道设置的 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 范围内?这就是我在使用颜色目标时遇到的问题。
我能够按照此论坛帖子中的指南解决这个问题。关键见解:“输入”中的键需要与 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>