ホーム < ゲームつくろー! < Unity/Shader編

Shader編
その1 UnityにおけるShaderとは?


 Unityはいわゆる「固定機能」という描画方法を持ち合わせていません。つまり、Unityで何か世界に物を描画しようと思ったら、必ずシェーダを書かなければならないんです。「え?でも、Unityで皆サクサクゲーム作ってるじゃない…。皆が皆シェーダを書いているようには思えないんだけど…」と疑問に思う方もいらっしゃると思います。それはその通りでして、多くの方はUnityが沢山用意してくれているデフォルトシェーダを利用しています。ちょっとしたゲームであれば、それらシェーダを利用するだけでも十分です。でも、凝った事をしようと思うとオリジナルなシェーダも書きたくなるんです。

 そこで、UnityにおけるShaderについて試行錯誤してみようと思います。



@ 世界一簡単にUnityでシェーダを作ってみる

 こう書くと少し誤謬があるかもしれませんが、一先ずUnityでのシェーダの立ち位置のようなものをまずは確認してみようと思います。

 まず、新しいUnityのプロジェクトを作りましょう。Unityを立ち上げて[File]→[New Project...]でProject Wizardウィンドウが出ますので、適当なProject Locationを選択してCreateボタンを押せば、新しいプロジェクトが作れます。

 空っぽのプロジェクトが起動している状態で、Projectタブにある[Assets]フォルダをクリックすると、Assetsフォルダ内を見る事ができます。もちろん今は空っぽです:

右のAssetsフォルダ内の適当な所で右クリックするとメニューが出てきます。そこにある[Create]から[Shader]を選びましょう。すると、Assetsフォルダ下にShaderファイルが一つ出来あがります。適当に名前を変更しておいてください:

右のIsnpectorに注目です。ここに「Custom/TestShader」と名前が付いていますね。自作のShaderはすべてカスタムシェーダ(Custom)として分類されます。

 さて、今ただ作ったこのシェーダ、実はもう使えます。シェーダを使うには、このシェーダをアタッチしたマテリアルを必ず作らなければなりません。そこでAssetsフォルダ下に新規のマテリアルを一つ作りましょう。同じように右クリックしてメニューを出し、[Create]の[Material]を選択します。新規に出来たマテリアルにも適当な名前を付けておいて下さい:

 デフォルトで作った空のマテリアルには、実はもうShaderが適用されています。Inspector内の「Shader」という所に「Diffuse」とありますよね。これがこのマテリアルが持っているシェーダなんです。もちろんこのシェーダはUnityが最初から用意してくれている物の一つです。では、この「Shader」のボタンをクリックしてみて下さい。すると沢山のシェーダを選択できるメニューが出たと思います。ここにある「Custom」に注目です。その中を見てみると…:

もう先程作成した新規の空っぽシェーダが選択できるようになっています。これを選択すると、マテリアルのビューは…特に変わりませんよね(^-^;。これは適用が失敗したのではなくて、TestShaderがDiffuseシェーダと同じなために、見た目が変化しないんです。

 自分で作成したシェーダも、最終的にはマテリアルに適用して初めて使えるようになります。「シェーダ単独では使えない」と言う事がとても重要です。

 実際にUnityがテンプレートとして作成してくれたTestShader内を見てみましょう。Assets内のTestShaderをダブルクリックすると、MonoDevelopが立ち上がりコードを見る事ができます:

この数行のプログラムがUnityのシェーダ(の一つ)です。特別な事をしたい場合、これをカスタムで書いていくわけです!これを紐解いていきましょう。



A Unityにはシェーダが3つある!

 Unityのシェーダについては本家のマニュアルに記載があります:
Unity.Shaders: http://docs.unity3d.com/Documentation/Manual/Shaders.html

 Unityのシェーダには実は次の3種類があります:

・ Fixed Function Shaders (固定機能シェーダ)
・ Surface Shaders (サーフェイスシェーダ)
・ Vertex and Fragment Shaders (頂点/フラグメントシェーダ)

 シェーダを書く時、これらを適切に選ぶ必要があります。それぞれどういった物なのか簡単に説明します。


○ Fixed Function Shaders (固定機能シェーダ)

 固定機能シェーダはシェーダをサポートしていない古いハードウェアでアプリを動かす必要がある場合に選択します。そういう環境を動作対象に含める時には選ぶ必要がありますが、出来れば選びたくないなぁというシェーダでもあります(^-^;。このシェーダはUnityのシェーダであるShaderLabで記述します。


○ Surface Shaders (サーフェイスシェーダ)

 サーフェイスシェーダはUnityのライティングとシャドーが自動適用されるシェーダです。どういう事かと言うと、Unityは独自のライティングパイプライン、つまりポリゴン表面の明るさや暗さ(影)を計算する仕組み持っていて、これを通すとUnity内のポイントライトなどがポリゴンにちゃんと適用されます。サーフェイスシェーダはこのパイプラインの一部に組み込まれる特殊なシェーダなので、サーフェイスシェーダを適用したマテリアルであれば同じようなライティング効果がかかります。つまり、サーフェイスシェーダはマテリアル(材質)により特化したシェーダというわけです。ライティング計算は面倒ですから、それをUnityに任せたいなぁという時にサーフェイスシェーダを選択します。
 サーフェイスシェーダはShaderLabとCg/HLSLで記述します。記述した部分がUnityのライティングパイプラインの一部に組み込まれる事になるわけです。


○ Vertex and Fragment Shaders (頂点/フラグメントシェーダ)

 頂点/フラグメントシェーダはUnityのライティングパイプライン効果を掛けたくない場合、もしくはサーフェイスシェーダでは表現しきれない特殊な事をしたい場合に選択します。例えばポストエフェクトなどはこれで記述しないとかえって面倒になります。サーフェイスシェーダと同様にShaderLabとCg/HLSLで記述しますが、もしライティングを行うならすべて独自に記述していく必要が出てきます。


 選択の基準は2つ。一つ目は「シェーダの無いハードをサポートするか?」。もう一つは「Unityにライティングを任せるか?」です。シェーダの無いハードをサポートするなら固定機能シェーダで記述する必要があります。Unityのライティングパイプライン下で動く物にするならサーフェイスシェーダ、独自の道を進むかライティングパイプラインが適用されると困る場合は頂点/フラグメントシェーダを使います。

 すべてのシェーダで「ShaderLab」というUnity独自の書式が使われます。まずはShaderLabについて掘り下げましょう。