Что такое пиксельные шейдеры
A Пиксельный Шейдер - это компонент GPU (графический процессор), который может быть запрограммирован для работы на пиксельной основе и заботиться о таких вещах, как освещение и отображение ударов.
A Вершинный Шейдер также является компонентом GPU и также программируется с использованием определенного сборочного языка, такого как пиксельные шейдеры, но ориентированы на геометрию сцены и могут делать такие вещи, как добавление мультяшных силуэтных краев к объектам и т. д.
ни лучше каждый из них имеет свое конкретное применение. Большинство современных графических карт, поддерживающих DirectX 9 или лучше включить эти функции.
есть несколько ресурсов в интернете для того, чтобы лучше понять, как использовать эти вещи. NVidia и ATI особенно хорошие ресурсы для документов по этой теме.
DirectX 10 и OpenGL 3 представили шейдер геометрии в качестве третьего типа.
в порядке перевода-
Вершинный Шейдер - принимает одноточечный и может отрегулировать его. Может использоваться для разработки сложных * * vertex lighting calcs в качестве настройки для следующего этапа и / или деформации точек вокруг (колебание, масштаб и т. д.).
каждый результирующий примитив передается в
Геометрия Шейдеров - принимает каждый преобразованный примитивный (треугольник и т. д.) и может выполнять вычисления на нем. Это может добавить новые точки, забрать их или переместить их по мере необходимости. Это может использоваться для динамического добавления или удаления уровней детализации из одной базовой сетки, создания математических сеток на основе точки (для сложных систем частиц) и других подобных задач.
каждый результирующий примитив преобразуется в scanline, и каждый пиксель, который охватывает промежуток, проходит через
Пиксельный Шейдер (фрагмент Шейдер в OpenGL) - вычисляет цвет пикселя на экране на основе того, что проходит вершинный шейдер, связанных текстур и пользовательских данных. Это не может прочитать текущий экран вообще, просто выяснить, какой цвет/прозрачность этот пиксель должен быть для текущего примитива.
эти пиксели затем помещаются в текущий буфер рисования (экран, backbuffer, render-to-texture, что угодно)
все шейдеры могут получить доступ к глобальным данным, таким как матрица мировоззрения и разработчик смогите пройти в простые переменные для их для использования для освещать или любой другой цели. Шейдеры обрабатываются на ассемблерном языке, но современные версии DirectX и OpenGL имеют встроенные компиляторы языка высокого уровня c-like, встроенные в HLSL и GLSL соответственно. У NVidia также есть компилятор шейдеров CG, который работает на обоих API.
[отредактировано, чтобы отразить неправильный порядок, который я имел раньше (геометрия->вершина->пиксель), как отмечено в комментарии.]
теперь есть 3 новых шейдеры, используемые в DirectX 11 и тесселяции. Новый полный порядок шейдеров-вершина- > корпус - >тесселяция->домен->геометрия - >пиксель. Я еще не использовал эти новые, поэтому не чувствую себя квалифицированным, чтобы описать их точно.
вершинные и пиксельные шейдеры предоставляют различные функции в графическом конвейере. Вершинные шейдеры принимают и обрабатывают данные, связанные с вершинами (позиции, нормали, texcoords).
пиксельные (или, точнее, фрагментарные) шейдеры принимают значения, интерполированные из обработанных в вершинном шейдере, и генерируют фрагменты пикселей. Большинство "крутых" вещей выполняется в пиксельных шейдерах. Здесь происходят такие вещи, как поиск текстуры и освещение.
Специфический DirectX:
шейдеров:
набор программ, реализующих добавление графических объектов к объектам, которые не определены в фиксированном конвейере рендеринга. Из-за этого мы можем иметь наши собственные графические эффекты в соответствии с нашими потребностями - то есть., Мы больше не ограничены предопределенным " фиксированным" оперативный.
HLSL: (язык высокого уровня затенения):
HLSL-это язык программирования, такой как C++, который используется для реализации шейдеров (пиксельных шейдеров / вершинных шейдеров).
Вершинных Шейдеров:
вершинный шейдер-это программа, выполняемая на GPU видеокарты, которая работает на каждой вершине индивидуально. Это облегчает нам возможность написать собственный алгоритм для работы с вершиной.
Пиксельные Шейдеры:
пиксельный шейдер-это программа, выполняемая на GPU видеокарты во время процесс растеризации для каждый пиксель. Это дает нам возможность получить доступ / манипулировать отдельными пикселями напрямую . Этот прямой доступ к пикселям позволяет нам достичь различных специальных эффектов, таких как мультитекстурирование, освещение на пиксель, глубина резкости, моделирование облаков, моделирование огня и сложные методы затенения.
Примечание: Как вершинные шейдеры, так и пиксельные шейдеры (программы) должны быть скомпилированы с использованием определенной версии компилятора перед использованием. Компиляция может быть выполнена так же, как вызов API с необходимыми параметрами, такими как имя файла, основная функция ввода и т. д.,
с точки зрения разработки пиксельный шейдер-это небольшая программа, которая работает с каждым пикселем индивидуально, аналогично вершинный шейдер работает с каждой вершиной индивидуально.
их можно использовать для создания специальных эффектов, теней, освещения и т. д.
Так как каждый пиксель / вершина управляется индивидуально этими шейдеры поддаются очень параллельной архитектуре современных графических процессоров.
До того, как появились первые графические ускорители, всю работу по отрисовке кадров видеоигры выполнял бедняга центральный процессор.
Но мы пока не получили ответа на главный вопрос: Что такое шейдеры? Подождите, я подвожу к этому.
Наступило время видеокартам стать более интеллектуальными. Было принято решение позволить разработчикам программировать блоки графического процессора в произвольные конвейеры, реализующие разные алгоритмы. То есть разработчики игр, графические программисты отныне смогли писать программы для видеокарточек.
И вот, наконец, мы дошли до ответа на наш главный вопрос.
Ше́йдер (англ. shader — затеняющая программа) — это программа для видеокарточки, которая используется в трёхмерной графике для определения окончательных параметров объекта или изображения, может включать в себя описание поглощения и рассеяния света, наложения текстуры, отражения и преломление, затенение, смещение поверхности и множество других параметров.
Графический пайплайн
Преимущество программируемого конвейера перед его предшественником в том, что теперь программистам можно создавать свои алгоритмы самостоятельно, а не пользоваться зашитым аппаратно набором опций.
Сначала видеокарты оснастили несколькими специализированными процессорами, поддерживающими разные наборы инструкций. Шейдеры делили на три типа в зависимости от того, какой процессор будет их исполнять. Но затем видеокарты стали оснащать универсальными процессорами, поддерживающими наборы инструкций всех трёх типов шейдеров. Деление шейдеров на типы сохранилось для описания назначения шейдера.
Помимо графических задач с такими интеллектуальными видеокартами появилась возможность выполнения на GPU вычислений общего назначения (не связанных с компьютерной графикой).
Впервые полноценная поддержка шейдеров появилась в видеокартах серии GeForce 3, но зачатки были реализованы ещё в GeForce256 (в виде Register Combiners).
Виды шейдеров
В зависимости от стадии конвейера шейдеры делятся на несколько типов: вершинный, фрагментный (пиксельный) и геометрический. А в новейших типах конвейеров есть еще шейдеры тесселяции. Подробно обсуждать графический конвейер мы не будем, я все думаю не написать ли об этом отдельную статью, для тех кто решит заняться изучением шейдеров и программирования графики. Напишите в комментариях если Вам интересно, я буду знать, стоит ли тратить время.
Вершинный шейдер
Вершинными шейдерами делают анимации персонажей, травы, деревьев, создают волны на воде и многие другие штуки. В вершинном шейдере программисту доступны данные, связанные с вершинами например: координаты вершины в пространстве, её текстурные координатами, её цвет и вектор нормали.
Геометрический шейдер
Геометрические шейдеры способны создавать новую геометрию, и могут использоваться для создания частиц, изменения детализации модели «на лету», создание силуэтов и т.п. В отличие от предыдущего вершинного, способны обработать не только одну вершину, но и целый примитив. Примитивом может быть отрезок (две вершины) и треугольник (три вершины), а при наличии информации о смежных вершинах (англ. adjacency) для треугольного примитива может быть обработано до шести вершин.
Пиксельный шейдер
Пиксельными шейдерами выполняют наложение текстур, освещение, и разные текстурные эффекты, такие как отражение, преломление, туман, Bump Mapping и пр. Пиксельные шейдеры также используются для пост-эффектов.
Пиксельный шейдер работает с фрагментами растрового изображения и с текстурами — обрабатывает данные, связанные с пикселями (например, цвет, глубина, текстурные координаты). Пиксельный шейдер используется на последней стадии графического конвейера для формирования фрагмента изображения.
На чем пишут шейдеры?
Изначально шейдеры можно было писать на assembler-like языке, но позже появились шейдерные языки высокого уровня, похожие на язык С, такие как: Cg, GLSL и HLSL.
Такие языки намного проще чем C, ведь задачи решаемые с их помощью, гораздо проще. Система типов в таких языках отражает нужды программистов графики. Поэтому они предоставляют программисту специальные типы данных: матрицы, семплеры, векторы и тп.
RenderMan
Например, графику такого качества как в последних мультипликационных фильмах студии Pixar получить в реальном времени мы сейчас получить не можем. Очень большие рендер-фермы обсчитывают симуляции света по совсем другим алгоритмам, очень затратным, но дающим почти фотореалистичные картинки.
Супер-реалистичная графика в Sand piper
Например, посмотрите, на вот этот милый мультфильм, песчинки, перышки птички, волны, все выглядит невероятно реальным.
Так вот это RenderMan от фирмы Pixar. Он стал первым языком программирования шейдеров. API RenderMan является фактическим стандартом для профессионального рендеринга, используется во всех работах студии Pixar и не только их.
Полезная информация
Теперь Вы знаете что такое шейдеры, но помимо шейдеров, есть другие очень интересные темы в разработке игр и компьютерной графике, которые наверняка Вас заинтересуют:
Если остались вопросы
Как обычно, если у Вас остались какие-то вопросы, задавайте их в комментариях, я всегда отвечу. За любое доброе слово или правку ошибок я буду очень признателен.
Всем привет! Так как я поставила себе цель когда-нибудь выпустить блог о том, какие технологии улучшения трехмерной графики применяются в топовых играх в последнее время, то я решила сначала разобраться в том, как за последнее время плотного использования трехмерной графики в видеоиграх она вообще достигла таких высот. Или проще говоря засчет чего это происходит, что отвечает за детализацию изображений, которое мы видим на своих экранах, запуская очередную любимую игру.
Всем нам нравится, когда в играх реалистичные пейзажи: красиво переливающиеся блики солнца на водной глади, движения каждого листочка на ветке во время ветра, волосы персонажей выглядят лучше, чем у тебя и много другое. В общем все, что нас так притягивает в современных играх не взялось из неоткуда(ежу понятно). Так кто же «виновник торжества»
Может кто-то уже и догадался по названию поста(глупый вопрос, конечно, там ж написано), речь пойдет о шейдерах. Что это, для чего и почему. Постараюсь разложить все по полочкам. Начнем:)
Что вообще такое эти самые шейдеры. Шейдеры — это программки, которые исполняются на видеокарте и описывают эффекты, методы обработки и прорисовки графики. Изначально GPU преимущественно обрабатывали 2D графику. В это время появляются так называемые акселераторы(ускорители). Они берут на себя часть операций, связанную с обработкой графических данных, сами прорисовывают каждый пиксель и определяю его цвет. Все это использовали видеокарты NVIDIA Riva128 и 3Dfx Voodoo. Эти карты брадли на себя только такие задачи как текстурирование и закраску, все остальное выполнял СPU. Естественно картинка была соответствующей. Подумайте сами, процессор и так загружен другими системными задачами, а тут еще ему и графические данные прорисовывать приходится, которые, по сравнению с арифметическими расчетами, просто звери.
Но в те времена этого было достаточно конечному пользователю. Далее начали применяться графические библиотеки такие как Open Gl, Direct 3d. Они снимали с CPU значительную часть нагрузки и брали на себя. Теперь видеокарта строила сцену с нуля. Производителям видеоигр в те времена такое решение было удобно. Все применяемые в тех играх эффекты были уже аппаратно встроены в видеокарты. Их было достаточно для игр того поколения. Но ничего не стоит на месте, разработчики видеоигр стремились вырваться вперед по сравнению с конкурентами и появилась потребность как-то улучшать имеющиеся эффекты 3D графики. Тогда то и появилась проблема — для того, чтоб апгрейдить какой-то эффект, разработчикам видеоигр приходилось подождать годик, чтоб вышла видеокарта, поддерживающая данный эффект. Что было и дорого и длительно по времени. Тогда — то и появились шейдеры. Так началась новая эра развития трехмерной графики в игровой индустрии.
Теперь пробежимся коротенько по видам шейдера дабы лучше понять их применение.
Вершинные шейдеры. Из назавания понятно, что они оперируют с вершинами(координаты вершин, текстурные координаты) Сопоставляют координаты вершин объекта и координаты вершин текстуры. Следовательно, они отвечают за любое трансформирование картинки. Например, колышащиеся деревья и трава на ветру, лицевая анимация и динамично перемещающийся свет.
Пиксельные шейдеры или геометрические. В отличие от вершинных, геометрические шейдеры оперируют на уровне примитивов. Проще говоря, они делят изображение на примитивы(точки, отрезки, треугольники) и работают с каждым в отдельности. Сглаживают, освещают, анимируют, добавляют эффекты HDR и Motion Blur. Главное назначение пиксельных шейдеров заключается в комплексном смешивании текстур, просчете освещенности и оптических свойств моделей, постобработке кадра. В общем, почти все, что мы видим в современных играх, — плод трудов пиксельных шейдеров!
Естественно, как вы навреное уже поняли, шейдеры пишутся игровыми программистами. С развитием трехмерной графики, написание шейдеров усложняется. Раньше они вообще состояли из небольшого куска кода на ассемблероподобном языке, а сейчас же существует несколько шейдерных языков, которые ориентированые на достижение максимального качества визуализации. Ни одна современня игра не обходится без шейдеров, если вы видите потрясную картинку с ослепительным эффектом, то знайте, это все работа шейдеров. Без них мы бы до сих пор играли в игры типо первых Quake, Doom, Unreal. Так же необходимо отметить, что современные игры сочетают в себе много шейдеров одновременно, которые выполняются параллельно вашей видеокартой.
Однако, но хоть шейдеры — это программы, их количество напрямую связано с качеством вашей видеокарты. Их количество настроено изначально на заводе-производителе и самому изменить это параметр невозможно. Хотя, обладателям консолей не стоит этого бояться т.к игры изначально оптимизируют под консоли и она в любом случае пойдет на приемлемом качестве. И как раз из-за шейдеров обладателям ПК приходится сверять системные характеристики и постоянно увеличивать мощность своего компьютера. Так же нужно помнить, что всего хорошего должно быть в меру. Программист, который разрабатывает шейдеры должен четко понимать что, где и как шейдер должен делать. Иначе получится полная ж… иными словами переизбыток шейдеров ничего хорошего не сулит!
И под конец хочу сказать, что без шейдеров не было бы ничего из того, что мы сейчас имеем. Шейдеры — это мощное средство для реализации достижений сложной трехмерной графики. Чем сложнее эффекты, тем прокаченней и больше по количеству нужно шейдеров. И… у меня плохо с заключением… и если вы еще до сих пор не поняли что такое шейдеры, то сходите съешьте шоколадку и прочитайте этот пост еще раз:) Спасибо за прочтение!
Эй-эй, это между прочим пример сглаживания!)
Современные игры становятся всё красивее и технологичнее, вспомнить те же RTX от Nvidia, но как меняют изображение настройки в играх?
Сегодня попытаемся разобраться.
Анизотропная фильтрация
Когда текстура отображается не в своём исходном размере, ей нужно добавлять дополнительные или убирать лишние пикселы. Для этих манипуляций нужна фильтрация: билинейная, трилинейная и анизотропная.
Как вы видите, билинейная является самым простым алгоритмом и вместе с тем даёт даёт наихудший результат. Трилинейная уже чётче, но не так как более продвинутая анизотропная фильтрация. Она отлично борется с эффектом ступенчатости, когда одни части текстуры размываются сильнее других, и граница между ними становится заметной, в отличии от билинейной и трилинейной фильтрации.
Анизотропная фильтрация имеет только одну настройку - коэффициент фильтрации (2х, 4х, 8х, 16х). Значений 4х и 8х обычно бывает достаточно для избавления от большей части графических искажений, а вот при переходе от 8х к 16х коэффициенту фильтрации снижение производительности будет небольшим , т.к. дополнительная обработка понадобится только лишь для малого числа не фильтрованных ранее пикселов.
Шейдеры
Шейдеры – это небольшие программы, которые могут производить определенные манипуляции с 3D-сценой, например, изменять освещенность, накладывать текстуру, добавлять постобработку и т.д.
Шейдеры делятся на три типа: вершинные (Vertex Shader) оперируют координатами, геометрические (Geometry Shader) могут обрабатывать не только отдельные вершины, но и целые геометрические фигуры, состоящие максимум из 6 вершин, пиксельные (Pixel Shader) работают с отдельными пикселами и их параметрами.
Вертикальная синхронизация
Это синхронизация кадров игры с частотой вертикальной развертки монитора. Ее суть заключается в том, что полностью просчитанный игровой кадр выводится на экран в момент обновления на нем картинки.
Главная задача вертикальной синхронизации - это устранение эффекта сдвинутого кадра, возникающего, когда нижняя часть дисплея заполнена одним кадром, а верхняя – уже другим, сдвинутым относительно предыдущего.
Parallax mapping
Parallax mapping – это модифицированная версия известной техники bumpmapping, используемой для придания текстурам рельефности. Например таким как стены или мощёные дороги, при этом объект остаётся плоским.
Anti-Aliasing
Оно же сглаживание - технология, используемая для устранения эффекта «зубчатости», возникающего на краях одновременно выводимого на экран множества отдельных друг от друга плоских или объёмных изображений.
Сглаживание было придумано в 1972 году в Массачусетском технологическом институте в Architecture Machine Group, которая позже стала основной частью Media Lab.
Есть несколько методов сглаживания:
- FXAA - метод сглаживания Nvidia. Самый производительный, но самый простой метод сглаживания, представляющий собой однопроходный пиксельный шейдер, который обсчитывает результирующий кадр на этапе постобработки.
- MSSA - этот способ является популярным и до сих пор используется в играх. Изображение генерируется с более высоким разрешением, чем отображается. Во-вторых обнаруживает края объектов и только размазывает их. Это улучшает конечный результат и оказывает несущественное влияние на производительность, хотя следует отметить, что это все-таки сказывается на количестве отображаемых кадров.
- MFAA - тоже метод сглаживания от Nvidia. Он производит сложную выборку пикселей как в одном кадре, так и сразу в нескольких кадрах. После этого она использует специально разработанный синтезирующий фильтр для создания изображений лучшего качества со скоростью, намного превышающей традиционное сглаживание.
Методов сглаживания ещё больше, но я затронул только три из них.
Тесселяция
Это автоматизированный процесс добавления новых выпуклых (в произвольное кол-во раз) многоугольников в полигональную сетку с целью повышения детализации сетки. При этом нагрузка на ПК повышается.
С тесселяцией голова известного киллера стала более ровной С тесселяцией голова известного киллера стала более ровнойПост-процессинг
Это все эффекты, которые накладываются на уже на готовый кадр просчитанной 3D-сцены, для улучшения готовой картинки.
К нему относятся:
Bloom
Bloom нередко применяется совместно с HDR, а еще у него есть довольно близкий родственник – Glow, именно поэтому эти три техники часто путают.
Bloom симулирует эффект, который можно наблюдать при съемке очень ярких сцен обычными камерами. На таких изображениях кажется, что интенсивный свет занимает больше объема, чем должен, и «залазит» на объекты, хотя и находится позади них.
High dynamic range (HDR)
Эффект, часто используемый в игровых сценах с контрастным освещением. Если одна область экрана является очень яркой, а другая затемненной, многие детали в каждой из них теряются, и они выглядят монотонно. HDR добавляет больше градаций в кадр и позволяет детализировать сцену.
Также он часто применяется для создания эффекта приспособления зрения, например когда после просиживания штанов в своей уютной, но тёмной комнаты ГГ выходит на улицу в ясный день.
Зернистость
Это артефакт, появляющийся в аналоговом ТВ при плохом сигнале, на старых видеокассетах или фотографиях.
Большинство игроков, выключают этот эффект, поскольку он ухудшает качество изображения, а не наоборот. Но в некоторых хоррорах шум на экране добавляет атмосферности.
Motion Blur
Это эффект размазывания изображения при быстром вращении камеры, в основном используется в играх, где нужно придать больше динамики и скорости, например гонки.
Эффект также поможет при необходимости скрыть низкую частоту смены кадров и добавить плавности в игровой процесс.
Ambient Occlusion
Ambient occlusion - это техника, применяемая для придания фотореалистичности в сцене с помощью более правдоподобного освещения находящихся в ней объектов, при котором учитывается наличие поблизости других предметов со своими характеристиками поглощения и отражения света.
Screen Space Ambient Occlusion (SSAO) является улучшенной версией Ambient Occlusion и тоже имитирует непрямое освещение и затенение. SSAO появился из-за того, что при современном уровне быстродействия видеокарт Ambient Occlusion не мог использоваться для просчета сцен в режиме реального времени. За более высокую производительность мы расплачиваемся более низким качеством картинки.
Есть ещё HBAO(+) и VXAO, разработанные Nvidia - если коротко, то это более качественный SSAO, требующий больше ресурсов видеокарты и дающий более тонкое и качественное затенение объектов.
Cel shading
Тип нефотореалистичного рендеринга, результатом которого является компьютерное изображение, в некоторой мере имитирующее результат рисования вручную.
Примерами игр с таким рендерингом являются Borderlands (1-2), XIII и т.д.
Depth of field
Глубина резкости – это расстояние между ближней и дальней границей пространства, в пределах которого все объекты будут в фокусе, в то время как остальная сцена окажется размытой.
Читайте также: