汚れを付ける乗算シェーダ
http://japan.unity3d.com/gallery/demos/live-demos#sewer
が参考になります。
「Shaders/multiplyCull+1.shader」のように乗算で重ねて描画することで汚れを表現します。
Shaderファイルの作成
「Shaders/multiplyCull+1.shader」ファイルを作成。
中身は以下のように記述。
Shader "Multiply+1" { Properties { _MainTex ("Multiply Leak", 2D) = "white" {} } Category { Tags { "Queue" = "Transparent+1" } Blend Zero SrcColor Lighting Off ZWrite Off Fog { Color (1,1,1,1) } BindChannels { Bind "Color", color Bind "Vertex", vertex Bind "TexCoord", texcoord } // マルチテクスチャに対応しているGPU用. SubShader { Pass { SetTexture [_MainTex] { combine texture * primary } SetTexture [_MainTex] { constantColor (1,1,1,1) combine previous lerp (previous) constant } } } // 性能がよくないGPU用(シングルテクスチャのみの表現). SubShader { Pass { SetTexture [_MainTex] { constantColor (1,1,1,1) combine texture lerp(texture) constant } } } } }
Tags
参考:
http://docs-jp.unity3d.com/Documentation/Components/SL-SubshaderTags.html
Tags { "Queue" = "Transparent+1" }
の指定は「Queue」でオブジェクトの描画する順番を判定します。
「Transparent」は奥から順番に描画されます(半透明のガラス、パーティクルなど)。デプスバッファへの書き込みを行わない場合に主に指定。
「Transparent+1」とすることで、不透明のジオメトリの描画の次に描画されます。
形状(Geometry)は、シーンのHierarchyで列挙した昇順でレンダリングされます。
そのため、まったく同一位置に面が存在する場合(特に半透明の形状がある場合に)ソートされずに隠れてしまうことになります。
この場合は、TagsのQueue指定で制御してあげる必要があります。
Blend
参考:
http://docs-jp.unity3d.com/Documentation/Components/SL-Blend.html
Blend Zero SrcColor
Blend で、すでに存在するピクセルとどのように合成するかを指定します。
Sourceは計算された色、Destinationは画面にすでにある色になります。
「Blend Zero SrcColor」を指定すると、元にある色に対してテクスチャ色で乗算します。
Blend SrcAlpha OneMinusSrcAlpha
とすると、SrcColorでアルファブレンド。
Blend One One
とすると、SrcColorで加算合成になります。
2つのSubShader
SubShaderを2つ記載することで、はじめの処理が実行できない場合(GPUが貧弱な場合)は2つめのSubShader内の処理が実行されます。
最終更新時間:2013年11月18日 00時12分05秒