首页 > 解决方案 > 在 Unity 中使用自定义着色器遮罩 3D 对象

问题描述

我正在制作 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"

}

标签: unity3d3dshadermasking

解决方案


推荐阅读