8 марта 2015 8.03.15 68 32K

Шейдеры. Или почему мир игр стал визуально так похож на наш!

+55

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

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

Может кто-то уже и догадался по названию поста(глупый вопрос, конечно, там ж написано), речь пойдет о шейдерах. Что это, для чего и почему. Постараюсь разложить все по полочкам. Начнем:)

Что вообще такое эти самые шейдеры. Шейдеры — это программки, которые исполняются на видеокарте и описывают эффекты, методы обработки и прорисовки графики. Изначально GPU преимущественно обрабатывали 2D графику. В это время появляются так называемые акселераторы(ускорители). Они берут на себя часть операций, связанную с обработкой графических данных, сами прорисовывают каждый пиксель и определяю его цвет. Все это использовали видеокарты NVIDIA Riva128 и 3Dfx Voodoo. Эти карты брадли на себя только такие задачи как текстурирование и закраску, все остальное выполнял СPU. Естественно картинка была соответствующей. Подумайте сами, процессор и так загружен другими системными задачами, а тут еще ему и графические данные прорисовывать приходится, которые, по сравнению с арифметическими расчетами, просто звери.

Но в те времена этого было достаточно конечному пользователю. Далее начали применяться графические библиотеки такие как Open Gl, Direct 3d. Они снимали с CPU значительную часть нагрузки и брали на себя. Теперь видеокарта строила сцену с нуля. Производителям видеоигр в те времена такое решение было удобно. Все применяемые в тех играх эффекты были уже аппаратно встроены в видеокарты. Их было достаточно для игр того поколения. Но ничего не стоит на месте, разработчики видеоигр стремились вырваться вперед по сравнению с конкурентами и появилась потребность как-то улучшать имеющиеся эффекты 3D графики. Тогда то и появилась проблема — для того, чтоб апгрейдить какой-то эффект, разработчикам видеоигр приходилось подождать годик, чтоб вышла видеокарта, поддерживающая данный эффект. Что было и дорого и длительно по времени. Тогда — то и появились шейдеры. Так началась новая эра развития трехмерной графики в игровой индустрии.

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

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

Естественно, как вы навреное уже поняли, шейдеры пишутся игровыми программистами. С развитием трехмерной графики, написание шейдеров усложняется. Раньше они вообще состояли из небольшого куска кода на ассемблероподобном языке, а сейчас же существует несколько шейдерных языков, которые ориентированые на достижение максимального качества визуализации. Ни одна современня игра не обходится без шейдеров, если вы видите потрясную картинку с ослепительным эффектом, то знайте, это все работа шейдеров. Без них мы бы до сих пор играли в игры типо первых Quake, Doom, Unreal. Так же необходимо отметить, что современные игры сочетают в себе много шейдеров одновременно, которые выполняются параллельно вашей видеокартой.

Однако, но хоть шейдеры — это программы, их количество напрямую связано с качеством вашей видеокарты. Их количество настроено изначально на заводе-производителе и самому изменить это параметр невозможно. Хотя, обладателям консолей не стоит этого бояться т.к игры изначально оптимизируют под консоли и она в любом случае пойдет на приемлемом качестве. И как раз из-за шейдеров обладателям ПК приходится сверять системные характеристики и постоянно увеличивать мощность своего компьютера. Так же нужно помнить, что всего хорошего должно быть в меру. Программист, который разрабатывает шейдеры должен четко понимать что, где и как шейдер должен делать. Иначе получится полная ж… иными словами переизбыток шейдеров ничего хорошего не сулит!

И под конец хочу сказать, что без шейдеров не было бы ничего из того, что мы сейчас имеем. Шейдеры — это мощное средство для реализации достижений сложной трехмерной графики. Чем сложнее эффекты, тем прокаченней и больше по количеству нужно шейдеров. И… у меня плохо с заключением… и если вы еще до сих пор не поняли что такое шейдеры, то сходите съешьте шоколадку и прочитайте этот пост еще раз:) Спасибо за прочтение!

Эй-эй, это между прочим пример сглаживания!)


Лучшие комментарии

Начинание благое — нести просвещение в массы и рассказать народу про шейдеры.

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

Перечислять их все не буду — это на отдельный пост по размеру выльется.
Скажу лишь, что в статье 50% текста — чистая правда, доступно преподнесённая для рядового геймера. А другие 50% — какая-то бессмыслица, которая не имеет ничего общего с действительностью. Всё-таки видно, что автор сама недостаточно погрузилась в тему.
Open Gl, Direct 3d. Они снимали с CPU значительную часть нагрузки и брали на себя.

не «брали на себя», а «перекладывали на видеокарту, предоставляя для этого разрабам какой-никакой API (типа особого синтаксиса, в общем)».
Теперь видеокарта строила сцену с нуля.

Не с нуля. Проц всё равно гонит в видюху некоторые входные данные.

Поверхность без шейдеров
С шейдарами

