Как покрасить общее пространство между двумя изображениями? - PullRequest
0 голосов
/ 13 декабря 2018

Мне нужна эта идея для моей новой игровой концепции, но я не могу найти решение самостоятельно и даже на форуме Unity.

Пожалуйста, есть ли разработчик Unity, который может мне помочь?

EXAMPLE

Спасибо

1 Ответ

0 голосов
/ 13 декабря 2018

Решение, которое я использовал для достижения этого результата, состоит в том, чтобы использовать двухпроходный трафаретный шейдер и изменить фон камеры на сплошной цвет - белый.

В шейдере есть проходы (цвет жестко закодирован).Затем просто создайте материал с помощью этого шейдера и поместите его в сетки.

Да, эта версия работает только с сетками правильной формы.Поэтому, если вам нужен круг или треугольник, экспортируйте сетку из механизма трехмерного моделирования и используйте ее в Unity с этим шейдером.

Shader "Custom/NewSurfaceShader"{
Properties {}
SubShader 
{
    Tags { "RenderType"="Geometry" }

    Pass
    {
        Stencil
        {
            Comp always
            Pass IncrSat
        }

        CGPROGRAM
        #pragma vertex vert
        #pragma fragment frag

        struct appdata
        {
            float4 vertex : POSITION;
            float2 uv : TEXCOORD0;
        };

        struct v2f
        {
            float2 uv : TEXCOORD0;
            float4 vertex : SV_POSITION;
        };

        sampler2D _MainTex;
        float4 _MainTex_ST;

        v2f vert (appdata v)
        {
            v2f o;
            o.vertex = UnityObjectToClipPos(v.vertex);
            o.uv = v.uv;

            return o;
        }

        fixed4 frag (v2f i) : SV_Target
        {
            fixed4 col = fixed4(0, 0, 0, 1);
            return col;
        }
        ENDCG
    }

    Pass
    {
        Stencil
        {
            Ref 1
            Comp Less
        }

        CGPROGRAM
        #pragma vertex vert
        #pragma fragment frag

        struct appdata
        {
            float4 vertex : POSITION;
            float2 uv : TEXCOORD0;
        };

        struct v2f
        {
            float2 uv : TEXCOORD0;
            float4 vertex : SV_POSITION;
        };

        sampler2D _MainTex;
        float4 _MainTex_ST;

        v2f vert (appdata v)
        {
            v2f o;
            o.vertex = UnityObjectToClipPos(v.vertex);
            o.uv = v.uv;

            return o;
        }

        fixed4 frag (v2f i) : SV_Target
        {
            fixed4 col = fixed4(1, 1, 1, 1);
            return col;
        }
        ENDCG
    }
}

}

This is the result


Редактировать:

Просто обновил шейдер, в этом решении он работает и с формами спрайтов.Вам больше не нужно создавать сетки.Единственным недостатком является то, что теперь он находится на 3 проходах шейдеров.

    Shader "Unlit/NewUnlitShader"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 100

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            struct appdata_t
            {
                float4 vertex   : POSITION;
                float4 color    : COLOR;
                float2 uv : TEXCOORD0;
            };

            struct v2f
            {
                float4 vertex   : SV_POSITION;
                fixed4 color    : COLOR;
                float2 uv  : TEXCOORD0;
            };

            sampler2D _MainTex;

            v2f vert (appdata_t v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = v.uv;
                o.color = v.color;

                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
                // sample the texture
                fixed4 col = tex2D(_MainTex, i.uv);
                col = col * i.color;

                if(col.a < .5f)
                {
                    discard;
                }

                return col;
            }

            ENDCG
        }

        Pass
        {
            Stencil
            {
                Comp always
                Pass IncrSat
            }

            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            struct appdata_t
            {
                float4 vertex   : POSITION;
                float4 color    : COLOR;
                float2 uv : TEXCOORD0;
            };

            struct v2f
            {
                float4 vertex   : SV_POSITION;
                fixed4 color    : COLOR;
                float2 uv  : TEXCOORD0;
            };

            sampler2D _MainTex;

            v2f vert (appdata_t v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = v.uv;
                o.color = v.color;

                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
                // sample the texture
                fixed4 col = fixed4(0, 0, 0, 1);
                return col;
            }
            ENDCG
        }

        Pass
        {
            Stencil
            {
                Ref 1
                Comp Less
            }

            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            struct appdata_t
            {
                float4 vertex   : POSITION;
                float4 color    : COLOR;
                float2 uv : TEXCOORD0;
            };

            struct v2f
            {
                float4 vertex   : SV_POSITION;
                fixed4 color    : COLOR;
                float2 uv  : TEXCOORD0;
            };

            sampler2D _MainTex;

            v2f vert (appdata_t v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = v.uv;
                o.color = v.color;

                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
                fixed4 col = fixed4(1, 1, 1, 1);
                return col;
            }
            ENDCG
        }
    }
}

enter image description here

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