Unity 6.3
0 онлайн 118 гостей 3 в системе
Вход
Материалы и шейдеры Шаг 341 из 442

Пример шейдера отражений во встроенном Render Pipeline

Кот-подобный персонаж с металлической поверхностью, которая отражает сцену.
Кот-подобный персонаж с металлической поверхностью, которая отражает сцену.

Когда Skybox используется в сцене как источник отражения (см. Освещение окна), то по сути дела " по умолчанию " Зонд отражения Создается файл, содержащий данные Skybox. Зонд отражения является внутренней частью Кубическая карта текстура; мы расширим вышеуказанный шейдер норм мирового пространства, чтобы посмотреть на это.

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

Shader "Unlit/SkyReflection"
{
    SubShader
    {
        Pass
        {
            HLSLPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"

            struct v2f {
                half3 worldRefl : TEXCOORD0;
                float4 pos : SV_POSITION;
            };

            v2f vert (float4 vertex : POSITION, float3 normal : NORMAL)
            {
                v2f o;
                o.pos = UnityObjectToClipPos(vertex);
                // compute world space position of the vertex
                float3 worldPos = mul(_Object2World, vertex).xyz;
                // compute world space view direction
                float3 worldViewDir = normalize(UnityWorldSpaceViewDir(worldPos));
                // world space normal
                float3 worldNormal = UnityObjectToWorldNormal(normal);
                // world space reflection vector
                o.worldRefl = reflect(-worldViewDir, worldNormal);
                return o;
            }
        
            fixed4 frag (v2f i) : SV_Target
            {
                // sample the default reflection cubemap, using the reflection vector
                half4 skyData = UNITY_SAMPLE_TEXCUBE(unity_SpecCube0, i.worldRefl);
                // decode cubemap data into actual color
                half3 skyColor = DecodeHDR (skyData, unity_SpecCube0_HDR);
                // output it!
                fixed4 c = 0;
                c.rgb = skyColor;
                return c;
            }
            ENDHLSL
        }
    }
}

Приведенный выше пример использует несколько вещей из встроенного шейдера , включая файлы:

  • unity_SpecCube0, unity_SpecCube0_HDR, Object2World, UNITY_MATRIX_MVP из встроенных переменных шейдера. unity_SpecCube0 содержат данные для активного зонда отражения.
  • UNITY_SAMPLE_TEXCUBE является макросом встроенным в для выборки кубического отображения. Большинство обычных кубических отображений декларируются и используются с помощью стандартного синтаксиса HLSL (samplerCUBE и texCUBE), однако кубические отображения зонда отражения в Unity декларируются особым способом для экономии на слотах выборки. Если вы не знаете, что это такое, не волнуйтесь, просто знайте, что для использования unity_SpecCube0 кубического отображения вам нужно использовать макрос UNITY_SAMPLE_TEXCUBE.
  • UnityWorldSpaceViewDir функция из UnityCG.cginc, и DecodeHDR функция из того же файла. Последний используется для получения фактического цвета из данных отражательного зонда – так как Unity хранит кубическую карту отражательного зонда в специально кодированном виде.
  • reflect — это просто встроенная функция HLSL для вычисления векторного отражения вокруг заданной нормы.