Всем привет! Так как я поставила себе цель когда-нибудь выпустить блог о том, какие технологии улучшения трехмерной графики применяются в топовых играх в последнее время, то я решила сначала разобраться в том, как за последнее время плотного использования трехмерной графики в видеоиграх она вообще достигла таких высот. Или проще говоря засчет чего это происходит, что отвечает за детализацию изображений, которое мы видим на своих экранах, запуская очередную любимую игру.
Всем нам нравится, когда в играх реалистичные пейзажи: красиво переливающиеся блики солнца на водной глади, движения каждого листочка на ветке во время ветра, волосы персонажей выглядят лучше, чем у тебя и много другое. В общем все, что нас так притягивает в современных играх не взялось из неоткуда(ежу понятно). Так кто же «виновник торжества»
Может кто-то уже и догадался по названию поста(глупый вопрос, конечно, там ж написано), речь пойдет о шейдерах. Что это, для чего и почему. Постараюсь разложить все по полочкам. Начнем:)
Что вообще такое эти самые шейдеры. Шейдеры — это программки, которые исполняются на видеокарте и описывают эффекты, методы обработки и прорисовки графики. Изначально GPU преимущественно обрабатывали 2D графику. В это время появляются так называемые акселераторы(ускорители). Они берут на себя часть операций, связанную с обработкой графических данных, сами прорисовывают каждый пиксель и определяю его цвет. Все это использовали видеокарты NVIDIA Riva128 и 3Dfx Voodoo. Эти карты брадли на себя только такие задачи как текстурирование и закраску, все остальное выполнял СPU. Естественно картинка была соответствующей. Подумайте сами, процессор и так загружен другими системными задачами, а тут еще ему и графические данные прорисовывать приходится, которые, по сравнению с арифметическими расчетами, просто звери.
Но в те времена этого было достаточно конечному пользователю. Далее начали применяться графические библиотеки такие как Open Gl, Direct 3d. Они снимали с CPU значительную часть нагрузки и брали на себя. Теперь видеокарта строила сцену с нуля. Производителям видеоигр в те времена такое решение было удобно. Все применяемые в тех играх эффекты были уже аппаратно встроены в видеокарты. Их было достаточно для игр того поколения. Но ничего не стоит на месте, разработчики видеоигр стремились вырваться вперед по сравнению с конкурентами и появилась потребность как-то улучшать имеющиеся эффекты 3D графики. Тогда то и появилась проблема — для того, чтоб апгрейдить какой-то эффект, разработчикам видеоигр приходилось подождать годик, чтоб вышла видеокарта, поддерживающая данный эффект. Что было и дорого и длительно по времени. Тогда — то и появились шейдеры. Так началась новая эра развития трехмерной графики в игровой индустрии.
Теперь пробежимся коротенько по видам шейдера дабы лучше понять их применение.
Вершинные шейдеры. Из назавания понятно, что они оперируют с вершинами(координаты вершин, текстурные координаты) Сопоставляют координаты вершин объекта и координаты вершин текстуры. Следовательно, они отвечают за любое трансформирование картинки. Например, колышащиеся деревья и трава на ветру, лицевая анимация и динамично перемещающийся свет.
Пиксельные шейдеры или геометрические. В отличие от вершинных, геометрические шейдеры оперируют на уровне примитивов. Проще говоря, они делят изображение на примитивы(точки, отрезки, треугольники) и работают с каждым в отдельности. Сглаживают, освещают, анимируют, добавляют эффекты HDR и Motion Blur. Главное назначение пиксельных шейдеров заключается в комплексном смешивании текстур, просчете освещенности и оптических свойств моделей, постобработке кадра. В общем, почти все, что мы видим в современных играх, — плод трудов пиксельных шейдеров!
Естественно, как вы навреное уже поняли, шейдеры пишутся игровыми программистами. С развитием трехмерной графики, написание шейдеров усложняется. Раньше они вообще состояли из небольшого куска кода на ассемблероподобном языке, а сейчас же существует несколько шейдерных языков, которые ориентированые на достижение максимального качества визуализации. Ни одна современня игра не обходится без шейдеров, если вы видите потрясную картинку с ослепительным эффектом, то знайте, это все работа шейдеров. Без них мы бы до сих пор играли в игры типо первых Quake, Doom, Unreal. Так же необходимо отметить, что современные игры сочетают в себе много шейдеров одновременно, которые выполняются параллельно вашей видеокартой.
Однако, но хоть шейдеры — это программы, их количество напрямую связано с качеством вашей видеокарты. Их количество настроено изначально на заводе-производителе и самому изменить это параметр невозможно. Хотя, обладателям консолей не стоит этого бояться т.к игры изначально оптимизируют под консоли и она в любом случае пойдет на приемлемом качестве. И как раз из-за шейдеров обладателям ПК приходится сверять системные характеристики и постоянно увеличивать мощность своего компьютера. Так же нужно помнить, что всего хорошего должно быть в меру. Программист, который разрабатывает шейдеры должен четко понимать что, где и как шейдер должен делать. Иначе получится полная ж… иными словами переизбыток шейдеров ничего хорошего не сулит!
И под конец хочу сказать, что без шейдеров не было бы ничего из того, что мы сейчас имеем. Шейдеры — это мощное средство для реализации достижений сложной трехмерной графики. Чем сложнее эффекты, тем прокаченней и больше по количеству нужно шейдеров. И… у меня плохо с заключением… и если вы еще до сих пор не поняли что такое шейдеры, то сходите съешьте шоколадку и прочитайте этот пост еще раз:) Спасибо за прочтение!
Лучшие комментарии
Но по тексту есть множество принципиальных ошибок и неточностей, которые вводят читателя в заблуждение.
Перечислять их все не буду — это на отдельный пост по размеру выльется.
Скажу лишь, что в статье 50% текста — чистая правда, доступно преподнесённая для рядового геймера. А другие 50% — какая-то бессмыслица, которая не имеет ничего общего с действительностью. Всё-таки видно, что автор сама недостаточно погрузилась в тему.
не «брали на себя», а «перекладывали на видеокарту, предоставляя для этого разрабам какой-никакой 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'ы. И это отдельная песня
Но такого лимита, как «количество шейдеров в сцене» — его нет.
В целом же — повторюсь, начинание благое. И желание самостоятельно вникнуть в эти дебри — определённо, похвальное. Для человека, который не занимается шейдерным программированием — это титанический труд, поверьте. И он однозначно заслуживает уважения.
Но — сами понимаете — я не мог не обратить внимания на явные и существенные ошибки.
atomgribatomgribСуровые будни геймдева. Потом смотрят на все это-«И так сойдет» и заливают в ранний доступ Steam)
atomgribНА каждый товар есть свой купец)
Ща прочитаю — и отпишусь по существу.
В посте много чего «не так». На самое вопиющее я указал, а к мелочам цепляться — уже лишнее.
Если интересно — лучше почитать не во всяких обзорных статьях от непонятно кого, а в первоисточнике:
msdn.microsoft.com/en-us/library/windows/desktop/bb205146%28v=vs.85%29.aspx
или в несколько упрощённом пересказе, но тоже вникающем в суть:
en.wikibooks.org/wiki/Cg_Programming/Programmable_Graphics_Pipeline
Естественно, обе ссылки — на английском.