Сделайте том, чтобы c облачный фрагмент шейдера отбрасывал тени - PullRequest
0 голосов
/ 22 марта 2020

У меня есть шейдер рендеринга в облаке на Unity, который использует 3d-шум и лучевую метку. Это фрагментный шейдер на весь экран, основанный на этом уроке: https://www.youtube.com/watch?v=4QOcCGI6xOU


В настоящее время я освещаю облака, используя еще больше лучевых меток. У меня есть две проблемы с этим, во-первых, это дорого, во-вторых, мои облака не отбрасывают тени.


Я хочу, в основном, сказать Unity писать в динамическую c карту освещения и использовать ее для прекратить световой марш, если я знаю, что я тень облака.

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

Вот моя текущая структура кода, за исключением очень длинного кода Raymarching:

Shader "Jupiter/Clouds"
{

    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
    }
    SubShader
    {

        // No culling or depth
        Cull Off ZWrite Off ZTest Always

        Pass
        {
            CGPROGRAM

            #pragma vertex vert
            #pragma fragment frag

            #include "UnityCG.cginc"
            #include "Assets/Scripts/Clouds/Shaders/CloudDebug.cginc"

            // vertex input: position, UV
            struct appdata {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };

            struct v2f {
                float4 pos : SV_POSITION;
                float2 uv : TEXCOORD0;
                float3 viewVector : TEXCOORD1;
            };

            v2f vert (appdata v) {
                v2f output;
                output.pos = UnityObjectToClipPos(v.vertex);
                output.uv = v.uv;
                // Camera space matches OpenGL convention where cam forward is -z. In unity forward is positive z.
                // (https://docs.unity3d.com/ScriptReference/Camera-cameraToWorldMatrix.html)
                float3 viewVector = mul(unity_CameraInvProjection, float4(v.uv * 2 - 1, 0, -1));
                output.viewVector = mul(unity_CameraToWorld, float4(viewVector,0));
                return output;
            }

            // Textures
            Texture3D<float4> NoiseTex;
            Texture3D<float4> DetailNoiseTex;
            Texture2D<float4> WeatherMap;
            Texture2D<float4> BlueNoise;

            SamplerState samplerNoiseTex;
            SamplerState samplerDetailNoiseTex;
            SamplerState samplerWeatherMap;
            SamplerState samplerBlueNoise;

            sampler2D _MainTex;
            sampler2D _CameraDepthTexture;

            //tons of parameters

            float4 frag (v2f i) : SV_Target
            {
                //blablabla
                return float4(col,0);

            }

            ENDCG
        }
    }
}
...