SCNMaterialの描画を変える方法はいくつかあるが、今回はSCNProgramを紹介する。
SCNProgramはSCNMaterialの描画を完全に制御することが出来る。
似たような機構にshaderModifierがあるが、こちらは既存の描画を拡張する意味合いが強いと思う。
SCNProgramは、その歴史的な事情からOpenGLESとMetalの両方のシェーダを受け取れるように出来ている。
特にfragmentShader
プロパティや、vertexShader
プロパティはOpenGLES用のプロパティである。
let program = SCNProgram()
program.fragmentShader
program.vertexShader
Metalのシェーダを渡す際はMTLLibraryを渡し、fragmentFunctionName
とvertexFunctionName
を指定する事になる。
let program = SCNProgram()
program.library = library
program.fragmentFunctionName = "myFragment"
program.vertexFunctionName = "myVertex"
肝心のMTLLibraryはアプリコンパイルのタイミングでコンパイルされているので次のように取り出すことが出来る。
let library = MTLCreateSystemDefaultDevice()!.makeDefaultLibrary()!
このようにして出来上がったprogramは、SCNMaterialのprogramプロパティにセットすることで動作します。
node.geometry.firstMaterial.program = program