Shader เพื่อดูเงาผ่านสไปรต์อัลฟ่า


12

ฉันต้องการที่จะบรรลุในเอกภาพเห็นผ่านผลเหมือนในตัวอย่างเหล่านี้:

ในสถานการณ์เฉพาะของฉันมีข้อกำหนดสองสามข้อ:

  • สไปรท์กำลังใช้การผสมแอลฟาและสไปรท์มีพื้นที่โปร่งใส
  • มีองค์ประกอบ 2 ชนิดที่ปิดอักขระ หนึ่งควรสร้างเอฟเฟกต์ภาพเงาและอีกภาพหนึ่งควรทำงานเหมือนปกติ

สำหรับการปิดองค์ประกอบที่สร้างภาพเงาฉันเปิดใช้งาน ZWrite และปิดการใช้งานองค์ประกอบที่ไม่มี

สำหรับตัวละครฉันพยายามตั้งค่าคิวของ shader เป็น transparent + 1 และเพิ่มรหัสผ่านนี้:

Pass
{
    ZTest Greater
    Lighting Off
    Color [_Color]
}

และผลงานบางส่วน:

  • ภาพเงาถูกดึงดูดไปทั่วตัวละครแม้กระทั่งส่วนที่โปร่งใส ส่วนที่โปร่งใสไม่ควรสร้างภาพเงา

  • ภาพเงาถูกสร้างขึ้นเมื่อตัวละครอยู่ด้านหลังเทพดาแม้ว่าส่วนหนึ่งของผีสางนั้นจะโปร่งใส การอยู่ด้านหลังของสไปรต์ไม่ควรสร้างภาพเงา

  • ตัวละครจะปรากฏต่อหน้าองค์ประกอบที่เหลือแม้ว่ามันจะอยู่ข้างหลังก็ตาม ฉันเดาว่าเป็นเพราะการตั้งค่าคิวเป็น Transparent + 1 แต่ถ้าฉันปล่อยให้มันเป็นแบบโปร่งใสตัวละครจะถูกวาดตามลำดับที่ถูกต้อง แต่ภาพเงานั้นไม่เคยเห็น

ฉันพยายามปฏิบัติตามคำแนะนำเหล่านี้ที่มีคนให้ แต่ฉันไม่สามารถใช้งานได้:

1) ออกบัตรผ่านที่แสดงผลสไปรต์ตามที่เป็นอยู่

2) เพิ่มรหัสผ่านที่เขียนไปยังบัฟเฟอร์ z แต่มี shader ที่ใช้คลิป () เพื่อทิ้งพิกเซลตามอัลฟา คุณไม่สามารถใช้ z-buffer เพื่อทำการทดสอบ z-soft โดยไม่ต้องใช้ MSAA และครอบคลุม alpha-to คุณภาพของมันจะไม่ยอดเยี่ยม แต่มันเป็นสิ่งที่ดีที่สุดที่คุณสามารถทำได้ ทางเลือกที่เร็วกว่านั้นคือลวดลายหรือเสียงรบกวนหรือเป็นจุดเริ่มต้นที่ดีหากสไปรต์ของคุณมีขอบที่ค่อนข้างคม

3) เพิ่มรอบที่สามไปยังวัตถุที่สามารถแยกได้ซึ่งดึงสีการบดเคี้ยวโดยใช้การทดสอบ z และตรวจสอบให้แน่ใจว่ามันถูกวาดเป็นรอบสุดท้าย

ฉันเป็นคนใหม่สำหรับผู้ที่มีผิวสีโดยเฉพาะอย่างยิ่งใน Unity และฉันก็ไม่สามารถหาวิธีที่จะทำให้มันทำงานได้อย่างถูกต้อง


ตัวอย่างที่ 2 ของคุณดูเหมือนสไปรท์สีเขียวโปร่งแสงที่วางอยู่เหนือตัวละคร คุณอาจต้องการกำจัดสิ่งนั้นและทิ้งสิ่งที่สองไว้หากนั่นคือสิ่งที่คุณกำลังมองหา
Steve Harding

คำตอบ:


1

วิดีโอนี้ครอบคลุมพื้นฐานหรือไม่ มันเป็นภาพประกอบของการสร้างเค้าโครงและเงาที่แตกต่างกันไม่กี่แบบจากเฉดสีที่ผู้คนได้เผยแพร่ไปแล้ว

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

มันเป็นตัวอย่างของการใช้ shader ที่ตีพิมพ์ใน Unity Wiki เพื่อทำสิ่งที่คุณต้องการ เนื้อหาของ shader อยู่ด้านล่างถึงแม้ว่าฉันคิดว่าส่วนที่จัดเค้าร่างของ shader อาจไม่ทำงานอย่างที่คาดไว้ใน 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.