Поверхность не может быть «без шейдеров». Её жу в любом случае что-то должно отрисовать. Просто они могут быть так называемыми «fixed-function» или «programmable» шейдерами. В первом случае у разраба есть лишь выбор из некоторых алгоритмов смешения цветов, которые аппаратно зашиты в видюху (как раз то, о чём говорит автор словами «все эффекты были встроены»). А во втором случае — разраб сам пишет любой алгоритм отрисовки, пользуясь уже арсеналом простых арифметических операций и некоторым набором высокоуровневых функций.
И — да — на скриншотах юнити. И, судя по внешнему виду, сравниваются стандартные шейдеры Diffuse и Bumped diffuse. В обоих случаях — это полноценные «programmable» шейдеры, а не fixed-function. Просто один попроще, другой посложнее.

Про виды шейдеров — простите, без обид — вообще ахинея.
В современном графическом пайплайне имеются следующие:
Вертексный
Тесселяционный, hull и domain (эта троица идёт вместе)
Геометрический
пиксельный (именуемый также фрагментным)

Обязательны только первый и последний (vertex + pixel aka fragment), остальные — опциональны и поддерживаются только в последних версиях DX и OGL.
И, да, пиксельный шейдер — не равно геометрический. Вообще ни разу.
Геометрический позволяет плодить новую геометрию прямо в видюхе. Фрагментный — работает попиксельно, вычисляя уже итоговую картинку (цвета писелей на экране).

Про HDR и Motion blur тут вообще ни к месту. Вникать не буду.

Однако, но хоть шейдеры — это программы, их количество напрямую связано с качеством вашей видеокарты.

Мысль правильная, формулировка — нет. В зависимости от шейдерной модели (DX9 — шейдерные модели с 1.0 по 3.0; DX10 — 4.0, DX11 — 5.0) есть ряд ограничений. На количество инструкций в шейдере, например. И на поддержку этих инструкций в разных шейдеров (например, чтение текстуры в вертексном шейдере — только в ). Кроме того, есть «мягкий лимит» на количество вертексов в сцене. Он ни в каких ограничениях не прописан, но определяется размером памяти в видюхе. И у старых видюх она, естественно, была меньше — так что и геометрии можно было меньше запихнуть.
Кроме того, есть т.н. draw-call'ы. И это отдельная песня
Но такого лимита, как «количество шейдеров в сцене» — его нет.


В целом же — повторюсь, начинание благое. И желание самостоятельно вникнуть в эти дебри — определённо, похвальное. Для человека, который не занимается шейдерным программированием — это титанический труд, поверьте. И он однозначно заслуживает уважения.

Но — сами понимаете — я не мог не обратить внимания на явные и существенные ошибки.
Красносельский подкат к женщинам — самый подкат из всех подкатов. :3
А по поводу позитиватора- можешь еще выложить пример развития игровых сисек до нашего времени и рядом свои для примера- куда нужно стремиться?)
Пост ориентирован на тех, кто совсем в этом не разбирается. Типа меня. Мне было интереснО, плюс :) Но для тех, кто хоть немного этим интересовался — ничего нового. Для будущих постов, думаю, будет неплохо учесть обе категории и наполнить пост информацией не только для чайников.
как-то у тебя винда быстро в BSOD ушла хD из-за какого-то ХЕЛОУ Ворлда, который еще и на 2 потока разошелся каким-то макаром оО :)

Суровые будни геймдева. Потом смотрят на все это-«И так сойдет» и заливают в ранний доступ Steam)
Без квадратных мух, Квейк 2 не тот.
Круть. плюс тебе. исправь это =Эти карты брадли на себя только такие задачи как текстурирование и закраску, все остальное выполнял СPU.= И удали мой комм. а то заминусят как всегда.
Откуда ты знаешь, а вдруг они у меня как на второй картинке? хDDD

НА каждый товар есть свой купец)
Я не отрицаю, что из моего примера можно так понять, но я не о таком глубоком уровне говорю
Помн в далеком 1999 купили 3Д аксселератор, так радовались лаве в квейке 2м! А еще мухи квадратные должны были отрастить крылашки :)
Ностальгия такая ностальгия) треугольные сиськи и квадратные мухи)))
Больше графена богу графена!
Хм… Предвижу Конкуренцию!
Ща прочитаю — и отпишусь по существу.
А разве в приведённом скриншоте можно заметить это преимущество?

Перечислять их все не буду — это на отдельный пост по размеру выльется.

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

Если интересно — лучше почитать не во всяких обзорных статьях от непонятно кого, а в первоисточнике:
msdn.microsoft.com/en-us/library/windows/desktop/bb205146%28v=vs.85%29.aspx
или в несколько упрощённом пересказе, но тоже вникающем в суть:
en.wikibooks.org/wiki/Cg_Programming/Programmable_Graphics_Pipeline
Естественно, обе ссылки — на английском.
А интересные статьи по теме скинь. И на популярном, и на «проф».
хDD хорошо, что я в раннем доступе ничего не покупаю, и что на консолях его нет)
Читай также