stringtranslate.com

Шейдер

Пример двух видов затенения: плоское затенение слева и затенение Фонга справа. Затенение Фонга является улучшением затенения Гуро и было одной из первых моделей компьютерного затенения, разработанных после базового плоского шейдера, значительно улучшая внешний вид криволинейных поверхностей в рендерах. Шейдеры чаще всего используются для создания освещенных и затененных областей при рендеринге 3D-моделей .
Другое применение шейдеров — для спецэффектов, даже на 2D-изображениях (например, фото с веб-камеры ). Неизмененное, незатененное изображение находится слева, а справа к тому же изображению применен шейдер. Этот шейдер работает, заменяя все светлые области изображения белым цветом, а все темные области — ярко окрашенной текстурой.

В компьютерной графике шейдер это компьютерная программа , которая вычисляет соответствующие уровни света , темноты и цвета во время рендеринга 3D-сцены — процесс, известный как затенение . Шейдеры эволюционировали для выполнения различных специализированных функций в области компьютерных графических спецэффектов и постобработки видео , а также для вычислений общего назначения на графических процессорах .

Традиционные шейдеры вычисляют эффекты рендеринга на графическом оборудовании с высокой степенью гибкости. Большинство шейдеров кодируются для (и запускаются) графического процессора (GPU), [1] хотя это не является строгим требованием. Языки шейдеров используются для программирования конвейера рендеринга GPU , который в основном заменил фиксированный конвейер прошлого, который допускал только общие функции преобразования геометрии и пиксельного затенения ; с шейдерами можно использовать настраиваемые эффекты. Положение и цвет ( оттенок , насыщенность , яркость и контрастность ) всех пикселей , вершин и/или текстур, используемых для построения окончательного рендеринга изображения, могут быть изменены с помощью алгоритмов, определенных в шейдере, и могут быть изменены внешними переменными или текстурами, введенными компьютерной программой, вызывающей шейдер. [ требуется ссылка ]

Шейдеры широко используются в постобработке кино , компьютерной графике и видеоиграх для создания различных эффектов. Помимо простых моделей освещения, более сложные применения шейдеров включают: изменение оттенка , насыщенности , яркости ( HSL/HSV ) или контрастности изображения; создание размытия , светового блума , объемного освещения , нормального отображения (для эффектов глубины), боке , cel-шейдинга , постеризации , рельефного отображения , искажения , хроматического кеинга (для так называемых эффектов "синего экрана/ зеленого экрана "), обнаружения краев и движения , а также психоделических эффектов, таких как те, что можно увидеть в демосцене . [ необходимо разъяснение ]

История

Такое использование термина «шейдер» было представлено публике компанией Pixar в версии 3.0 спецификации интерфейса RenderMan , первоначально опубликованной в мае 1988 года. [2]

По мере развития графических процессоров основные библиотеки графического программного обеспечения, такие как OpenGL и Direct3D, начали поддерживать шейдеры. Первые графические процессоры с поддержкой шейдеров поддерживали только пиксельное затенение , но вершинные шейдеры были быстро введены, как только разработчики осознали мощь шейдеров. Первой видеокартой с программируемым пиксельным шейдером была Nvidia GeForce 3 (NV20), выпущенная в 2001 году. [3] Геометрические шейдеры были введены с Direct3D 10 и OpenGL 3.2. В конечном итоге графическое оборудование эволюционировало в сторону унифицированной модели шейдеров .

Дизайн

Шейдеры — это простые программы, которые описывают черты вершины или пикселя . Вершинные шейдеры описывают атрибуты (положение, координаты текстуры , цвета и т. д.) вершины, в то время как пиксельные шейдеры описывают черты (цвет, z-глубина и альфа- значение) пикселя. Вершинный шейдер вызывается для каждой вершины в примитиве (возможно, после тесселяции ); таким образом, одна вершина на входе, одна (обновленная) вершина на выходе. Затем каждая вершина визуализируется как ряд пикселей на поверхности (блоке памяти), которая в конечном итоге будет отправлена ​​на экран.

