我正在尝试使用带有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
未传递给着色器,并被解析为着色器中的空矩阵,这会产生黑色,一旦反转,是白色的。
答案 0 :(得分:2)
SceneKit假设你使用的是glsl,因为你的着色器体中有vec3(1.0)。如果你将它改为float3(1.0),那么它将使用金属并且没有统一关键字。