金属中的 SCN 着色器修改器 - 将制服传递给着色器

SCN shader modifier in metal - pass uniform to shader

我正在尝试对 Metal 使用着色器修改器。我不知道要申报制服...到目前为止我的片段修饰符是:

// 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,一切正常。我想我正在关注 doc 但也许不是!

制服设置为:

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 没有传递给着色器,并且在着色器中被解析为空矩阵,这给出了黑色,一次倒置的,是白色的。

SceneKit 假定您使用的是 glsl,因为您的着色器主体中有 vec3(1.0)。如果您将其更改为 float3(1.0),它将使用 metal 并在没有 uniform 关键字的情况下工作。