金属着色器混合片段接收错误的颜色值
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。 请,有人否决这个答案,因为它应该只是一个评论(这个答案没有用),绝对不是答案。我自己没有足够的代表来否决它。以上是关于金属着色器混合片段接收错误的颜色值的主要内容,如果未能解决你的问题,请参考以下文章