/ / SCNシェーダモディファイア - メタル - ユニフォームをシェーダに渡す - シェーダ、シーンキット、メタル

シェーダシェイダー、シーンキット、メタルに一貫した金属パスのSCNシェーダモディファイヤ

私はメタルでシェーダモディファイアを使用しようとしています。ユニフォームを宣言することができません。

// 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は2

SceneKitはシェーダボディにvec3(1.0)があるため、glslを使用していると想定しました。これをfloat3(1.0)に変更すると、それはmetalを使用し、uniformキーワードなしで機能します。