hadr_01 という旗のオブジェクトに使われている MADFINGER-Lightmap-Unlit-Wind(ファイル名は MADFINGER-Lightmap-Unlit-Wind.shader )というシェーダの記述を見てみました。
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公式のシェーダ関連のチュートリアル
Unity - Shaders: ShaderLab & Fixed Function shaders
http://unity3d.com/support/documentation/Manual/ShaderTut1.html
Unity - Shaders: Vertex and Fragment Programs
http://unity3d.com/support/documentation/Manual/ShaderTut2.html
Unity - Writing Surface Shaders
http://unity3d.com/support/documentation/Components/SL-SurfaceShaders.html
Unity - Surface Shader Examples
http://unity3d.com/support/documentation/Components/SL-SurfaceShaderExamples.html
Unity - Surface Shader Lighting Examples
http://unity3d.com/support/documentation/Components/SL-SurfaceShaderLightingExamples.html
関連情報
Unity - Shader Reference
http://unity3d.com/support/documentation/Components/SL-Reference.html
Unity製のハイクオリティゲーム「SHADOWGUN」のステージデータが公開 - 強火で進め
http://d.hatena.ne.jp/nakamura001/20120324/1332602780