Маскирование 3D-объекта с помощью настраиваемого шейдера в Unity - PullRequest
0 голосов
/ 05 мая 2020

Я делаю 2D мобильную игру, но хочу использовать 3D-объекты в разделе магазина. Итак, в разделе магазина у меня есть прямоугольник прокрутки и область просмотра. Я могу прокручивать, и компонент маски работает должным образом с 2D-объектами. Но когда я добавляю 3D-объекты, объекты выходят за пределы маски. Я исследовал форумы и нашел собственный шейдер. Когда я применяю шейдер к материалам объектов, он частично работает. Но глубина или тени не работают должным образом. Я мало что знаю о шейдерах. Вы можете взглянуть на это Изображение . Поле справа - исходное, поле слева - это поле с настраиваемым шейдером.

Мой код шейдера здесь;

Shader "Custom/NewSurfaceShader" {
Properties {
    _Color ("Color", Color) = (1,1,1,1)
    _MainTex ("Albedo (RGB)", 2D) = "white" {}
    _Glossiness ("Smoothness", Range(0,1)) = 0.5
    _Metallic ("Metallic", Range(0,1)) = 0.0


    _StencilComp("Stencil Comparison", Float) = 8
    _Stencil("Stencil ID", Float) = 0
    _StencilOp("Stencil Operation", Float) = 0
    _StencilWriteMask("Stencil Write Mask", Float) = 255
    _StencilReadMask("Stencil Read Mask", Float) = 255

    _ColorMask("Color Mask", Float) = 15

    [Toggle(UNITY_UI_ALPHACLIP)] _UseUIAlphaClip("Use Alpha Clip", Float) = 0
}

SubShader 
{
    Tags { "RenderType"="UI""Queue"="Transparent" }
    LOD 200
    ZTest[unity_GUIZTestMode]
    Blend SrcAlpha OneMinusSrcAlpha
    ColorMask[_ColorMask]

    Stencil
    {
        Ref 1
        Comp LEqual
        Pass Keep
        ReadMask [_StencilReadMask]
        WriteMask [_StencilWriteMask]
    }

    CGPROGRAM
    #pragma surface surf Standard vertex:vert fullforwardshadows

    #pragma target 3.0

    #include "UnityUI.cginc"

    struct Input 
    {
        float2 uv_MainTex;
        float4 worldPosition;
    };

    void vert(inout appdata_full v, out Input o)
    {
        UNITY_INITIALIZE_OUTPUT(Input, o);
        o.worldPosition = v.vertex;
    }

    sampler2D _MainTex;
    half _Glossiness;
    half _Metallic;
    fixed4 _Color;
    float4 _ClipRect;

    void surf (Input IN, inout SurfaceOutputStandard o) {
        // Albedo comes from a texture tinted by color
        fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;
        o.Albedo = c.rgb;
        // Metallic and smoothness come from slider variables
        o.Metallic = _Metallic;
        o.Smoothness = _Glossiness;
        o.Alpha = c.a;
        o.Alpha *= UnityGet2DClipping(IN.worldPosition.xy, _ClipRect);

    #ifdef UNITY_UI_ALPHACLIP
        clip(o.Alpha - 0.001);
        #endif
    }
    ENDCG
}
FallBack "Diffuse"

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...