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

Написать не освещенный базовый шейдер в URP

В этом примере показан базовый шейдер, совместимый с URP. Этот шейдер заполняет форму сетки цветом, предварительно определенным в коде шейдера.

Чтобы попробовать шейдер самостоятельно, скопируйте и вставьте следующий код ShaderLab в ассет Shader.

Примечание: Если вы включили режим глубинного грунтовки в URP активе, то этот шейдер отображает непрозрачные объекты как невидимые. Дополнительную информацию см. в Запись глубины только в шейдере.

// This shader fills the mesh shape with a color predefined in the code.
Shader "Example/URPUnlitShaderBasic"
{
    // The properties block of the Unity shader. In this example this block is empty
    // because the output color is predefined in the fragment shader code.
    Properties
    { }

    // The SubShader block containing the Shader code.
    SubShader
    {
        // SubShader Tags define when and under which conditions a SubShader block or
        // a pass is executed.
        Tags { "RenderType" = "Opaque" "RenderPipeline" = "UniversalPipeline" }

        Pass
        {
            // The HLSL code block. Unity SRP uses the HLSL language.
            HLSLPROGRAM
            // This line defines the name of the vertex shader.
            #pragma vertex vert
            // This line defines the name of the fragment shader.
            #pragma fragment frag

            // The Core.hlsl file contains definitions of frequently used HLSL
            // macros and functions, and also contains #include references to other
            // HLSL files (for example, Common.hlsl, SpaceTransforms.hlsl, etc.).
            #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"

            // The structure definition defines which variables it contains.
            // This example uses the Attributes structure as an input structure in
            // the vertex shader.
            struct Attributes
            {
                // The positionOS variable contains the vertex positions in object
                // space.
                float4 positionOS   : POSITION;
            };

            struct Varyings
            {
                // The positions in this struct must have the SV_POSITION semantic.
                float4 positionHCS  : SV_POSITION;
            };

            // The vertex shader definition with properties defined in the Varyings
            // structure. The type of the vert function must match the type (struct)
            // that it returns.
            Varyings vert(Attributes IN)
            {
                // Declaring the output object (OUT) with the Varyings struct.
                Varyings OUT;
                // The TransformObjectToHClip function transforms vertex positions
                // from object space to homogenous clip space.
                OUT.positionHCS = TransformObjectToHClip(IN.positionOS.xyz);
                // Returning the output.
                return OUT;
            }

            // The fragment shader definition.
            half4 frag() : SV_Target
            {
                // Defining the color variable and returning it.
                half4 customColor = half4(0.5, 0, 0, 1);
                return customColor;
            }
            ENDHLSL
        }
    }
}

Шейдер фрагмента окрашивает GameObject темно-красным цветом (значение RGB (0.5, 0, 0)).

Шейдер рисует GameObject темно-красный
Шейдер рисует GameObject темно-красный

Следующий раздел познакомит вас со структурой этого базового шейдера Unity.

Основная структура ShaderLab

Unity шейдеры написаны на Unity-специфическом языке под названием ShaderLab.

Шейдер Unity в этом примере состоит из следующих блоков:

Блок шейдера

Код ShaderLab начинается с объявления Shader.

Shader "Example/URPUnlitShaderBasic"

Путь в этом заявлении определяет отображаемое имя и расположение шейдера Unity в меню Shader на Материале. Метод Shader.Find также использует этот путь.

Расположение шейдера в меню Shader на материале
Расположение шейдера в меню Shader на материале

Блок свойств

Блок Свойства содержит объявления свойств, которые пользователи могут установить в окне Inspector для Материала.

В этом примере блок Свойства пуст, потому что этот шейдер Unity не показывает никаких свойств Материала, которые пользователь может определить.

Блок SubShader

Исходный файл шейдера Unity содержит один или несколько блоков SubShader. При рендеринге сетки Unity выбирает первый блок SubShader, совместимый с блоком GPU на целевом устройстве.

Блок SubShader может по желанию содержать блок SubShader Tags. Используйте ключевое слово Tags для объявления блока SubShader Tags.

Tags { "RenderType" = "Opaque" "RenderPipeline" = "UniversalPipeline" }

Тег SubShader с именем RenderPipeline сообщает Unity, какие конвейеры рендеринга должны использовать этот SubShader, а значение UniversalPipeline указывает, что Unity должен использовать этот SubShader с URP.

Чтобы выполнить один и тот же шейдер в разных конвейерах рендеринга, создайте несколько блоков SubShader с разными значениями тегов RenderPipeline. Чтобы выполнить блок SubShader в HDRP, установите тег RenderPipeline на HDRenderPipeline, чтобы выполнить его в Built-in Render Pipeline, установите RenderPipeline на пустое значение.

Для получения дополнительной информации о SubShader метках, см. ShaderLab: SubShader Метки.

Блок пропусков

В этом примере есть один блок Pass, который содержит код программы HLSL. Дополнительную информацию о блоках Pass см. в ShaderLab: Pass.

Блок Пропуск может по желанию содержать блок Метки Пропуска. Дополнительные сведения см. в URP ShaderLab Метки Пропуска.

Блок HLSLPROGRAM

Этот блок содержит код программы HLSL.

Примечание: HLSL язык является предпочтительным языком URP шейдеры.

Этот блок содержит декларацию #include со ссылкой на файл Core.hlsl.

#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"

Файл Core.hlsl содержит определения часто используемых макросов и функций HLSL, а также содержит #include ссылки на другие файлы HLSL (например, Common.hlsl и SpaceTransforms.hlsl).

Например, вершинный шейдер в коде HLSL использует функцию TransformObjectToHClip из файла SpaceTransforms.hlsl. Функция преобразует позиции вершин из объектного пространства в однородное пространство:

Varyings vert(Attributes IN)
{
    Varyings OUT;
    OUT.positionHCS = TransformObjectToHClip(IN.positionOS.xyz);
    return OUT;
}

Примечание: Не импортируйте файлы библиотеки шейдеров из Scriptable Render Pipeline (SRP) и Встроенного Render Pipeline в один и тот же шейдер. Некоторые макросы и функции шейдера SRP могут вступать в конфликт с функциями шейдера Built-in Render Pipeline. Дополнительную информацию см. в разделах Методы шейдера в URP и Импорт файла из библиотеки шейдеров в Встроенном Render Pipeline.

Шейдер фрагмента в этом базовом коде HLSL выводит один цвет, предварительно определенный в коде:

half4 frag() : SV_Target
{
    half4 customColor;
    customColor = half4(0.5, 0, 0, 1);
    return customColor;
}

Раздел URP не освещенный шейдер с вводом цвета показывает, как добавить редактируемое свойство цвета в окно Inspector на Материале.