前回はサーフェイスシェーダのパラメータをインスペクタから制御できるようにしました。
今回はシェーダを使って3Dオブジェクトの見た目を半透明にしてみましょう。シェーダで透明度を扱えるようになるとガラスのような表現や、金網のように向こうが透けて見える表現などが簡単に作れるようになります。
半透明にするためのサーフェイスシェーダ設定
3Dモデルを半透明で描画するためのシェーダプログラムは次のようになります。プロジェクトビューで新たにシェーダファイルを作って、次のプログラムを書いてみましょう。
Shader "Custom/sample" { SubShader { Tags { "Queue" = "Transparent" } LOD 200 CGPROGRAM #pragma surface surf Standard alpha:fade #pragma target 3.0 struct Input { float2 uv_MainTex; }; void surf (Input IN, inout SurfaceOutputStandard o) { o.Albedo = fixed4(0.6f, 0.7f, 0.4f, 1); o.Alpha = 0.6; } ENDCG } FallBack "Diffuse" }
第一回目で最小限のシェーダを作成しましたが、そのシェーダと比べると
- Tagブロックの内容が追加されている
- #pragmaの宣言にalpha:fadeが追加されている
- SurfaceOutputStandardにAlphaを設定している
の三点が追加修正されています。一つずつ確認していきましょう。
TagブロックでTransparentを指定する
Tagブロックの中のQueueには描画の優先度を指定します。基本的にはカメラからみて遠くにある(奥にある)ものから順番に描画されるため、わざわざQueueを指定する必要はありません。ただ、半透明のものを描画する場合は、不透明オブジェクトの後に描画しないと描画結果が破綻してしまいます。
Queueでは、「Background」→「Geometry」→「AlphaTest」→「Transparent」→「Overlay」の順で描画されます。ここではQueueにTransparentを指定しているので、BackgroundやGeometryなどの不透明オブジェクトを全て描画してから今回の半透明オブエジェクトが描画されます。
半透明オブジェクトの描画に関しては下記のページで詳しく説明されていますので、参考にしてみて下さい。
http://ch.nicovideo.jp/BUSYCREATIONS/blomaga/ar802986ch.nicovideo.jp
#pragmaの宣言にalpha:fadeを追加する
#pragma surface surf Standard に続けて「alpha:fade」を指定しています。これを指定することで、オブジェクトを半透明で描くことが出来るようになります。これ以外にも次のようなパラメータを指定できます。
パラメータ | 説明 |
---|---|
alpha:auto | alpha:fadeとalpha:premulのあわせ技 |
alpha:blend | アルファブレンディングを可能にします |
alpha:fade | 従来の透過性のフェードイン/アウトを可能にします |
alpha:premul | プレマルチプライドアルファ透明度を可能にします |
詳しくは下記のページを参考にして下さい。
SurfaceOutputStandardにAlphaを設定する
前回まではSurfaceOutputStandardのAlbedoのみに値を設定してきました。透明度を指定する場合にはSurfaceOutputStandardのAlphaに値を設定します。アルファ値は0〜1の範囲で指定します。
実行結果は次のようになります。ドラゴンが半透明で描画されるため、向こう側の景色が透けてみえることに注目して下さい。
今回は3Dモデルのオブジェクト自体に透明度を設定しましたが、窓ガラスやフェンスなど特定の部分だけを透過させたい場合もあります。このような場合、テクスチャとは別にグレースケールの画像を用いて透明度を指定します。この方法は別の回で紹介したいと思います。
参考書など
使用した画像はちゃんは© Unity Technologies Japan/UCLのライセンスに準拠します。3Dオブジェクトのレンダリングに関しては、次の本がオススメです。
Unity5の教科書もよろしくお願いします!