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

Проверка или запись в буфер шаблона в шейдере

В буфере шаблона хранится 8-битное целое число для каждого пикселя в буфере кадра. Перед выполнением фрагментного шейдера для данного пикселя, GPU может сравнить текущее значение в буфере шаблона с заданным значением отсылки. Это называется тестом шаблона. Если тест шаблона проходит, GPU выполняет тест глубины. Если тест шаблона не проходит, GPU пропускает остальную обработку для этого пикселя. Это означает, что вы можете использовать буфер шаблона как маску, чтобы сказать GPU, какие пиксели рисовать, а какие отбрасывать.

Как правило, буфер шаблона используется для специальных эффектов, таких как порталы или зеркала. Кроме того, буфер шаблона иногда используется при отображении жестких теней, или конструктивной геометрии твёрдого тела (CSG).

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

Используйте параметры Ref, ReadMaskи Comp для настройки теста шаблона. Используйте параметры Ref, WriteMask, Pass, Failи ZFail для настройки операции записи шаблона.

Эта команда меняет состояние рендеринга. Используйте её в блоке Passчтобы задать состояние рендеринга для этого прохода, либо используйте её в блоке SubShaderчтобы задать состояние рендеринга для всех проходов в этом SubShader.

Уравнение для испытания с использованием трафарета является следующим:

(ref & readMask) comparisonFunction (stencilBufferValue & readMask)

Примеры

Shader "Examples/CommandExample"
{
    SubShader
    {
         // The rest of the code that defines the SubShader goes here.

        Pass
        {    
             // All pixels in this Pass will pass the stencil test and write a value of 2 to the stencil buffer
             // You would typically do this if you wanted to prevent subsequent shaders from drawing to this area of the render target or restrict them to render to this area only
             Stencil
             {
                 Ref 2
                 Comp Always
                 Pass Replace
             }            

             // The rest of the code that defines the Pass goes here.
        }
    }
}

Этот пример кода демонстрирует синтаксис для использования этой команды в блоке SubShader.

Shader "Examples/CommandExample"
{
    SubShader
    {
             // All pixels in this SubShader pass the stencil test only if the current value of the stencil buffer is less than 2
             // You would typically do this if you wanted to only draw to areas of the render target that were not "masked out"
             Stencil
             {
                 Ref 2
                 Comp Less
             }  

         // The rest of the code that defines the SubShader goes here.        

        Pass
        {    
              // The rest of the code that defines the Pass goes here.
        }
    }
}

Дополнительные ресурсы