強火で進め

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

Unityのシェーダのお勉強開始、SHADOWGUNの旗のシェーダをちょっと見てみました

hadr_01 という旗のオブジェクトに使われている MADFINGER-Lightmap-Unlit-Wind(ファイル名は MADFINGER-Lightmap-Unlit-Wind.shader )というシェーダの記述を見てみました。

Shader

Shader "MADFINGER/Environment/Lightmap + Wind" {

シェーダの選択時リストに表示される名前。 / で区切ると階層構造になります。

Properties

Properties {
	_MainTex ("Base (RGB) Gloss (A)", 2D) = "white" {}
	_Wind("Wind params",Vector) = (1,1,1,1)
	_WindEdgeFlutter("Wind edge fultter factor", float) = 0.5
	_WindEdgeFlutterFreqScale("Wind edge fultter freq scale",float) = 0.5
}

Propertiesに記載された内容はInspectorに表示されます。

対応するドキュメント

Unity - ShaderLab syntax: Properties
http://unity3d.com/support/documentation/Components/SL-Properties.html

SubShader

SubShader {

SubShaderではレンダリング時の設定を行います。

対応するドキュメント

Unity - ShaderLab syntax: SubShader
http://unity3d.com/support/documentation/Components/SL-SubShader.html

Tags

	Tags {"Queue"="Transparent" "RenderType"="Transparent" "LightMode"="ForwardBase"}

Tagsの "Queue"= ではレンダリングのオーダー順を指定します。

デフォルトで以下のものが定義されています。

定数
Background 1000
Geometry 2000
Transparent 3000
Overlay 4000

以下の様な書き方も可能です。

Tags { "Queue" = "Geometry+1" }
対応するドキュメント

Unity - ShaderLab syntax: SubShader Tags
http://unity3d.com/support/documentation/Components/SL-SubshaderTags.html

LOD

	LOD 100

LOD(Level of Detail)の設定。

対応するドキュメント

Unity - Shader Level of Detail
http://unity3d.com/support/documentation/Components/SL-ShaderLOD.html

Blend

	Blend SrcAlpha OneMinusSrcAlpha

ブレンドの設定。

対応するドキュメント

Unity - ShaderLab syntax: Blending
http://unity3d.com/support/documentation/Components/SL-Blend.html

Cull

	Cull Off ZWrite Off

カリングの設定。

CGINCLUDE〜ENDCG

	CGINCLUDE
	#include "UnityCG.cginc"
	#include "TerrainEngine.cginc"
	sampler2D _MainTex;
	float4 _MainTex_ST;
	samplerCUBE _ReflTex;
	
	#ifndef LIGHTMAP_OFF
	float4 unity_LightmapST;
	sampler2D unity_Lightmap;
	#endif
	
	float _WindEdgeFlutter;
	float _WindEdgeFlutterFreqScale;
(中略)
		o.spec = v.color;
		
		#ifndef LIGHTMAP_OFF
		o.lmap = v.texcoord1.xy * unity_LightmapST.xy + unity_LightmapST.zw;
		#endif
		
		return o;
	}
	ENDCG

Cgプログラムのブロック。

Pass

	Pass {

レンダリング処理の記述のメイン部分。

対応するドキュメント

Unity - ShaderLab syntax: Pass
http://unity3d.com/support/documentation/Components/SL-Pass.html

		#pragma vertex vert

Vertex(頂点)シェーダに使用する関数に vert() を指定。

		#pragma fragment frag

Fragment(フラグメント)シェーダに使用する関数に vert() を指定。

		#pragma fragmentoption ARB_precision_hint_fastest

Fragment(フラグメント)シェーダのオプションに ARB_precision_hint_fastest を指定。
詳しくはこちらを参照。

対応するドキュメント

Unity - Writing vertex and fragment shaders
http://unity3d.com/support/documentation/Components/SL-ShaderPrograms.html

ここでシェーダ自体の解説をしたいところですがシェーダについて全然知らない自分が解析するにはちょっと荷が重そうなので一度、Unityでのシェーダの使い方をちゃんと勉強してから改めて解析してみようと思います。

取り敢えず、UnityではシェーダをCg / HLSLで記述してるみたいなのでUnity公式のドキュメント類と合わせて、NVIDIAのサイトでCgについても勉強しておいた方が良いかな?と思っています(やっぱり、GPU Gem読んどくべきかなぁ?)。

因みに、CgはNVIDIAが作ったC言語ライクに記述が可能なシェーダ言語。

Cg (プログラミング言語) - Wikipedia
http://ja.wikipedia.org/wiki/Cg_%28%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E8%A8%80%E8%AA%9E%29

HLSLはマイクロソフトが開発したCgと同様のシェーダ言語

High Level Shader Language - Wikipedia
http://ja.wikipedia.org/wiki/High_Level_Shader_Language

関連情報

Unity - Shader Reference
http://unity3d.com/support/documentation/Components/SL-Reference.html

Unity製のハイクオリティゲーム「SHADOWGUN」のステージデータが公開 - 強火で進め
http://d.hatena.ne.jp/nakamura001/20120324/1332602780