Модификатор шейдера SCN в металле - передать униформу шейдеру
Я пытаюсь использовать модификаторы шейдеров с металлом. Я не могу понять, чтобы объявить униформу... Пока что мой модификатор фрагмента:
// color changes
#pragma arguments
float4x4 u_color_transformation;
#pragma body
_output.color.rgb = vec3(1.0) - (u_color_transformation * _output.color).rgb;
Это выводит фиолетовую текстуру, без журнала.. Если у меня просто есть _output.color.rgb = (u_color_transformation * _output.color).rgb
все хорошо. Я думаю, что следую за документом, но, возможно, нет!
Униформа устанавливается с:
material.shaderModifiers =
[ SCNShaderModifierEntryPoint.fragment: theShaderAbove ]
material.setValue(NSValue(mat4: GLKMatrix4Identity), forKey: "u_color_transformation")
Все это работало нормально с openGL
Обновить:
По-видимому, модификаторы шейдеров SceneKit используют код glsl и заботятся о преобразовании его в металл. Поэтому я изменил шейдер на:
// color changes
#pragma arguments
uniform mat4 u_color_transformation;
#pragma body
_output.color.rgb = vec3(1.0) - (u_color_transformation * _output.color).rgb;
Вывод теперь белый (предполагая, что он хотя бы скомпилирован), что u_color_transformation
не передается шейдеру и преобразуется в нулевую матрицу в шейдере, которая дает черный цвет, который после инвертирования является белым.
1 ответ
SceneKit предполагал, что вы используете glsl, потому что у вас в теле шейдера был vec3(1.0). Если бы вы изменили это на float3(1.0), он бы использовал металл и работал без единого ключевого слова.