Фрагмент микширования металлических шейдеров, получающий неправильное значение цвета

#xcode #shader #scenekit #arkit #metal

#xcode #шейдер #scenekit #arkit #Металлические

Вопрос:

У меня есть 2 прохода в металле:

1 — node_pass

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]. Это означает, что он правильно возвращает цвет half4 со значением Y ([1]) -0.345.

Пока все хорошо!

Проблема в том, что он переходит в mix_pass.

— mix_vertex:

 vertex MixColorInOut mix_vertex (VertexInput in [[stage_in]],
                                        constant SCNSceneBuffer amp; 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].

0.0 для второго компонента, когда оно должно быть -0.345.

Почему это так? Это безумие, потому что отладчик в node_fragment показывает значение -0.345 для Y ([1]).

Теоретически, это должно быть точное значение цвета [0.416, -0.345,0.0, 0.0], подтвержденное ранее отладчиком.

Когда я делаю center_map.x, он возвращает правильное значение 0.416, что означает, что он получает значение цвета x из node_fragment.

Но когда я делаю center_map.y, оно равно 0.0, что НЕ является значением, показанным в отладчике из node_fragment.

Есть какие-либо подсказки, что здесь не так?

Ответ №1:

Какой формат пикселей используется для первого прохода? Большинство форматов пикселей не имеют знака, включая MTLPixelFormatBGRA8Unorm_sRGB тот, который SceneKit использует по умолчанию.

Если вы работаете только с двумя цветовыми компонентами MTLPixelFormatRG32Float , это хороший кандидат.

Комментарии:

1. Это один и тот же пиксель (внутри узла) для обоих проходов. Когда я говорю, что проверил в отладчике, это означает, что я проверил тот же пиксель при первом возврате node_fragment half4 (color); с первого прохода, а затем при втором последнем проходе mix_fragment.

2. ПОЖАЛУЙСТА, кто-нибудь ОТКЛОНИТ этот ответ, поскольку это должен быть просто комментарий (этот ответ бесполезен), определенно НЕ ОТВЕТ. У меня недостаточно репутации, чтобы самому проголосовать за это.