Шейдеры заменяют часть графического оборудования, обычно называемую Fixed Function Pipeline (FFP), так называемую потому, что она выполняет освещение и текстурирование жестко закодированным способом. Шейдеры предоставляют программируемую альтернативу этому жестко закодированному подходу. [4]

Базовый графический конвейер выглядит следующим образом:

Графический конвейер использует эти шаги для преобразования трехмерных (или двумерных) данных в полезные двумерные данные для отображения. В общем, это большая пиксельная матрица или « кадровый буфер ».

Типы

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

2D шейдеры

2D-шейдеры работают с цифровыми изображениями , также называемыми текстурами в области компьютерной графики. Они изменяют атрибуты пикселей . 2D-шейдеры могут принимать участие в рендеринге 3D-геометрии . В настоящее время единственным типом 2D-шейдера является пиксельный шейдер.

Пиксельные шейдеры

Пиксельные шейдеры, также известные как фрагментные шейдеры, вычисляют цвет и другие атрибуты каждого «фрагмента»: единицы работы рендеринга, влияющей максимум на один выходной пиксель . Простейшие виды пиксельных шейдеров выводят один экранный пиксель как значение цвета; возможны также более сложные шейдеры с несколькими входами/выходами. [5] Пиксельные шейдеры варьируются от простого вывода одного и того же цвета до применения значения освещения , выполнения рельефного отображения , теней , зеркальных бликов , полупрозрачности и других явлений. Они могут изменять глубину фрагмента (для Z-буферизации ) или выводить более одного цвета, если активны несколько целей рендеринга . В 3D-графике пиксельный шейдер сам по себе не может создавать некоторые виды сложных эффектов, поскольку он работает только с одним фрагментом, не имея знаний о геометрии сцены (т. е. данных вершин). Однако пиксельные шейдеры знают об отрисовываемой экранной координате и могут сэмплировать экран и близлежащие пиксели, если содержимое всего экрана передается шейдеру в качестве текстуры. Эта техника может обеспечить широкий спектр эффектов двухмерной постобработки , таких как размытие или обнаружение/улучшение краев для шейдеров мультфильмов/cel . Пиксельные шейдеры также могут применяться на промежуточных этапах к любым двухмерным изображениям — спрайтам или текстурам — в конвейере , тогда как вершинные шейдеры всегда требуют 3D-сцены. Например, пиксельный шейдер — это единственный тип шейдера, который может действовать как постпроцессор или фильтр для видеопотока после его растеризации .

3D шейдеры

3D-шейдеры действуют на 3D-модели или другую геометрию, но также могут получать доступ к цветам и текстурам, используемым для рисования модели или сетки . Вершинные шейдеры являются старейшим типом 3D-шейдеров, обычно вносящим изменения на основе каждой вершины. Более новые геометрические шейдеры могут генерировать новые вершины из шейдера. Тесселяционные шейдеры являются новейшими 3D-шейдерами; они действуют на пакеты вершин одновременно, чтобы добавлять детали, например, подразделять модель на более мелкие группы треугольников или других примитивов во время выполнения, чтобы улучшать такие вещи, как кривые и выпуклости, или изменять другие атрибуты.

Вершинные шейдеры

Вершинные шейдеры являются наиболее устоявшимся и распространенным типом 3D-шейдеров и запускаются один раз для каждой вершины , заданной графическому процессору. Цель состоит в том, чтобы преобразовать 3D-положение каждой вершины в виртуальном пространстве в 2D-координату, в которой она отображается на экране (а также значение глубины для Z-буфера). [6] Вершинные шейдеры могут манипулировать такими свойствами, как положение, цвет и координаты текстуры, но не могут создавать новые вершины. Выходные данные вершинного шейдера переходят на следующий этап конвейера, который является либо геометрическим шейдером, если он присутствует, либо растеризатором . Вершинные шейдеры могут обеспечить мощный контроль над деталями положения, движения, освещения и цвета в любой сцене, включающей 3D-модели .

