Нужно добавить альфа в пользовательский шейдер Unity3D - PullRequest
0 голосов
/ 19 июня 2019

Я пытался изменить этот шейдер "проецирования изображения", добавив управляемый альфа-канал. Я не очень хорошо разбираюсь в шейдерах, поэтому я ищу помощи. Вот код, который работает без каких-либо альфа-реализаций. Спасибо!

Shader"Custom/DiffuseWithShadow"
{
 Properties
{
    _MainTex("Main Texture", 2D) = "white" {}
    _ShadowMap("Shadow Map", 2D) = "white" {}
    _Angle("Angle", Float) = 0.0
}
    SubShader
    {
        Tags { "RenderType" = "Opaque" }
        LOD 200

Pass
        {
            CGPROGRAM
            // Upgrade NOTE: excluded shader from OpenGL ES 2.0 because it does not contain a surface program or both vertex and fragment programs.
            #pragma exclude_renderers gles

            #pragma vertex v
            #pragma fragment p

            uniform sampler2D _MainTex;
            uniform sampler2D _ShadowMap;
            uniform float4x4 _LightViewProj;
            uniform float _Angle;


            struct VertexOut
            {
                float4 position : POSITION;
                float2 uv : TEXCOORD0;
                float4 proj : TEXCOORD1;
            };

            VertexOut v(float4 position : POSITION, float2 uv : TEXCOORD0)
            {
                VertexOut OUT;

                OUT.position = UnityObjectToClipPos(position);
                OUT.uv = uv;
                OUT.proj = mul(mul(unity_ObjectToWorld, float4(position.xyz, 1)), _LightViewProj);

                return OUT;
            }

            struct PixelOut
            {
                float4  color : COLOR;
            };

            PixelOut p(VertexOut IN)
            {
                PixelOut OUT;

                float2 ndc = float2(IN.proj.x / IN.proj.w, IN.proj.y / IN.proj.w);
                float2 uv = (1 + float2(ndc.x, ndc.y)) * 0.5;

                float theta = _Angle * 3.14159 / 180;
                float2x2 matRot = float2x2(cos(theta), sin(theta),
                                            -sin(theta), cos(theta));
                uv = mul(uv, matRot);

                float4 c = tex2D(_ShadowMap, uv);

                if (uv.x < 0 || uv.y < 0 ||
                    uv.x > 1 || uv.y > 1 || c.a <= 0.00f)
                    {
                        c = tex2D(_MainTex, IN.uv);
                    }

                OUT.color = c;

                return OUT;
            }

            ENDCG
        }

    }
        FallBack"Diffuse"
  }

Я нашел несколько полезных источников, но наверняка что-то упустил. Вот почему я попытался добавить альфа-шейдер в Unity3D

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