Лекция
Привет, Вы узнаете о том , что такое шейдер , Разберем основные их виды и особенности использования. Еще будет много подробных примеров и описаний. Для того чтобы лучше понимать что такое шейдер , настоятельно рекомендую прочитать все из категории Компьютерная графика.
В компьютерной графике шейдер — это компьютерная программа , которая вычисляет соответствующие уровни света , темноты и цвета во время рендеринга 3D-сцены — процесс, известный как затенение . Шейдеры эволюционировали для выполнения различных специализированных функций в области компьютерных графических спецэффектов и постобработки видео , а также для вычислений общего назначения на графических процессорах .
Традиционные шейдеры вычисляют эффекты рендеринга на графическом оборудовании с высокой степенью гибкости. Большинство шейдеров кодируются для (и запускаются) графического процессора (GPU), , хотя это не является строгим требованием. Языки шейдеров используются для программирования конвейера рендеринга GPU , который в основном заменил фиксированный конвейер прошлого, который допускал только общие функции преобразования геометрии и пиксельного затенения ; с шейдерами можно использовать настраиваемые эффекты. Положение и цвет ( оттенок , насыщенность , яркость и контрастность ) всех пикселей , вершин и/или текстур, используемых для построения окончательного рендеринга изображения, могут быть изменены с помощью алгоритмов, определенных в шейдере, и могут быть изменены внешними переменными или текстурами, введенными компьютерной программой, вызывающей шейдер.
Шейдеры широко используются в постобработке кино , компьютерной графике и видеоиграх для создания различных эффектов. Помимо простых моделей освещения, более сложные применения шейдеров включают: изменение оттенка , насыщенности , яркости ( HSL/HSV ) или контрастности изображения; создание размытия , светового блума , объемного освещения , нормального отображения (для эффектов глубины), боке , cel-шейдинга , постеризации , рельефного отображения , искажения , хроматического кеинга (для так называемых эффектов "синего экрана/ зеленого экрана "), обнаружения краев и движения , а также психоделических эффектов, таких как те, что можно увидеть в демосцене .
Иллюстрация разделения задач между CPU и GPU.
Такое использование термина «шейдер» было представлено публике компанией Pixar в версии 3.0 спецификации интерфейса RenderMan , первоначально опубликованной в мае 1988 года.
По мере развития графических процессоров основные библиотеки графического программного обеспечения, такие как OpenGL и Direct3D, начали поддерживать шейдеры. Первые графические процессоры с поддержкой шейдеров поддерживали только пиксельное затенение , но вершинные шейдеры были быстро введены, как только разработчики осознали мощь шейдеров. Первой видеокартой с программируемым пиксельным шейдером была Nvidia GeForce 3 (NV20), выпущенная в 2001 году. Геометрические шейдеры были введены с Direct3D 10 и OpenGL 3.2. В конечном итоге графическое оборудование эволюционировало в сторону унифицированной модели шейдеров .
Пример двух видов затенения: плоское затенение слева и затенение Фонга справа. Затенение Фонга является улучшением затенения Гуро и было одной из первых моделей компьютерного затенения, разработанных после базового плоского шейдера, значительно улучшая внешний вид криволинейных поверхностей в рендерах. Шейдеры чаще всего используются для создания освещенных и затененных областей при рендеринге 3D-моделей .
Другое применение шейдеров — для спецэффектов, даже на 2D-изображениях (например, фото с веб-камеры ). Неизмененное, незатененное изображение находится слева, а справа к тому же изображению применен шейдер. Этот шейдер работает, заменяя все светлые области изображения белым цветом, а все темные области — ярко окрашенной текстурой.
Шейдеры — это простые программы, которые описывают характеристики вершины или пикселя . Вершинные шейдеры описывают атрибуты (положение, координаты текстуры , цвета и т. д.) вершины, в то время как пиксельные шейдеры описывают характеристики (цвет, z-глубина и альфа- значение) пикселя. Вершинный шейдер вызывается для каждой вершины в примитиве (возможно, после тесселяции ); таким образом, одна вершина на входе, одна (обновленная) вершина на выходе. Затем каждая вершина визуализируется как ряд пикселей на поверхности (блоке памяти), которая в конечном итоге будет отправлена на экран.
Шейдеры заменяют часть графического оборудования, обычно называемую Fixed Function Pipeline (FFP), так называемую потому, что она выполняет освещение и текстурирование в жестко закодированной манере. Шейдеры предоставляют программируемую альтернативу этому жестко закодированному подходу.
Базовый графический конвейер выглядит следующим образом:
Графический конвейер использует эти шаги для преобразования трехмерных (или двумерных) данных в полезные двумерные данные для отображения. В общем, это большая пиксельная матрица или « кадровый буфер ».
Сначала видеокарты оснащали несколькими специализированными процессорами, поддерживающими разные наборы инструкций. Шейдеры делили на три типа в зависимости от того, какой процессор будет их исполнять (в зависимости от того, какие наборы инструкций доступны):
Существует три типа шейдеров, которые обычно используются (пиксельные, вершинные и геометрические шейдеры), и несколько новых были добавлены недавно. Об этом говорит сайт https://intellect.icu . В то время как старые видеокарты используют отдельные процессорные блоки для каждого типа шейдера, новые карты имеют унифицированные шейдеры , которые способны выполнять любой тип шейдера. Это позволяет видеокартам более эффективно использовать вычислительную мощность.
Затем видеокарты стали оснащать универсальными процессорами (GPU), поддерживающими наборы инструкций всех трех типов шейдеров (унифицировали шейдерную архитектуру). Деление шейдеров на типы сохранилось для описания назначения шейдера. Появилась возможность выполнения на GPU вычислений общего назначения (не связанных только с компьютерной графикой), например майнинг, нейронные сети.
2D-шейдеры работают с цифровыми изображениями , также называемыми текстурами в области компьютерной графики. Они изменяют атрибуты пикселей . 2D-шейдеры могут принимать участие в рендеринге 3D-геометрии . В настоящее время единственным типом 2D-шейдера является пиксельный шейдер.
Пиксельные шейдеры, также известные как фрагментные шейдеры, вычисляют цвет и другие атрибуты каждого «фрагмента»: единицы работы рендеринга, влияющей максимум на один выходной пиксель . Простейшие виды пиксельных шейдеров выводят один экранный пиксель как значение цвета; возможны также более сложные шейдеры с несколькими входами/выходами. Пиксельные шейдеры варьируются от простого вывода одного и того же цвета до применения значения освещения , выполнения рельефного отображения , теней , зеркальных бликов , полупрозрачности и других явлений. Они могут изменять глубину фрагмента (для Z-буферизации ) или выводить более одного цвета, если активны несколько целей рендеринга . В 3D-графике пиксельный шейдер сам по себе не может создавать некоторые виды сложных эффектов, поскольку он работает только с одним фрагментом, не имея знаний о геометрии сцены (т. е. данных вершин). Однако пиксельные шейдеры знают об отрисовываемой экранной координате и могут сэмплировать экран и близлежащие пиксели, если содержимое всего экрана передается шейдеру в качестве текстуры. Эта техника может обеспечить широкий спектр эффектов двухмерной постобработки , таких как размытие или обнаружение/улучшение краев для шейдеров мультфильмов/cel . Пиксельные шейдеры также могут применяться на промежуточных этапах к любым двухмерным изображениям — спрайтам или текстурам — в конвейере , тогда как вершинные шейдеры всегда требуют 3D-сцены. Например, пиксельный шейдер — это единственный тип шейдера, который может действовать как постпроцессор или фильтр для видеопотока после его растеризации .
Пиксельный шейдер работает с фрагментами растрового изображения и с текстурами — обрабатывает данные, связанные с пикселями (например, цвет, глубина, текстурные координаты). Пиксельный шейдер используется на последней стадии графического конвейера для формирования фрагмента изображения.
Пример кода для пиксельного шейдера на языке DirectX ASM:
ps.1.4
texld r0, t0
mul r0, r0, v0
3D-шейдеры действуют на 3D-модели или другую геометрию, но также могут получать доступ к цветам и текстурам, используемым для рисования модели или сетки . Вершинные шейдеры являются старейшим типом 3D-шейдеров, обычно вносящим изменения на основе каждой вершины. Более новые геометрические шейдеры могут генерировать новые вершины из шейдера. Тесселяционные шейдеры являются новейшими 3D-шейдерами; они действуют на пакеты вершин одновременно, чтобы добавлять детали, например, подразделять модель на более мелкие группы треугольников или других примитивов во время выполнения, улучшать такие вещи, как кривые и выпуклости , или изменять другие атрибуты.
Вершинные шейдеры являются наиболее устоявшимся и распространенным типом 3D-шейдеров и запускаются один раз для каждой вершины , заданной графическому процессору. Цель состоит в том, чтобы преобразовать 3D-положение каждой вершины в виртуальном пространстве в 2D-координату, в которой она отображается на экране (а также значение глубины для Z-буфера). Вершинные шейдеры могут манипулировать такими свойствами, как положение, цвет и координаты текстуры, но не могут создавать новые вершины. Выходные данные вершинного шейдера переходят на следующий этап конвейера, который является либо геометрическим шейдером, если он присутствует, либо растеризатором . Вершинные шейдеры могут обеспечить мощный контроль над деталями положения, движения, освещения и цвета в любой сцене, включающей 3D-модели .
Вершинный шейдер оперирует данными, связанными с вершинами многогранников, например, с координатами вершины (точки) в пространстве, с текстурными координатами, с цветом вершины, с вектором касательной, с вектором бинормали, с вектором нормали. Вершинный шейдер может использоваться для видового и перспективного преобразования вершин, для генерации текстурных координат, для расчета освещения и т. д.
Пример кода для вершинного шейдера на языке DirectX ASM:
vs.2.0
dcl_position v0
dcl_texcoord v3
m4x4 oPos, v0, c0
mov oT0, v3
Геометрические шейдеры были введены в Direct3D 10 и OpenGL 3.2; ранее были доступны в OpenGL 2.0+ с использованием расширений. Этот тип шейдера может генерировать новые графические примитивы , такие как точки, линии и треугольники, из тех примитивов, которые были отправлены в начало графического конвейера .
Геометрический шейдер, в отличие от вершинного, способен обработать не только одну вершину, но и целый примитив. Примитивом может быть отрезок (две вершины) и треугольник (три вершины), а при наличии информации о смежных вершинах (англ. adjacency) для треугольного примитива может быть обработано до шести вершин. Геометрический шейдер способен генерировать примитивы «на лету» (не задействуя при этом центральный процессор).
Геометрические шейдеры впервые стали использоваться на видеокартах Nvidia серии 8.
Программы шейдеров геометрии выполняются после вершинных шейдеров. Они принимают в качестве входных данных целый примитив, возможно, с информацией о смежности. Например, при работе с треугольниками три вершины являются входными данными шейдера геометрии. Затем шейдер может выдать ноль или более примитивов, которые растеризуются, а их фрагменты в конечном итоге передаются в пиксельный шейдер .
Типичные применения геометрического шейдера включают генерацию точечных спрайтов, геометрическую тесселяцию , выдавливание теневого объема и однопроходный рендеринг в кубическую карту . Типичным примером преимуществ геометрических шейдеров из реального мира является автоматическое изменение сложности сетки. Серия линейных полос, представляющих контрольные точки для кривой, передается в геометрический шейдер, и в зависимости от требуемой сложности шейдер может автоматически генерировать дополнительные линии, каждая из которых обеспечивает лучшее приближение кривой.
Начиная с OpenGL 4.0 и Direct3D 11, был добавлен новый класс шейдеров, называемый шейдером тесселяции. Он добавляет два новых этапа шейдеров к традиционной модели: шейдеры управления тесселяцией (также известные как шейдеры корпуса) и шейдеры оценки тесселяции (также известные как шейдеры домена), которые вместе позволяют подразделять более простые сетки на более мелкие сетки во время выполнения в соответствии с математической функцией. Функция может быть связана с различными переменными, в частности с расстоянием от камеры просмотра, чтобы обеспечить масштабирование активного уровня детализации . Это позволяет объектам, близким к камере, иметь более мелкие детали, в то время как более удаленные могут иметь более грубые сетки, но при этом казаться сопоставимыми по качеству. Это также может радикально сократить требуемую пропускную способность сетки, позволяя очищать сетки сразу внутри шейдерных блоков вместо понижения дискретизации очень сложных из памяти. Некоторые алгоритмы могут выполнять повышение разрешения любой произвольной сетки, в то время как другие позволяют вносить «подсказки» в сетки, чтобы указать наиболее характерные вершины и ребра.
Примерно в 2017 году в микроархитектуре AMD Vega появилась поддержка нового этапа шейдеров — примитивных шейдеров — в некоторой степени похожих на вычислительные шейдеры с доступом к данным, необходимым для обработки геометрии.
В 2018 году компания Nvidia представила шейдеры сеток и задач с микроархитектурой Turing , которые также смоделированы по образцу вычислительных шейдеров. Nvidia Turing — первая в мире микроархитектура графических процессоров, которая поддерживает шейдинг сеток через API DirectX 12 Ultimate, за несколько месяцев до выпуска серии Ampere RTX 30.
В 2020 году AMD и Nvidia выпустили микроархитектуры RDNA 2 и Ampere , которые поддерживают затенение сеток через DirectX 12 Ultimate . Эти шейдеры сеток позволяют графическому процессору обрабатывать более сложные алгоритмы, перекладывая большую часть работы с центрального процессора на графический процессор, а при интенсивном рендеринге алгоритмов — на порядок увеличивать частоту кадров или количество треугольников в сцене. Intel объявила, что графические процессоры Intel Arc Alchemist, поставляемые в первом квартале 2022 года, будут поддерживать шейдеры сеток.
Унифицированный шейдер представляет собой комбинацию 2D-шейдера и 3D-шейдера.
Вычислительные шейдеры не ограничиваются графическими приложениями, но используют те же ресурсы выполнения для GPGPU . Они могут использоваться в графических конвейерах, например, для дополнительных стадий в алгоритмах анимации или освещения (например, тайловый прямой рендеринг ). Некоторые API рендеринга позволяют вычислительным шейдерам легко делиться ресурсами данных с графическим конвейером.
Шейдеры трассировки лучей поддерживаются Microsoft через DirectX Raytracing , Khronos Group через Vulkan , GLSL и SPIR-V , Apple через Metal . В реальных аппаратных реализациях одно ядро трассировки лучей содержит много шейдеров трассировки лучей (ALU трассировки лучей).
Тензорные шейдеры могут быть интегрированы в NPU или GPU . Тензорные шейдеры поддерживаются Microsoft через DirectML , Khronos Group через OpenVX , Apple через Core ML , Google через TensorFlow , Linux Foundation через ONNX . В реальных аппаратных реализациях одно тензорное ядро содержит много тензорных шейдеров (тензорных АЛУ).
Шейдеры написаны для применения преобразований к большому набору элементов за раз, например, к каждому пикселю в области экрана или к каждой вершине модели. Это хорошо подходит для параллельной обработки , и большинство современных графических процессоров имеют несколько конвейеров шейдеров для облегчения этого, значительно повышая производительность вычислений.
Модель программирования с шейдерами похожа на функцию высшего порядка для рендеринга, принимающую шейдеры в качестве аргументов и предоставляющую определенный поток данных между промежуточными результатами, обеспечивая как параллелизм данных (по пикселям, вершинам и т. д.), так и параллелизм конвейера (между этапами). (см. также 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 .
Современные платформы разработки видеоигр , такие как Unity , Unreal Engine и Godot, все чаще включают в себя редакторы на основе узлов , которые могут создавать шейдеры без необходимости в реальном коде; вместо этого пользователю предоставляется направленный граф связанных узлов, который позволяет пользователям направлять различные текстуры, карты и математические функции в выходные значения, такие как диффузный цвет, зеркальный цвет и интенсивность, шероховатость/металличность, высота, нормаль и т. д. Затем автоматическая компиляция превращает граф в фактический скомпилированный шейдер.
создание материал воды в блендере с помощью шейдера, материала, преломления в экранном пространстве в настройках рендеринга (Отражения в экранном пространстве -> Преломление)
Для удовлетворения различных потребностей рынка (компьютерная графика имеет множество сфер применения) было создано большое количество языков программирования шейдеров.
Обычно языки для написания шейдеров предоставляют программисту специальные типы данных (матрицы, семплеры, векторы и др.), набор встроенных переменных и констант (для взаимодействия со стандартной функциональностью 3D API).
Профессиональный рендеринг
Далее перечислены языки программирования шейдеров, ориентированные на достижение максимального качества визуализации. На таких языках свойства материалов описываются с помощью абстракций. Это позволяет писать код людям, не имеющим особых навыков программирования и не знающим особенностей аппаратных реализаций. Например, художники могут писать такие шейдеры с целью обеспечить «правильный вид» (наложение текстур, расположение источников света и др.).
Обычно обработка таких шейдеров довольно ресурсоемка: создания фотореалистичных изображений требует больших вычислительных мощностей. Обычно основная часть вычислений выполняется большими компьютерными кластерами или блэйд-системами.
RenderMan
Язык программирования шейдеров, реализованный в ПО RenderMan фирмы Pixar, стал первым языком программирования шейдеров. API RenderMan разработано Робом Куком и описано в спецификации интерфейса RenderMan, является фактическим стандартом для профессионального рендеринга, используется во всех работах студии Pixar.
OSL
OSL — англ. Open Shading Language — язык программирования шейдеров, разработанный фирмой Sony Pictures Imageworks[англ.] и напоминающий язык C. Используется в проприетарной программе «Arnold», разработанной фирмой «Sony Pictures Imageworks» и предназначенной для рендеринга, и в свободной программе Blender , предназначенной для создания трехмерной компьютерной графики.
Рендеринг в реальном времени
GLSL
GLSL (англ. the OpenGL Shading Language — язык программирования шейдеров, описанный в стандарте OpenGL и основанный на версии языка C, описанной в стандарте ANSI C. Язык поддерживает большинство возможностей ANSI C, поддерживает типы данных, часто применяемые при работе с трехмерной графикой (векторы, матрицы). Словом «шейдер» в языке GLSL называется независимо компилируемая единица, написанная на этом языке. Словом «программа» называется набор скомпилированных шейдеров, связанных вместе.
Cg
Cg (англ. C for graphics) — язык программирования шейдеров, разработанный фирмой nVidia совместно с фирмой Microsoft. Язык похож на язык C и на язык HLSL, разработанный фирмой Microsoft и входящий в состав DirectX 9. В языке используются типы «int», «float», «half» (число с плавающей запятой размером 16 бит). Язык поддерживает функции и структуры. Язык обладает своеобразными оптимизациями в виде «упакованных массивов» (англ. packed arrays): объявления типа «float a » и «float4 a» соответствуют разным типам; второе объявление создает «упакованный массив»; операции с «упакованным массивом» выполняются быстрее, чем с обычным. Несмотря на то, что язык разработан фирмой nVidia, исходный код может компилироваться в инструкции и для GPU видеокарт фирмы ATI. Следует учесть, что все шейдерные программы обладают своими особенностями, узнать о которых можно из специализированных источников.
Языки программирования шейдеров для DirectX
DirectX ASM
DirectX ASM — низкоуровневый язык программирования шейдеров, разработанный для DirectX. Синтаксис языка схож с синтаксисом языка ассемблера для процессоров x86. Существует несколько версий языка, отличающихся друг от друга наборами поддерживаемых инструкций GPU и требованиями к оборудованию. Вершинный шейдер может состоять из 100—200 инструкций. Количество инструкций пиксельного шейдера более ограничено; например, в языке версии 1.4 пиксельный шейдер не может включать более 32-х инструкций.
HLSL
HLSL (англ. High Level Shader Language) — высокоуровневый язык программирования шейдеров, разработанный для DirectX и похожий на язык C. Представляет собой надстройку над языком DirectX ASM. Позволяет использовать структуры, процедуры и функции.
Достоинства:
Недостатки:
Исследование, описанное в статье про шейдер , подчеркивает ее значимость в современном мире. Надеюсь, что теперь ты понял что такое шейдер и для чего все это нужно, а если не понял, или есть замечания, то не стесняйся, пиши или спрашивай в комментариях, с удовольствием отвечу. Для того чтобы глубже понять настоятельно рекомендую изучить всю информацию из категории Компьютерная графика
Комментарии
Оставить комментарий
Компьютерная графика
Термины: Компьютерная графика