2017-07-27 32 views
0

我有簡單的着色器,它允許我根據節點(x> 0) - >綠色的局部座標軸重繪節點顏色,但是如何使它工作基於世界座標。SceneKit着色器根據基於節點的世界座標覆蓋顏色

(從現場將一些點並將它傳遞給着色器不基於可能的着色器)

Shader demo

vec4 pos = u_inverseModelTransform * u_inverseViewTransform * vec4(_surface.position, 1.0); 

if (pos.x > 0.0) { 
    _output.color.rgb = vec3(0.0, 0.8, 0.0); 
} 

回答

0

你不想通過u_inverseModelTransform乘其移動回你從世界空間對象空間。

vec4 pos = u_inverseViewTransform * vec4(_surface.position, 1.0); 
0

作爲一個必然結果「mnuages」正確的答案,我終於想通了,如果你在MetalSL而不是GLSL你應該使用scn_frame.inverseViewTransformu_inverseViewTransform

這很棘手,因爲SceneKit會自動嘗試將GLSL shaderModifiers交叉編譯成MetalSL,所以很難知道您有時使用哪一個。 (例如,你可以將你的SceneKit視圖改爲Metal-backed而不是OpenGL-或GLES-backed,並且仍然可以在GLSL中編寫着色器修改器,並且SceneKit將可以工作。)