2016-09-16 145 views
3

我正在嘗試在Metal中使用着色器修改器。我想不出來聲明制服......到目前爲止,我的片段修改爲: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,一切都OK。我想我遵循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不傳遞給着色器,並決心在着色器零矩陣,黑色,一旦倒置,是白色的。

回答

2

SceneKit假設您使用glsl,因爲您的着色器正文中包含vec3(1.0)。如果您將其更改爲float3(1.0),它將使用金屬並且沒有uniform關鍵字。