金属中的SCN着色器修改器-将统一变量传递到着色器

3

我正在尝试在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没有传递给着色器,并且在着色器中被解析为一个空矩阵,这会产生黑色,一旦反转,就变成了白色。

1个回答

3

SceneKit假定您在着色器中使用vec3(1.0),因此默认使用glsl。如果您将其更改为float3(1.0),它将使用Metal并且无需uniform关键字即可工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接