/ / Modyfikator shadera SCN w metalu - przekazuje jednolity do shadera - shadera, scenekit, metalu

Modyfikator shadera SCN w metalu - przekazuj mundur do shadera - shadera, scenekitu, metalu

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 № 1

SceneKit 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.