Модификатор шейдера 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), он бы использовал металл и работал без единого ключевого слова.

Другие вопросы по тегам