トップ 一覧 検索 ヘルプ RSS ログイン

unity_shader_multiply_leakの変更点

  • 追加された行はこのように表示されます。
  • 削除された行はこのように表示されます。
!!!汚れを付ける乗算シェーダ

 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内の処理が実行されます。

----
{{lastmodified}}