« OldSkool Voxel Render : UnityでMinecraftのようなボクセル風レンダリングのアセット | トップページ | 発送された »

2011.10.18

Strumpy Shader Editorをいじって疑問に思ったので、UnityのSurface Shaderを調べてみた

Strumpy Shader Editorの記事を書くと言ってかなり停滞してますが、実はちょっとUnityのシェーダの仕様でイマイチわかってなかったことがあったのでそのあたりをちょっと調べていました。

Unityのシェーダの仕様については下記のドキュメントを読んでいくのがよいのですが、理解したことをメモ。

Shaders
http://unity3d.com/support/documentation/Manual/Shaders.html

まず、一度Strumpy Shader Editorの機能を見直します。

* Full Unity Surface Shader API Support
* Unity Shader Fallback Support
* Custom Vertex Shaders
* Custom Lighting
* In Editor Preview (Pro only)
* Intuitive User Interface

気になったのが1つめの"Full Unity Surface Shader API Support"と3つめの"Custom Vertex Shaders"のところ。

まず、完全に勘違いしていたのが"Surface Shader = Pixel Shader"。Surface ShaderとFragment (Pixel) Shaderは同じモノではなく、Unity上でSurface Shaderという概念が別にあって、Fragment Shader自体もあるということ。

そんなわけでSurface Shaderのドキュメントを見てみる。

http://unity3d.com/support/documentation/Components/SL-SurfaceShaders.html

Surface Shaderでは下記の構造体(もしかしたら今のバージョンではもっとあるかも。あとオプションも色々とあるっぽい)が事前定義されていて、ここへの出力方法をカスタマイズすることができるシェーダのようで、各メンバの役割も事前に決まっているため自分でFragment Shaderを書くのと違って完全に好きなようにシェーダを書くことはできないようだ。一応、完成後は内部的に頂点 & フラグメントシェーダになるようだがオーサリングは決まった構文と記述で書くようですね。

struct SurfaceOutput {
half3 Albedo;
half3 Normal;
half3 Emission;
half Specular;
half Gloss;
half Alpha;
};

これとカスタムライトを組み合わせてシェーダを作るようだ。

http://unity3d.com/support/documentation/Components/SL-SurfaceShaderLighting.html

なので、完全に自由に書くシェーダというよりは、たとえば鏡面反射を使うとしてPhongやBlinn-PhongにするかWardにするかCook-Torranceにするかとかリムライトを使うかとかライティングモデルの変更などを行えるという感じみたいですね。

そんなわけで、Strumpy Shader Editor自体では完全に自由にFragment Shader自体を書いたりはできないってことなんですねぇ〜。

・・・というわけで、Shader.jpでちょっと止まっていた記事執筆の方向性が見えてきたので第3回を近々アップします。

« OldSkool Voxel Render : UnityでMinecraftのようなボクセル風レンダリングのアセット | トップページ | 発送された »

Programming」カテゴリの記事

コメント

この記事へのコメントは終了しました。