Próbuję używać modyfikatorów shaderów z Metalem. Nie mogę wymyślić deklaracji mundurów ... Jak dotąd mój modyfikator fragmentu to:
// color changes
#pragma arguments
float4x4 u_color_transformation;
#pragma body
_output.color.rgb = vec3(1.0) - (u_color_transformation * _output.color).rgb;
Daje to fioletową teksturę, bez logów. Jeśli tylko mam _output.color.rgb = (u_color_transformation * _output.color).rgb
, Wszystko w porządku. Myślę, że śledzę doc ale może nie!
Mundur jest wyposażony w:
material.shaderModifiers =
[ SCNShaderModifierEntryPoint.fragment: theShaderAbove ]
material.setValue(NSValue(mat4: GLKMatrix4Identity), forKey: "u_color_transformation")
Wszystko to działało dobrze z openGL
Aktualizacja:
Najwyraźniej modyfikatory shadera SceneKit używają kodu glsl i dbają o jego konwersję do metalu. Więc zmieniłem shader na:
// color changes
#pragma arguments
uniform mat4 u_color_transformation;
#pragma body
_output.color.rgb = vec3(1.0) - (u_color_transformation * _output.color).rgb;
Wynik jest teraz biały (co sugeruje, że przynajmniej się skompilował), co sugeruje u_color_transformation
nie jest przekazywany do modułu cieniującego i jest przetwarzany na macierz zerową w module cieniującym, co daje czerń, która po odwróceniu jest biała.
Odpowiedzi:
2 dla odpowiedzi № 1SceneKit założył, że używasz glsl, ponieważ miałeś vec3 (1.0) w ciele shadera. Jeśli zmieniłeś to na float3 (1.0), użyłby metalu i działałby bez jednolitego słowa kluczowego.