В поисках направления и советов по созданию шейдерного прожектора, который затемняет все остальное в свете AR. - PullRequest
0 голосов
/ 04 сентября 2018

При разработке AR-игры, в которой используются прожекторы, чтобы подчеркнуть этот эффект, шейдер должен также затемнять все остальное в поле зрения камеры. Находясь в AR, я предполагаю, что мне понадобится шейдер с эффектом изображения, чтобы уменьшить вывод цвета на экран, чтобы имитировать меньшую яркость области вокруг пользователя; тем не менее, добавление эффекта Spotlight становится настоящей борьбой, и я действительно мог бы использовать некоторые указания и / или советы по достижению. Вот несколько примеров конечного результата, которого я хочу достичь:

Примеры прямых и угловых

Это то место, где я сейчас нахожусь со своим шейдером, в настоящее время я задаю только одну позицию объекта и позже буду беспокоиться о нескольких позициях.

Shader "Unlit/Spotlight"
{
    Properties
    {
        _MainTex("Texture", 2D) = "white" {}
        _PointOfInterest("POI Pos", vector) = (0,0,0,0)
        _CircleRadius("Spotlight size", Range(0,20)) = 3
        _RingSize("Ring Size", Range(0,5)) = 1
        _ColorTint("Room tint color", Color) = (0,0,0,0.5)
    }
    SubShader
    {
        Tags 
        {
            "Queue" = "Transparent"
            "RenderType"="Transparent"
        }

        LOD 100
        // Should be on for Post Process Effects
        ZWrite Off
        ZTest Always
        Cull Off
        // -----
        Blend SrcAlpha OneMinusSrcAlpha

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #pragma alpha : blend


            #include "UnityCG.cginc"

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

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

                // Have to bound the value somewhere on the GPU, texcoord can go up to 7
                float3 worldPos : TEXCOORD1;
            };

            sampler2D _MainTex;
            float4 _MainTex_ST;

            float4 _PointOfInterest;
            float _CircleRadius;
            float _RingSize;
            float4 _ColorTint;

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

                o.worldPos = mul(unity_WorldToObject, v.vertex).xyz;

                return o;

            }

            fixed4 frag (v2f i) : SV_Target
            {
                fixed4 darkShade = tex2D(_MainTex, i.uv) - _ColorTint;
                fixed4 col = tex2D(_MainTex, i.uv) - _ColorTint;
                float dist = distance(i.worldPos, _PointOfInterest.xyz);

                //*
                // Spotlight
                if(dist < _CircleRadius) 
                {
                    // inside the circle
                    col = tex2D(_MainTex, i.uv);
                }
                // Feathering
                else if (dist > _CircleRadius && dist < _CircleRadius + _RingSize) 
                {
                    float blendStrength = dist - _CircleRadius;
                    col = lerp(tex2D(_MainTex, i.uv), darkShade, blendStrength / _RingSize);
                }
                //*/

                return col;
            }
            ENDCG
        }
    }
}

Не ищите прямых решений, просто нужно направление, чтобы я не тратил слишком много времени в погоне за пунктом назначения, из которого я могу бежать.

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