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