強火で進め

このブログではプログラム関連の記事を中心に書いてます。

内蔵シェーダのコード解説(2) - Unlit/Transparent

今回解説するのは Unlit/Transparent 。 Unlit/Texture と同様にライティングの反映無しのごくごくシンプルなシェーダです。 Unlit/Texture との違いは透明(Transparent)に対応している所です。テクスチャ画像のアルファ値がちゃんと反映され透過されます。

シェーダの全コード

// Unlit alpha-blended shader.
// - no lighting
// - no lightmap support
// - no per-material color

Shader "Unlit/Transparent" {
Properties {
	_MainTex ("Base (RGB) Trans (A)", 2D) = "white" {}
}

SubShader {
	Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"}
	LOD 100
	
	ZWrite Off
	Blend SrcAlpha OneMinusSrcAlpha 

	Pass {
		Lighting Off
		SetTexture [_MainTex] { combine texture } 
	}
}
}

解説

結構前回と同じ部分が多いので同じ部分の解説は省略します。その部分については前回の記事を参照して下さい。

	Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"}

前回に比べて Tags に指定されているパラメータが多いですね。

"Queue" はレンダリングの順番を指定します。今回は Transparent なシェーダなので "Transparent" が指定して有ります。

"IgnoreProjector" は Projector の投影を無視(Ignore)するかどうかを指定します。今回は無視するので "True" が指定して有ります。

因みに Projector とはこの記事で紹介した様に影を地面に投影したり、オブジェクトに対し行われる投影処理です。

"RenderType" は前回も出てきましたが今回は透明に対応しているので "Transparent" が指定されています。

公式ドキュメント

	ZWrite Off

Zバッファへの書き込みはOFFに設定。

Zバッファへの書き込みはOFFにすると前後関係が正しく描画されなくなると思うかも知れませんが透明な部分を持つオブジェクトはZ値(オブジェクトの中心のZ値)が大きい(カメラから遠い)ものから順番に描画される為、大体問題無くレンダリングされます。

ここで今回のシェーダで描画したものと ZWrite を On にしたものでレンダリングされたが結果をキャプチャしたものを比較してみます。

ここでは横(+X方向)から見た時に以下様に見える様に傾けた2つの Plane を準備し、両方に ZWrite が Off のシェーダを設定した時と On のシェーダを設定した時の2つのレンダリング結果をキャプチャしました。

※画面下部(-Y方向)の所から青の Plane が前に出ている様に赤と青の Plane が交差しています。

【 ZWrite を Off 】

【 ZWrite を On 】

2つのシェーダのレンダリング結果を見ると ZWrite を On にしたものは青の Plane の下部が前面に出ている状態で描画されています。

前後関係の事を考えると ZWrite を On にした方が正しくレンダリングされている様に思えますが厳密に見ると青の Plane の透過している部分から赤の Plane が見えないといけませんが見えていません。

という事で実はどちらも厳密には3D空間を正しくレンダリングしてはいません。これが先の説明で「大体問題無くレンダリングされます」と言った理由です。

しかし、どちらかというと ZWrite を Off にした方が見た目がマシになるのでここでは Off に設定してあるのだと思います。

まぁ、この様に正しくレンダリングされないのは今回の様に交差した場合などごく限られた状態の場合だけなので実際のゲーム中はほとんど発生しなかったり、発生しても一瞬なので大きな問題になる事は少ないです。

	Blend SrcAlpha OneMinusSrcAlpha 

Blend はアルファブレンドの計算方法を指定します。

Blend は複数のパラメータの指定方法が有りますが、ここでは上記のタイプが使われています。

Blend の後に続く、パラメータは以下の要素と関連が有ります。

Blend SrcFactor DstFactor

SrcFactor が Sourceの要素 (これからレンダリングされるピクセル)、2つ目に指定するのが Destinationの要素( 既にレンダリングされている)を指定します。

ここでは SrcFactor に SrcAlpha 、 DstFactor に OneMinusSrcAlpha が指定して有ります。その為、このシェーダでは以下の計算式(※Wikipediaから引用)でアルファブレンドが行われます。

アルファブレンド - Wikipedia
http://ja.wikipedia.org/wiki/%E3%82%A2%E3%83%AB%E3%83%95%E3%82%A1%E3%83%96%E3%83%AC%E3%83%B3%E3%83%89

Unity - Unity Manual
http://docs-jp.unity3d.com/Documentation/Components/SL-Blend.html

関連情報

nakamura001 @ ウィキ - トップページ/Unity(Unity3D)/内蔵シェーダのソースコード
http://www32.atwiki.jp/nakamura001/pages/178.html