我正在尝试在Metal中使用着色器修饰符。我无法弄清楚如何声明uniform变量...到目前为止,我的片段修饰符是:
// 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代码,并负责将其转换为Metal。因此,我将着色器更改为:
// 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
没有传递给着色器,并且在着色器中被解析为一个空矩阵,这会产生黑色,一旦反转,就变成了白色。