金属着色器混合片段接收错误的颜色值

Posted

技术标签:

【中文标题】金属着色器混合片段接收错误的颜色值【英文标题】:Metal Shader mix fragment receiving wrong color value 【发布时间】:2021-03-06 18:10:02 【问题描述】:

我在 Metal 中有 2 次通行证:

1 - 节点通行证

2 - mix_pass

用 xCode 调试它:

fragment half4 node_fragment (NodeColorInOut vert [[stage_in]])

    float4 color =  float4((vert.center.x + 1.0) * 0.5 , (vert.center.y + 1.0) * -0.5, 0.0, 0.0);
    return half4(color);

vert.center 是在 node_vertex 处计算的节点中心的数据。不管为什么。我有我的理由。

从 XCODE 调试器我可以确认 "float4 color" 返回 [0.416,-0.345, 0.0,0.0]。这意味着它使用 Y ([1]) 值 -0.345 正确返回 half4 颜色。

到目前为止一切顺利!

问题是当它进入 mix_pass 时。

- mix_vertex:

vertex MixColorInOut mix_vertex (VertexInput in [[stage_in]],
                                        constant SCNSceneBuffer & scn_frame [[buffer (0)]])

    MixColorInOut out;
    out.position = in.position;
    out.uv = float2 ((in.position.x + 1.0) * 0.5, (in.position.y + 1.0) * -0.5);
    return out;

- mix_fragment:

fragment half4 mix_fragment (MixColorInOut vert [[stage_in]],
                            texture2d <float, access :: sample> colorScene [[texture (0)]],
                            depth2d <float, access :: sample> depthScene [[texture (1)]],
                            texture2d <float, access :: sample> colorNode [[texture (2)]],
                            depth2d <float, access :: sample> depthNode [[texture (3)]])

…
// this part runs only when it's a pixel inside the node
float3 center_map = colorNode.sample(s, vert.uv).rgb;
…

在调试器中(选择节点内的一个像素) float3 center_map 为 [0.416,0.0,0.0,0.0]。 p>

0.0 表示第二个分量应该是 -0.345

这是为什么呢?这很疯狂,因为 node_fragment 的调试器显示 Y ([1]) 的值 -0.345

理论上应该是之前调试器确认的准确颜色值[0.416,-0.345,0.0,0.0]。

当我执行 center_map.x 时,它返回正确的值 0.416,这意味着它正在从 node_fragment 获取 x 颜色值。

但是当我执行 center_map.y 时,它是 0.0,这不是 node_fragment 的调试器中显示的值。

有什么线索吗?

【问题讨论】:

【参考方案1】:

第一次使用什么像素格式?大多数像素格式都是无符号,包括 SceneKit 默认使用的 MTLPixelFormatBGRA8Unorm_sRGB

如果您只使用两个颜色组件,MTLPixelFormatRG32Float 是一个不错的选择。

【讨论】:

两次通道的像素相同(在节点内部)。当我说我在调试器中检查时,这意味着我在第一个 node_fragment return half4(color); 上检查了相同的像素;从第一遍开始,然后是第二遍最后一遍 mix_fragment。 请,有人否决这个答案,因为它应该只是一个评论(这个答案没有用),绝对不是答案。我自己没有足够的代表来否决它。

以上是关于金属着色器混合片段接收错误的颜色值的主要内容,如果未能解决你的问题,请参考以下文章

渲染管道像素阶段“Alpha混合”

渲染管道像素阶段“Alpha混合”

具有多个缓冲区的片段着色器颜色错误

GLSL将颜色数据从片段着色器发送到顶点着色器似乎总是等于0

片段着色器会覆盖光栅化生成的片段颜色吗?

如何在渲染之间更改片段着色器颜色?