金属中的SCN着色器修改器 - 将均匀性传递给着色器

时间:2016-09-16 00:56:18

标签: shader scenekit metal

我正在尝试使用带有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未传递给着色器,并被解析为着色器中的空矩阵,这会产生黑色,一旦反转,是白色的。

1 个答案:

答案 0 :(得分:2)

SceneKit假设你使用的是glsl,因为你的着色器体中有vec3(1.0)。如果你将它改为float3(1.0),那么它将使用金属并且没有统一关键字。