アルファブレンドスプライトを通してシルエットを見るシェーダー


12

Unityで、これらの例のようなシースルー効果を達成したいと思います。

私の特定のシナリオには、いくつかの要件があります。

  • スプライトはアルファブレンディングを使用しており、スプライトには透明な領域があります。
  • キャラクターを遮る2種類の要素があります。1つはシルエット効果を作成し、もう1つは通常のように動作する必要があります。

シルエットを作成する要素を遮蔽するには、ZWriteを有効にし、そうでない要素では無効にします。

キャラクターについては、シェーダーのキューをtransparent + 1に設定して、このパスを追加しました。

Pass
{
    ZTest Greater
    Lighting Off
    Color [_Color]
}

そして、効果は部分的に機能します:

  • シルエットは、透明な部分も含めて、キャラクター全体に描かれます。透明な部分はシルエットを作成しないでください。

  • シルエットは、スプライトの一部が透明であっても、キャラクターがスプライトの背後にあるときに作成されます。スプライトの透明な部分の後ろにいると、シルエットが作成されません。

  • キャラクターは、要素の後ろにある場合でも、残りの要素の前に表示されます。これは、キューをTransparent + 1に設定しているためだと思います。ただし、透明のままにすると、キャラクターは正しい順序で描画されますが、シルエットは表示されません。

私は誰かが私に与えたこれらのヒントに従おうとしましたが、私はそれを機能させることができません:

1)スプライトをレンダリングするパスはそのままにします。

2)zバッファーに書き込むパスを追加しますが、clip()を使用してアルファに基づいてピクセルを破棄するシェーダーがあります。z-bufferを使用して、MSAAおよびalpha-toカバレッジを使用せずにソフトzテストを作成することはできません。その品質は素晴らしいものではありませんが、あなたができる最善の方法です。より高速な代替手段は、パターンまたはノイズディザーです。スプライトのエッジがかなり鋭い場合は、古き良きしきい値を使用します。

3)zテストを使用してオクルージョンカラーを描画するオクルード可能なオブジェクトに3番目のパスを追加し、最終パスとして描画されることを確認します。

私は、特にUnityのシェーダーに慣れていないので、適切に機能させる方法がわかりません。


2番目の例は、キャラクターの上に置かれた半透明の緑のスプライトに見えます。あなたがそれを探しているなら、あなたはその1つを取り除き、ちょうど2番目を去ることを望むかもしれません。
スティーブハーディング

回答:


1

このビデオは基本をカバーしていますか?これは、すでに公開されているシェーダーからアウトラインとシルエットのいくつかの異なるスタイルを作成することの例です。

https://www.youtube.com/watch?v=00qMZlacZQo

これは、Unity Wikiで公開されているシェーダーを使用して、目的のことをほとんど実行する例です。シェーダーの内容は以下のとおりですが、シェーダーの輪郭部分がU5で期待どおりに機能していない可能性があると思います。

Shader "Outlined/Silhouetted Diffuse" {
Properties {
    _Color ("Main Color", Color) = (.5,.5,.5,1)
    _OutlineColor ("Outline Color", Color) = (0,0,0,1)
    _Outline ("Outline width", Range (0.0, 0.03)) = .005
    _MainTex ("Base (RGB)", 2D) = "white" { }
}

CGINCLUDE
#include "UnityCG.cginc"

struct appdata {
    float4 vertex : POSITION;
    float3 normal : NORMAL;
};

struct v2f {
    float4 pos : POSITION;
    float4 color : COLOR;
};

uniform float _Outline;
uniform float4 _OutlineColor;

v2f vert(appdata v) {
// just make a copy of incoming vertex data but scaled according to normal direction
    v2f o;
    o.pos = mul(UNITY_MATRIX_MVP, v.vertex);

    float3 norm   = mul ((float3x3)UNITY_MATRIX_IT_MV, v.normal);
    float2 offset = TransformViewToProjection(norm.xy);

    o.pos.xy += offset * o.pos.z * _Outline;
    o.color = _OutlineColor;
    return o;
}
ENDCG

SubShader {
    Tags { "Queue" = "Transparent" }

    // note that a vertex shader is specified here but its using the one above
    Pass {
        Name "OUTLINE"
        Tags { "LightMode" = "Always" }
        Cull Off
        ZWrite Off
        ZTest Always
        ColorMask RGB // alpha not used

        // you can choose what kind of blending mode you want for the outline
        Blend SrcAlpha OneMinusSrcAlpha // Normal
        //Blend One One // Additive
        //Blend One OneMinusDstColor // Soft Additive
        //Blend DstColor Zero // Multiplicative
        //Blend DstColor SrcColor // 2x Multiplicative

CGPROGRAM
#pragma vertex vert
#pragma fragment frag

half4 frag(v2f i) :COLOR {
    return i.color;
}
ENDCG
    }

    Pass {
        Name "BASE"
        ZWrite On
        ZTest LEqual
        Blend SrcAlpha OneMinusSrcAlpha
        Material {
            Diffuse [_Color]
            Ambient [_Color]
        }
        Lighting On
        SetTexture [_MainTex] {
            ConstantColor [_Color]
            Combine texture * constant
        }
        SetTexture [_MainTex] {
            Combine previous * primary DOUBLE
        }
    }
}

SubShader {
    Tags { "Queue" = "Transparent" }

    Pass {
        Name "OUTLINE"
        Tags { "LightMode" = "Always" }
        Cull Front
        ZWrite Off
        ZTest Always
        ColorMask RGB

        // you can choose what kind of blending mode you want for the outline
        Blend SrcAlpha OneMinusSrcAlpha // Normal
        //Blend One One // Additive
        //Blend One OneMinusDstColor // Soft Additive
        //Blend DstColor Zero // Multiplicative
        //Blend DstColor SrcColor // 2x Multiplicative

        CGPROGRAM
        #pragma vertex vert
        #pragma exclude_renderers gles xbox360 ps3
        ENDCG
        SetTexture [_MainTex] { combine primary }
    }

    Pass {
        Name "BASE"
        ZWrite On
        ZTest LEqual
        Blend SrcAlpha OneMinusSrcAlpha
        Material {
            Diffuse [_Color]
            Ambient [_Color]
        }
        Lighting On
        SetTexture [_MainTex] {
            ConstantColor [_Color]
            Combine texture * constant
        }
        SetTexture [_MainTex] {
            Combine previous * primary DOUBLE
        }
    }
}

Fallback "Diffuse"
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.