알파 블렌드 스프라이트를 통해 실루엣을 볼 수있는 셰이더


12

Unity에서 다음 예제와 같은 시스루 효과를 달성하고 싶습니다.

내 특정 시나리오에는 몇 가지 요구 사항이 있습니다.

  • 스프라이트는 알파 블렌딩을 사용하고 있으며 스프라이트에는 투명한 영역이 있습니다.
  • 캐릭터를 막는 2 가지 요소가 있습니다. 하나는 실루엣 효과를 만들어야하고 다른 하나는 보통처럼 작동해야합니다.

실루엣을 만드는 요소를 막기 위해 ZWrite를 활성화하고 그렇지 않은 요소에서는 비활성화합니다.

캐릭터의 경우 셰이더 큐를 transparent + 1로 설정하려고 시도한 후이 패스를 추가했습니다.

Pass
{
    ZTest Greater
    Lighting Off
    Color [_Color]
}

그리고 효과는 부분적으로 작동합니다.

  • 실루엣은 캐릭터 전체, 투명한 부분까지 그려져 있습니다. 투명한 부분은 실루엣을 만들면 안됩니다.

  • 스프라이트의 일부가 투명하더라도 캐릭터가 스프라이트 뒤에있을 때 실루엣이 만들어집니다. 스프라이트의 투명한 부분 뒤에 있어도 실루엣이 만들어지지 않아야합니다.

  • 캐릭터가 뒤에있는 경우에도 캐릭터는 나머지 요소 앞에 나타납니다. 큐를 Transparent + 1로 설정했기 때문입니다. 그러나 투명으로두면 문자가 올바른 순서로 그려 지지만 실루엣은 보이지 않습니다.

누군가 나에게 준이 팁을 따르려고했지만 제대로 작동하지 않습니다.

1) 스프라이트를 렌더링하는 패스를 그대로 둡니다.

2) z 버퍼에 쓰는 패스를 추가하지만 clip ()을 사용하여 알파를 기준으로 픽셀을 버리는 쉐이더가 있습니다. MSAA 및 알파 투 커버리지를 사용하지 않고 z 버퍼를 사용하여 소프트 z 테스트를 수행 할 수 없습니다. 그것의 품질은 좋지 않지만 당신이 할 수있는 최선입니다. 더 빠른 대안은 패턴 또는 노이즈 디더링 또는 스프라이트가 모두 날카로운 모서리를 가진 경우 구식 임계 값입니다.

3) z 테스트를 사용하여 폐색 색상을 그리는 폐쇄 가능한 객체에 세 번째 패스를 추가하고 최종 패스로 그려야합니다.

저는 특히 Unity에서 셰이더를 처음 접했고 제대로 작동시키는 방법을 알 수 없습니다.


두 번째 예제는 단순히 캐릭터 위에 반투명 녹색 스프라이트를 배치 한 것입니다. 당신이 찾고있는 것이라면 그 것을 제거하고 두 번째를 떠나고 싶을 수도 있습니다.
Steve Harding

답변:


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.