強火で進め

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

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

内蔵シェーダのコード解説。まずは一番シンプルなシェーダ Unlit/Texture の解説をします。

これはライティングの反映無し、(透過なし)テクスチャのみの一番シンプルなシェーダです。

因みに補足しておくと Unity のシェーダは厳密には ShaderLab という名称でこの ShaderLab という言語(?)を元に裏側で OpenGL環境向けの GLSL や DirectX環境向けのHLSL が生成され使用されるみたいです。

シェーダの全コード

// Unlit shader. Simplest possible textured shader.
// - no lighting
// - no lightmap support
// - no per-material color

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

SubShader {
	Tags { "RenderType"="Opaque" }
	LOD 100
	
	Pass {
		Lighting Off
		SetTexture [_MainTex] { combine texture } 
	}
}
}

解説

Shader "Unlit/Texture" {

まずはシェーダのパス指定。 Shader に続いて記述して有るパスの通りに Inspector で選択出来るシェーダ一覧に表示されます。


Properties は Inspector から変更可能な要素を記述します。

Properties {
	_MainTex ("Base (RGB)", 2D) = "white" {}
}

このシェーダではメインのテクスチャ(2Dテクスチャ)を変更出来る様に記述して有ります。
_MainTex はシェーダ内部で使用する時の名前(変数名の様なもの)。 "Base (RGB)" は Inspector に表示されるパラメータ名となります。

"white" はテクスチャの指定が無かった場合の描画になります。この記述では白色のテクスチャが設定されたものとして描画されます。

例えばここで新規にシェーダを作成し(メニューから「Assets」-「Create」-「Shader」で作成可能)、このシェーダのコードをコピーした後にシェーダ名が被らない様に "Unlit/Texture" を "Unlit/Texture2" に変更。その後にメインテクスチャのデフォルト値の "white" を例えば "red" などに変更します。次に Material を新規に作成し、このシェーダを選択するとちゃんとデフォルトの色が赤に変更されている事が確認出来ます。

恐らくここに記述されて辺りの色が使えるのでは無いかと思います。

SubShader {

SubShader のブロックではシェーダのメイン処理部分の記述をします(名前は SubShader ですけどw)。
公式ドキュメント

	Tags { "RenderType"="Opaque" }

ここの Tags のブロックでは SubShader のブロックの中で使われる設定が記述されています。
公式ドキュメント


RenderType は「半透明」や「アルファテスト」を行うなど、レンダリングの種類を設定します。

ここでは "Opaque" (英語で「不透明」の意味)が設定してあるので透明度(アルファ)の値は無視されてレンダリングされます。
公式ドキュメント

	LOD 100

LOD は描画負荷が高いものや高度なグラッフィク機能の要求が有るものほど高い値を設定します。

そして、描画負荷をあまりかけれない(グラフィック機能が貧弱な)環境では LOD の値を小さめに設定するとその値以下のLOD値が設定されているシェーダでなければ描画されなくなります。

ドキュメントによると100〜600辺りの値を設定する様です。今回はごくごく基本的なグラフィック機能しか使ってないので最低の値で有る100が設定されています。
公式ドキュメント

	Pass {

Pass には実際にレンダリングするプログラムが記述されています。
公式ドキュメント

		Lighting Off

今回のシェーダはライトの影響は反映させないので Off に設定されています。

		SetTexture [_MainTex] { combine texture } 
	}

レンダリングに使用するテクスチャを Properties のブロックで指定した _MainTex に指定しています。 combine は他のテクスチャや色との合成方法を指定します。ここでは texture のみ記述されていので合成処理はされず、テクスチャの色がそのままレンダリングされます。
公式ドキュメント

関連情報

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