金属中的 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 关键字的情况下工作。
我正在尝试对 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 关键字的情况下工作。