トップ 差分 一覧 ソース 検索 ヘルプ 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内の処理が実行されます。


最終更新時間:2013年11月18日 00時12分05秒