Пользовательский шейдер не получает свет - PullRequest
2 голосов
/ 13 января 2020

Я сделал пользовательский сеточный шейдер, который работает нормально. Тем не менее, на него не воздействует никакой свет. Просто, чтобы вы знали о плоскости, имеющей шейдер: его размеры 1000x1x1000 (настолько широкий), отображает тени с любым другим материалом и отбрасывает тени. Я использую Unity 2019.3.0f3 с конвейером универсальной визуализации.

Самолет, использующий пользовательский сеточный шейдер (не получает свет)

Самолет, использующий основ c шейдер (получение света)

Пользовательский код шейдера сетки

Я пробовал несколько решений, включая добавление FallBack "Diffuse" в конце или #include вместе с TRANSFER_SHADOW вещами. Однако они тоже не работают.

1 Ответ

1 голос
/ 13 января 2020

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

Shader "Custom/Grid"
{
    Properties
    {
        _GridThickness("Grid Thickness", Float) = 0.01
        _GridSpacing("Grid Spacing", Float) = 10.0
        _GridColour("Grid Colour", Color) = (0.5, 0.5, 0.5, 0.5)
        _BaseColour("Base Colour", Color) = (0.0, 0.0, 0.0, 0.0)
    }

        SubShader{
        Tags { "Queue" = "Transparent" }

        Pass {
        ZWrite Off
        Blend SrcAlpha OneMinusSrcAlpha

        Tags {
        "LightMode" = "ForwardBase"
        } // gets us access to main directional light


        CGPROGRAM

        // Define the vertex and fragment shader functions
        #pragma vertex vert
        #pragma fragment frag
        #include "UnityStandardBRDF.cginc" // for shader lighting info and some utils
        #include "UnityStandardUtils.cginc" // for energy conservation

        // Access Shaderlab properties
        uniform float _GridThickness;
        uniform float _GridSpacing;
        uniform float4 _GridColour;
        uniform float4 _BaseColour;

        // Input into the vertex shader
        struct vertexInput
        {
            float4 vertex : POSITION;
            float3 normal : NORMAL; // include normal info
        };

        // Output from vertex shader into fragment shader
        struct vertexOutput
        {
            float4 pos : SV_POSITION;
            float4 worldPos : TEXCOORD0;
            float3 normal : TEXCOORD1; // pass normals along
        };

        // VERTEX SHADER
        vertexOutput vert(vertexInput input)
        {
            vertexOutput output;
            output.pos = UnityObjectToClipPos(input.vertex);
            // Calculate the world position coordinates to pass to the fragment shader
            output.worldPos = mul(unity_ObjectToWorld, input.vertex);

            output.normal = input.normal; //get normal for frag shader from vert info

            return output;
        }

        // FRAGMENT SHADER
        float4 frag(vertexOutput input) : COLOR
        {
            float3 lightDir = _WorldSpaceLightPos0.xyz;
            float3 viewDir = normalize(_WorldSpaceCameraPos - input.worldPos);
            float3 lightColor = _LightColor0.rgb;

            float3 col;

            if (frac(input.worldPos.x / _GridSpacing) < _GridThickness || frac(input.worldPos.z / _GridSpacing) < _GridThickness)
                col = _GridColour;
            else
                col = _BaseColour;

            col *= lightColor * DotClamped(lightDir, input.normal); // apply diffuse light by angle of incidence

            return float4(col, 1);
        }
        ENDCG
        }
    }
}

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

Установка FallBack "Diffuse" здесь ничего не изменит, поскольку шейдер не «отступает», он работает точно так, как вы его запрограммировали без света и теней.

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