16 марта 2011

Сектор Лирики / Pixel Shader (Пиксельный Шейдер) / Procedural Textures (Процедурные Текстуры)

Пиксельные шейдеры - это программы, выполняемые видеочипом во время
растеризации для каждого пикселя изображения, они производят выборку из
текстур и/или математические операции над цветом и значением глубины
(Z-buffer) пикселей. Все инструкции пиксельного шейдера выполняются
попиксельно, после того, как операции с трансформированием и освещением
геометрии завершены. Пиксельный шейдер в итоге своей работы выдает
конечное значение цвета пикселя и Z-значение для последующего этапа
графического конвейера, блендинга. Наиболее простой пример пиксельного
шейдера, который можно привести: банальное мультитекстурирование, просто
смешение двух текстур (diffuse и lightmap, например) и наложение
результата вычисления на пиксель.

До появления видеочипов с аппаратной поддержкой пиксельных шейдеров, у
разработчиков были лишь возможности по обычному мультитекстурированию и
альфа-блендингу, что существенно ограничивало возможности по многим
визуальным эффектам и не позволяло делать многое из того, что сейчас
доступно. И если с геометрией еще что-то можно было делать программно,
то с пикселями - нет. Ранние версии DirectX (до 7.0 включительно) всегда
выполняли все расчеты повершинно и предлагали крайне ограниченную
функциональность по попиксельному освещению (вспоминаем EMBM -
environment bump mapping и DOT3) в последних версиях. Пиксельные шейдеры
сделали возможным освещение любых поверхностей попиксельно, используя
запрограммированные разработчиками материалы. Появившиеся в NV20
пиксельные шейдеры версии 1.1 (в понимании DirectX) уже могли не только
делать мультитекстурирование, но и многое другое, хотя большинство игр,
использующих SM1, просто использовали традиционное мультитекстурирование
на большинстве поверхностей, выполняя более сложные пиксельные шейдеры
лишь на части поверхностей, для создания разнообразных спецэффектов (все
знают, что вода до сих пор является наиболее частым примером
использования пиксельных шейдеров в играх). Сейчас, после появления SM3
и поддерживающих их видеочипов, возможности пиксельных шейдеров доросли
уже до того, чтобы с их помощью делать даже трассировку лучей (raytracing).

Примеры применения пиксельных шейдеров:

Мультитекстурирование. Несколько слоев текстур (colormap, detailmap,
lightmap и т.д.). Используется вообще во всех играх.

Попиксельное освещение. Bump mapping. Normal mapping. С недавних пор
применяется практически везде.

Постобработка кадра. Все эти эффекты Bloom, Depth of Field и Motion Blur...

Процедурные текстуры, такие, как текстура дерева или мрамора. Примеры:


***

Procedural Textures (Процедурные Текстуры)

Процедурные текстуры - это текстуры, описываемые математическими
формулами. Такие текстуры не занимают в видеопамяти места, они создаются
пиксельным шейдером "на лету", каждый их элемент (тексель) получается в
результате исполнения соответствующих команд шейдера. Наиболее часто
встречающиеся процедурные текстуры: разные виды шума (например, fractal
noise), дерево, вода, лава, дым, мрамор, огонь и т.п., то есть те,
которые сравнительно просто можно описать математически. Процедурные
текстуры также позволяют использовать анимированные текстуры при помощи
всего лишь небольшой модификации математических формул. Например,
облака, сделанные подобным образом, выглядят вполне прилично и в
динамике и в статике.


Преимущества процедурных текстур также включают в себя неограниченный
уровень детализации каждой текстуры, пикселизации просто не будет,
текстура как бы всегда генерируется под необходимый для ее отображения
размер. Большой интерес представляет и анимированный Normal Mapping, с
его помощью можно сделать волны на воде, без применения предпросчитанных
анимированных текстур. Еще один плюс таких текстур в том, что чем больше
их применяется в продукте, тем меньше работы для художников (правда,
больше для программистов) над созданием обычных текстур.

К сожалению, процедурные текстуры не получили пока должного применения в
играх, в реальных приложениях до сих пор зачастую проще загрузить
обычную текстуру, объемы видеопамяти растут не по дням, а по часам, в
самых современных ускорителях ставят уже 512 мегабайт выделенной
видеопамяти, которую надо чем-то занимать. Более того, до сих пор чаще
делают наоборот - для ускорения математики в пиксельных шейдерах
используют lookup tables (LUT) - специальные текстуры, содержащие
заранее просчитанные значения, получаемые в результате вычислений. Чтобы
не считать для каждого пикселя несколько математических команд, просто
читают заранее вычисленные значения из текстуры. Но чем дальше, тем
сильнее акцент должен смещаться именно в сторону математических
вычислений, взять те же видеочипы ATI нового поколения: RV530 и R580, у
которых на каждые 4 и 16 текстурных блоков приходится 12 и 48 пиксельных
процессоров, соответственно. Тем более, если речь о 3D текстурах, ведь
если двухмерные текстуры без проблем можно разместить в локальной памяти
ускорителя, то 3D текстуры требуют ее намного больше.

Сектора Лирики