Геометрические шейдеры

Геометрические шейдеры были введены в Direct3D 10 и OpenGL 3.2; ранее были доступны в OpenGL 2.0+ с использованием расширений. [7] Этот тип шейдера может генерировать новые графические примитивы , такие как точки, линии и треугольники, из тех примитивов, которые были отправлены в начало графического конвейера . [8]

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

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

Тесселяционные шейдеры

Начиная с OpenGL 4.0 и Direct3D 11, был добавлен новый класс шейдеров, называемый шейдером тесселяции. Он добавляет два новых этапа шейдеров к традиционной модели: шейдеры управления тесселяцией (также известные как шейдеры корпуса) и шейдеры оценки тесселяции (также известные как шейдеры домена), которые вместе позволяют подразделять более простые сетки на более мелкие сетки во время выполнения в соответствии с математической функцией. Функция может быть связана с различными переменными, в частности с расстоянием от камеры просмотра, чтобы обеспечить масштабирование активного уровня детализации . Это позволяет объектам, близким к камере, иметь более мелкие детали, в то время как более удаленные могут иметь более грубые сетки, но при этом казаться сопоставимыми по качеству. Это также может радикально сократить требуемую пропускную способность сетки, позволяя очищать сетки сразу внутри шейдерных блоков вместо понижения дискретизации очень сложных из памяти. Некоторые алгоритмы могут выполнять повышение разрешения любой произвольной сетки, в то время как другие позволяют вносить «подсказки» в сетки, чтобы указать наиболее характерные вершины и ребра.

Примитивные и сетчатые шейдеры

Около 2017 года в микроархитектуре AMD Vega появилась поддержка нового этапа шейдеров — примитивных шейдеров — в некоторой степени похожих на вычислительные шейдеры с доступом к данным, необходимым для обработки геометрии. [9] [10]

В 2018 году компания Nvidia представила сетчатые и шейдеры задач с микроархитектурой Turing , которые также смоделированы на основе вычислительных шейдеров. [11] [12] Nvidia Turing — первая в мире микроархитектура графических процессоров, которая поддерживает сетчатое шейдинг через API DirectX 12 Ultimate, за несколько месяцев до выпуска серии Ampere RTX 30. [13]

В 2020 году AMD и Nvidia выпустили микроархитектуры RDNA 2 и Ampere , которые поддерживают затенение сеток через DirectX 12 Ultimate . [14] Эти шейдеры сеток позволяют графическому процессору обрабатывать более сложные алгоритмы, перекладывая большую часть работы с центрального процессора на графический процессор, а при интенсивном рендеринге алгоритмов — на порядок увеличивая частоту кадров или количество треугольников в сцене. [15] Intel объявила, что графические процессоры Intel Arc Alchemist, поставляемые в первом квартале 2022 года, будут поддерживать шейдеры сеток. [16]

Шейдеры трассировки лучей

Шейдеры трассировки лучей поддерживаются Microsoft через DirectX Raytracing , Khronos Group через Vulkan , GLSL и SPIR-V , [17] Apple через Metal .

Тензорные шейдеры

Тензорные шейдеры могут быть интегрированы в NPU или GPU . Тензорные шейдеры поддерживаются Microsoft через DirectML , Khronos Group через OpenVX , Apple через Core ML , Google через TensorFlow , Linux Foundation через ONNX . [18]

Вычислительные шейдеры

Вычислительные шейдеры не ограничиваются графическими приложениями, но используют те же ресурсы выполнения для GPGPU . Они могут использоваться в графических конвейерах, например, для дополнительных стадий в алгоритмах анимации или освещения (например, тайловый прямой рендеринг ). Некоторые API рендеринга позволяют вычислительным шейдерам легко делиться ресурсами данных с графическим конвейером.

