Gölgelendirici, alfa karışımlı spritelardan siluet görmek için


12

Unity'de bu örneklerde olduğu gibi bir efekti elde etmek istiyorum:

Benim özel senaryomda birkaç gereklilik var:

  • Spritelar alfa karışımı kullanıyor ve spritelar şeffaf alanlara sahip.
  • Karakteri tıkayan 2 tür öğe vardır. Biri siluet efektini yaratmalı ve diğeri normal gibi davranmalıdır.

Siluet oluşturan öğeleri tıkamak için ZWrite'ı etkinleştiririm ve yapmayan öğeler için devre dışı bırakırım.

Karakter için gölgelendiricinin kuyruğunu şeffaf + 1 olarak ayarlamaya çalıştım ve bu geçişi ekledim:

Pass
{
    ZTest Greater
    Lighting Off
    Color [_Color]
}

Ve etki kısmen çalışıyor:

  • Siluet karakterin her yerine çizilir, hatta şeffaf olan kısımlar bile. Şeffaf parçalar bir siluet oluşturmamalıdır.

  • Siluet, karakter bir hareketli grafiğin arkasındayken, hareketli grafiğin o kısmı şeffaf olsa bile oluşturulur. Hareketli grafiğin şeffaf bir parçasının arkasında olmak silueti yaratmamalıdır.

  • Karakter, arkalarında olsa bile öğelerin geri kalanında görünür. Sanırım bunun sebebi kuyruğu Şeffaf + 1 olarak ayarlamaktır. Ancak Şeffaf olarak bırakırsam, karakter doğru sırada çizilir, ancak siluet asla görülmez.

Birinin bana verdiği bu ipuçlarını takip etmeye çalıştım, ancak işe yarayamadım:

1) Spriteları oluşturan geçişi olduğu gibi bırakın.

2) z arabelleğine yazan ancak alfaya dayalı pikselleri atmak için clip () kullanan bir gölgelendiriciye sahip bir geçiş ekleyin. Z-buffer'ı MSAA ve alfa-kapsama alanı kullanmadan yumuşak z testleri yapmak için kullanamazsınız. Bunun kalitesi harika olmayacak, ancak yapabileceğiniz en iyi şey bu. Daha hızlı bir alternatif, bir desen veya gürültü renk taklidi veya spritelarınızın oldukça keskin kenarları varsa, eski moda bir eşiktir.

3) z-testini kullanarak tıkanma rengini çizen tıkanabilir nesnelere üçüncü geçiş ekleyin ve son geçiş olarak çizildiğinden emin olun.

Özellikle Unity'de gölgelendiricilere yeniyim ve nasıl düzgün çalışacağını anlayamıyorum.


2. örneğiniz, karakterin üzerine yerleştirilmiş saydam yeşil bir hareketli grafiğe benziyor. Eğer ondan kurtulmak ve 2.'den çıkmak isteyebilirsiniz, eğer aradığınız şey buysa.
Steve Harding

Yanıtlar:


1

Bu video temel bilgileri içeriyor mu? İnsanların zaten yayınladığı gölgelendiricilerden birkaç farklı anahat ve siluet stili oluşturmanın bir örneğidir.

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

Neyin peşindeyseniz, Unity Wiki'de yayınlanan bir gölgelendirici kullanmaya bir örnek. Gölgelendiricinin içeriği aşağıdadır, ancak gölgelendiricinin ana hatları U5'te beklendiği gibi çalışmayabilir.

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"
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.