Шейдер
В этой статье есть несколько проблем. Пожалуйста, помогите улучшить его или обсудите эти проблемы на странице обсуждения . ( Узнайте, как и когда удалять эти шаблонные сообщения )
|
В компьютерной графике шейдер — это компьютерная программа , которая вычисляет соответствующие уровни света , темноты и цвета во время рендеринга — 3D-сцены процесс, известный как затенение . Шейдеры эволюционировали для выполнения множества специализированных функций в области спецэффектов компьютерной графики и постобработки видео , а также вычислений общего назначения на графических процессорах .
Традиционные шейдеры рассчитывают эффекты рендеринга на графическом оборудовании с высокой степенью гибкости. Большинство шейдеров кодируются (и запускаются) для графического процессора (GPU). [ 1 ] хотя это не строгое требование. Языки шейдинга используются для программирования конвейера рендеринга графического процессора , который в основном заменил конвейер с фиксированными функциями прошлого, который позволял использовать только общие преобразования геометрии и пиксельного затенения функции ; с помощью шейдеров можно использовать индивидуальные эффекты. Положение или и цвет ( оттенок , насыщенность , яркость и контраст ) всех пикселей , вершин и/или текстур, используемых для построения окончательного визуализированного изображения, могут быть изменены с помощью алгоритмов, определенных в шейдере, и могут быть изменены внешними переменными текстурами. представлен компьютерной программой, вызывающей шейдер. [ нужна ссылка ]
Шейдеры широко используются в кино постобработке , компьютерных изображениях и видеоиграх для создания различных эффектов. Помимо простых моделей освещения, более сложное использование шейдеров включает в себя: изменение оттенка , насыщенности , яркости ( HSL/HSV ) или контрастности изображения; создание размытия , светового пятна , объемного освещения , отображения нормалей (для эффектов глубины), боке , затенения целла , постеризации , рельефного отображения , искажения , хромакейинга (для так называемых эффектов «синего/ зеленого экрана »), обнаружения краев и движения , например а также психоделические эффекты, подобные тем, что наблюдаются на демосцене . [ нужны разъяснения ]
История
[ редактировать ]Такое использование термина «шейдер» было представлено публике компанией Pixar в версии 3.0 спецификации интерфейса RenderMan , первоначально опубликованной в мае 1988 года. [ 2 ]
По мере развития графических процессоров основные библиотеки графического программного обеспечения, такие как OpenGL и Direct3D, начали поддерживать шейдеры. Первые графические процессоры с поддержкой шейдеров поддерживали только пиксельное затенение , но вершинные шейдеры были быстро представлены, как только разработчики осознали мощь шейдеров. Первой видеокартой с программируемым пиксельным шейдером стала Nvidia GeForce 3 (NV20), выпущенная в 2001 году. [ 3 ] Шейдеры геометрии были представлены в Direct3D 10 и OpenGL 3.2. Со временем графическое оборудование эволюционировало в сторону единой модели шейдеров .
Дизайн
[ редактировать ]Шейдеры — это простые программы, описывающие характеристики вершины или пикселя . Вершинные шейдеры описывают атрибуты (положение, координаты текстуры , цвета и т. д.) вершины, а пиксельные шейдеры описывают характеристики (цвет, z-глубину и значение альфа ) пикселя. Вершинный шейдер вызывается для каждой вершины в примитиве (возможно, после тесселяции ); таким образом, одна вершина входит, одна (обновленная) вершина выходит. Каждая вершина затем отображается как серия пикселей на поверхности (блоке памяти), которая в конечном итоге будет отправлена на экран.
Шейдеры заменяют часть графического оборудования, обычно называемую конвейером фиксированных функций (FFP), названную так потому, что она освещения жестко выполняет наложение и текстур. Шейдеры представляют собой программируемую альтернативу этому жестко запрограммированному подходу. [ 4 ]
Базовый графический конвейер выглядит следующим образом:
- ЦП отправляет инструкции (скомпилированные программы языка шейдеров ) и геометрические данные в графический процессор, расположенный на видеокарте.
- Внутри вершинного шейдера геометрия преобразуется.
- Если шейдер геометрии находится в графическом процессоре и активен, выполняются некоторые изменения геометрии сцены.
- Если шейдер тесселяции находится в графическом процессоре и активен, геометрию сцены можно подразделить .
- Рассчитанная геометрия является триангулированной (разделенной на треугольники).
- Треугольники разбиваются на четырехугольники фрагментов (один четырехугольник фрагментов представляет собой примитив фрагмента 2 × 2).
- Квадраты фрагментов изменяются в соответствии с фрагментным шейдером.
- Выполняется испытание глубины; Проходящие фрагменты будут записаны на экран и могут быть смешаны с буфером кадра .
Графический конвейер использует эти шаги для преобразования трехмерных (или двумерных) данных в полезные для отображения двумерные данные. В общем, это большая пиксельная матрица или « кадровый буфер ».
Типы
[ редактировать ]Обычно используются три типа шейдеров (пиксельные, вершинные и геометрические шейдеры), и еще несколько недавно были добавлены. В то время как старые видеокарты используют отдельные процессоры для каждого типа шейдеров, новые карты оснащены унифицированными шейдерами , которые способны выполнять шейдеры любого типа. Это позволяет видеокартам более эффективно использовать вычислительную мощность.
2D шейдеры
[ редактировать ]2D-шейдеры воздействуют на цифровые изображения , также называемые текстурами в области компьютерной графики. Они изменяют атрибуты пикселей . 2D-шейдеры могут принимать участие в рендеринге 3D-геометрии . В настоящее время единственным типом 2D-шейдера является пиксельный шейдер.
Пиксельные шейдеры
[ редактировать ]Пиксельные шейдеры, также известные как фрагментные шейдеры, вычисляют цвет и другие атрибуты каждого «фрагмента»: единицы работы рендеринга, влияющей максимум на один выходной пиксель . Простейшие виды пиксельных шейдеров выводят один пиксель экрана как значение цвета; возможны также более сложные шейдеры с несколькими входами/выходами. [ 5 ] Пиксельные шейдеры варьируются от простого вывода одного и того же цвета до применения значения освещения , выполнения рельефного отображения , теней , зеркальных бликов , полупрозрачности и других явлений. Они могут изменять глубину фрагмента (для Z-буферизации ) или выводить более одного цвета, если несколько целей рендеринга активны . В 3D-графике пиксельный шейдер сам по себе не может создавать некоторые виды сложных эффектов, поскольку он работает только с одним фрагментом, без знания геометрии сцены (т.е. данных вершин). Однако пиксельные шейдеры знают координаты рисуемого экрана и могут считывать данные с экрана и близлежащих пикселей, если содержимое всего экрана передается в шейдер в виде текстуры. Этот метод может обеспечить широкий спектр двумерных эффектов постобработки , таких как размытие или обнаружение/улучшение краев для мультипликационных/цел-шейдеров . Пиксельные шейдеры также можно применять на промежуточных этапах к любым двумерным изображениям — спрайтам или текстурам — в конвейере , тогда как вершинным шейдерам всегда требуется трехмерная сцена. Например, пиксельный шейдер — единственный вид шейдера, который может действовать как постпроцессор или фильтр для видеопотока после его растеризации .
3D shaders
[ редактировать ]3D-шейдеры воздействуют на 3D-модели или другую геометрию, но также могут получать доступ к цветам и текстурам, используемым для рисования модели или сетки . Вершинные шейдеры — это самый старый тип 3D-шейдеров, обычно вносящий изменения для каждой вершины. Новые шейдеры геометрии могут генерировать новые вершины изнутри шейдера. Шейдеры тесселяции — это новейшие 3D-шейдеры; они воздействуют на группы вершин одновременно, чтобы добавить детали — например, разделить модель на более мелкие группы треугольников или других примитивов во время выполнения, улучшить такие вещи, как кривые и неровности , или изменить другие атрибуты.
Вершинные шейдеры
[ редактировать ]Вершинные шейдеры являются наиболее распространённым видом 3D-шейдеров и запускаются один раз для каждой вершины , переданной графическому процессору. Цель состоит в том, чтобы преобразовать трехмерное положение каждой вершины в виртуальном пространстве в двухмерную координату, в которой она появляется на экране (а также значение глубины для 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 — это первая в мире микроархитектура графического процессора, которая поддерживает затенение сетки через DirectX 12 Ultimate API, за несколько месяцев до выпуска серии 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 рендеринга позволяют вычислительным шейдерам легко обмениваться ресурсами данных с графическим конвейером.
Параллельная обработка
[ редактировать ]Шейдеры пишутся для одновременного применения преобразований к большому набору элементов, например к каждому пикселю в области экрана или к каждой вершине модели. Это хорошо подходит для параллельной обработки , и большинство современных графических процессоров имеют несколько конвейеров шейдеров , что позволяет значительно повысить производительность вычислений.
Модель программирования с шейдерами аналогична функции более высокого порядка для рендеринга, принимающей шейдеры в качестве аргументов и обеспечивающей определенный поток данных между промежуточными результатами, обеспечивая как параллелизм данных (по пикселям, вершинам и т. д.), так и конвейерный параллелизм (между этапами). (см. также карту сокращения ).
Программирование
[ редактировать ]Язык, на котором программируются шейдеры, зависит от целевой среды. Официальным языком шейдеров OpenGL и OpenGL ES является язык шейдеров OpenGL , также известный как GLSL, а официальным языком шейдеров Direct3D — язык шейдеров высокого уровня , также известный как HLSL. Cg , сторонний язык шейдеров, который выводит как шейдеры OpenGL, так и Direct3D, был разработан Nvidia ; однако с 2012 года он устарел. Apple выпустила собственный язык шейдеров под названием Metal Shading Language как часть Metal framework .
Редакторы шейдеров с графическим интерфейсом
[ редактировать ]Современные платформы разработки видеоигр , такие как Unity , Unreal Engine и Godot, все чаще включают в себя редакторы на основе узлов , которые могут создавать шейдеры без необходимости использования реального кода; вместо этого пользователю предоставляется направленный граф связанных узлов, который позволяет пользователям направлять различные текстуры, карты и математические функции в выходные значения, такие как диффузный цвет, зеркальный цвет и интенсивность, шероховатость/металличность, высота, нормаль и т. д. . Затем автоматическая компиляция превращает график в настоящий скомпилированный шейдер.
См. также
[ редактировать ]- ГЛСЛ
- SPIR-V
- ХЛСЛ
- Вычислительное ядро
- Язык штриховки
- ГПГПУ
- Список распространенных алгоритмов затенения
- Векторный процессор
Ссылки
[ редактировать ]- ^ «Изучение OpenGL — Шейдеры» . Learnopengl.com . Проверено 12 ноября 2019 г.
- ^ «Спецификация интерфейса RenderMan» .
- ^ Опубликовано Лилли, Пол (19 мая 2009 г.). «От Voodoo до GeForce: потрясающая история 3D-графики» . PC Gamer – через www.pcgamer.com.
- ^ «Обновление ShaderWorks — Блог DirectX» . 13 августа 2003 г.
- ^ «Учебное пособие по GLSL — фрагментный шейдер» . 9 июня 2011 г.
- ^ «Учебное пособие по GLSL — вершинный шейдер» . 9 июня 2011 г.
- ^ Шейдер геометрии — OpenGL . Проверено 21 декабря 2011 г.
- ^ «Этапы конвейера (Direct3D 10) (Windows)» . msdn.microsoft.com . 6 января 2021 г.
- ^ «Анализ Radeon RX Vega: AMD обещает игровую производительность в разрешении 4K за 499 долларов — Доверенные обзоры» . 31 июля 2017 г.
- ^ «Занавес поднимается над архитектурой AMD Vega» . 5 января 2017 г.
- ^ «Подробное описание архитектуры NVIDIA Turing» . 14 сентября 2018 г.
- ^ «Введение в шейдеры сетки Тьюринга» . 17 сентября 2018 г.
- ^ «Выпущен драйвер DirectX 12 Ultimate Game Ready; также включена поддержка 9 новых игровых мониторов, совместимых с G-SYNC» .
- ^ «Анонс DirectX 12 Ultimate» . Блог разработчиков DirectX . 19 марта 2020 г. Проверено 25 мая 2021 г.
- ^ «Реалистичное освещение в системе правосудия с помощью сетки-затенения» . Блог разработчиков NVIDIA . 21 мая 2021 г. . Проверено 25 мая 2021 г.
- ^ Смит, Райан. «День архитектуры Intel 2021: краткий обзор архитектуры графического процессора Xe-HPG» . www.anandtech.com .
- ^ «Окончательная версия спецификации трассировки лучей Vulkan» . Блог. Группа компаний «Хронос» . 23 ноября 2020 г. . Проверено 22 февраля 2021 г.
- ^ «Руководство по миграции NNAPI | Android NDK» . Android-разработчики . Проверено 1 августа 2024 г.
Дальнейшее чтение
[ редактировать ]- Апстил, Стив (1990). RenderMan Companion: Руководство программиста по реалистичной компьютерной графике . Аддисон-Уэсли. ISBN 0-201-50868-0 .
- Эберт, Дэвид С ; Масгрейв, Ф. Кентон ; Пичи, Дарвин ; Перлин, Кен ; Уорли, Стивен (1994). Текстурирование и моделирование: процедурный подход . АП Профессионал. ISBN 0-12-228730-4 .
- Фернандо, Рандима ; Килгард, Марк (2003). Учебное пособие по Cg: полное руководство по программируемой графике реального времени . Аддисон-Уэсли Профессионал. ISBN 0-321-19496-9 .
- Рост, Рэнди Дж (2004). Язык шейдеров OpenGL . Аддисон-Уэсли Профессионал. ISBN 0-321-19789-5 .
Внешние ссылки
[ редактировать ]- Расширение шейдера геометрии OpenGL
- Учебное пособие Riemer по DirectX и HLSL : Учебное пособие по HLSL с использованием DirectX с большим количеством примеров кода
- Этапы конвейера (Direct3D 10)