Shader để xem hình bóng thông qua các sprite pha trộn alpha


12

Tôi muốn đạt được trong Unity một hiệu ứng nhìn xuyên qua giống như trong các ví dụ sau:

Trong kịch bản cụ thể của tôi có một vài yêu cầu:

  • Sprites đang sử dụng pha trộn alpha và sprite có các khu vực trong suốt.
  • Có 2 loại yếu tố bao gồm nhân vật. Một người nên tạo hiệu ứng hình bóng, và người còn lại nên cư xử như bình thường.

Để loại bỏ các yếu tố tạo ra hình bóng, tôi kích hoạt ZWrite và vô hiệu hóa nó cho các yếu tố không.

Đối với nhân vật tôi đã thử đặt hàng đợi của shader thành trong suốt + 1 và thêm pass này:

Pass
{
    ZTest Greater
    Lighting Off
    Color [_Color]
}

Và hiệu quả hoạt động một phần:

  • Hình bóng được vẽ trên tất cả các nhân vật, ngay cả những phần trong suốt. Phần trong suốt không nên tạo ra một hình bóng.

  • Hình bóng được tạo ra khi nhân vật đứng sau một sprite, ngay cả khi phần đó của sprite trong suốt. Đằng sau một phần trong suốt của sprite không nên tạo ra hình bóng.

  • Nhân vật xuất hiện trước các yếu tố còn lại, ngay cả khi nó ở đằng sau chúng. Tôi đoán điều này là do thiết lập hàng đợi thành Minh bạch + 1. Nhưng nếu tôi để nó trong suốt, nhân vật được vẽ theo đúng thứ tự, nhưng hình bóng không bao giờ được nhìn thấy.

Tôi đã cố gắng làm theo những lời khuyên mà ai đó đã cho tôi, nhưng tôi không thể làm cho nó hoạt động:

1) Để lại pass mà làm cho các sprite như là.

2) Thêm một đường dẫn ghi vào bộ đệm z, nhưng có một shader sử dụng clip () để loại bỏ các pixel dựa trên alpha. Bạn không thể sử dụng bộ đệm z để thực hiện các kiểm tra z mềm mà không sử dụng MSAA và vùng phủ sóng alpha. Chất lượng của điều đó sẽ không tốt, nhưng đó là điều tốt nhất bạn có thể làm. Một thay thế nhanh hơn là một mô hình hoặc hòa âm tiếng ồn, hoặc một ngưỡng lỗi thời nếu các họa tiết của bạn có các cạnh khá sắc nét.

3) Thêm đường chuyền thứ ba vào các đối tượng có thể vẽ được màu ẩn bằng cách sử dụng phép thử z và đảm bảo rằng đường đó được vẽ dưới dạng đường chuyền cuối cùng.

Tôi là người mới đối với các shader, đặc biệt là trong Unity và tôi không thể tìm ra cách làm cho nó hoạt động bình thường.


Ví dụ thứ 2 của bạn chỉ đơn giản là trông một vệt màu xanh lục mờ được đặt trên ký tự. Bạn có thể muốn thoát khỏi cái đó và chỉ rời khỏi thứ 2, nếu đó là những gì bạn đang tìm kiếm.
Steve Harding

Câu trả lời:


1

Liệu video này bao gồm những điều cơ bản? Đó là một minh họa về việc tạo ra một vài phong cách phác thảo và hình bóng khác nhau từ các shader mà mọi người đã xuất bản.

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

Đó là một ví dụ về việc sử dụng trình đổ bóng được xuất bản trong Unity Wiki để thực hiện khá nhiều thứ bạn đang theo đuổi. Nội dung của trình đổ bóng bên dưới, mặc dù tôi nghĩ phần phác thảo của trình đổ bóng có thể không hoạt động như mong đợi trong 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"
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.