Параллельная обработка

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

Модель программирования с шейдерами похожа на функцию высшего порядка для рендеринга, принимающую шейдеры в качестве аргументов и предоставляющую определенный поток данных между промежуточными результатами, обеспечивая как параллелизм данных (по пикселям, вершинам и т. д.), так и параллелизм конвейера (между этапами). (см. также map reduce ).

Программирование

Язык, на котором программируются шейдеры, зависит от целевой среды. Официальным языком шейдеров OpenGL и OpenGL ES является OpenGL Shading Language , также известный как GLSL, а официальным языком шейдеров Direct3D является High Level Shader Language , также известный как HLSL. Cg , сторонний язык шейдеров, который выводит как шейдеры OpenGL, так и Direct3D, был разработан Nvidia ; однако с 2012 года он устарел. Apple выпустила собственный язык шейдеров под названием Metal Shading Language как часть фреймворка Metal .

Редакторы шейдеров GUI

Современные платформы разработки видеоигр , такие как Unity , Unreal Engine и Godot, все чаще включают в себя редакторы на основе узлов, которые могут создавать шейдеры без необходимости в реальном коде; вместо этого пользователю предоставляется направленный граф связанных узлов, который позволяет пользователям направлять различные текстуры, карты и математические функции в выходные значения, такие как диффузный цвет, зеркальный цвет и интенсивность, шероховатость/металличность, высота, нормаль и т. д. Затем автоматическая компиляция превращает граф в фактический скомпилированный шейдер.

Смотрите также

Ссылки

  1. ^ "LearnOpenGL - Шейдеры". learnopengl.com . Получено 12 ноября 2019 г. .
  2. ^ «Спецификация интерфейса RenderMan».
  3. ^ Lillypublished, Пол (19 мая 2009 г.). «От Voodoo до GeForce: потрясающая история 3D-графики». PC Gamer – через www.pcgamer.com.
  4. ^ "Обновление ShaderWorks - DirectX Blog". 13 августа 2003 г.
  5. ^ "Учебник GLSL – Фрагментный шейдер". 9 июня 2011 г.
  6. ^ "Учебник GLSL – Вершинный шейдер". 9 июня 2011 г.
  7. ^ Геометрический шейдер - OpenGL. Получено 21 декабря 2011 г.
  8. ^ «Этапы конвейера (Direct3D 10) (Windows)». msdn.microsoft.com . 6 января 2021 г.
  9. ^ «Представлена ​​Radeon RX Vega: AMD обещает производительность в играх в разрешении 4K за 499 долларов — Trusted Reviews». 31 июля 2017 г.
  10. ^ «Архитектура Vega от AMD раскрывается». 5 января 2017 г.
  11. ^ "Подробный обзор архитектуры NVIDIA Turing". 14 сентября 2018 г.
  12. ^ «Введение в шейдеры сеток Тьюринга». 17 сентября 2018 г.
  13. ^ «Выпущен драйвер DirectX 12 Ultimate Game Ready; также включает поддержку 9 новых игровых мониторов, совместимых с G-SYNC».
  14. ^ "Анонс DirectX 12 Ultimate". Блог разработчиков DirectX . 19 марта 2020 г. Получено 25 мая 2021 г.
  15. ^ «Реалистичное освещение в Justice с Mesh Shading». Блог разработчиков NVIDIA . 21 мая 2021 г. Получено 25 мая 2021 г.
  16. ^ Смит, Райан. «День архитектуры Intel 2021: краткий обзор архитектуры графического процессора Xe-HPG». www.anandtech.com .
  17. ^ "Vulkan Ray Tracing Final Specification Release". Блог. Khronos Group . 23 ноября 2020 г. Получено 22.02.2021 .
  18. ^ "Руководство по миграции NNAPI | Android NDK". Разработчики Android . Получено 1 августа 2024 г.

Дальнейшее чтение

Внешние ссылки