netlib.narod.ru | < Назад | Оглавление | Далее > |
В главе много говорилось о постэкранных шейдерах, были рассмотрены почти все существующие базовые постэкранные шейдеры и вы узнали об основных компонентах для написания подобных шейдеров. Например, шейдер цветокоррекции может применяться для достижения эффекта сепии, изображенного на рис. 8.1. Один шейдер я преднамеренно пропустил — это шейдер обнаружения граней. Возможно, он не слишком полезен для каждой отдельной игры, но есть много других шейдеров, которые используют базовую функциональность шейдера обнаружения граней. Вот несколько примеров:
Шейдер обнаружения граней может применяться, чтобы показать, как видит сцену инопланетный монстр, или изобразить взгляд через высокотехнологичное устройство ночного видения сотрудника спецподразделения, делающее изображение резче.
Шейдеры для комиксов и мультипликации, которые получают цвет и урезают его до нескольких оттенков, например, из таблицы цветов или простого изображения, которое отображает каждое цветовое значение на конкретный предопределенный цвет. Затем с помощью шейдера обнаружения граней весьма просто можно нарисовать толстые граничные линии для рисуемых трехмерных поверхностей. Вы можете немного улучшить эффект, рисуя трехмерные линии и добавляя поверх них рельеф, оставляя контуры каждого трехмерного объекта, которые достаточно просто сформировать с шейдером обнаружения граней.
Шейдер обнаружения граней может быть использован для повышения контрастности сцены или для нахождения линий и контуров. Обнаружение граней часто является противодействием размытию, которое смешивает все вместе, из-за чего итоговый результат иногда может выглядеть чрезмерно застиранным. Шейдер обнаружения граней поможет вам, если вы хотите, чтобы изображение стало более резким перед началом применения дополнительных эффектов засветки и размытия.
Шейдер обнаружения граней может также применяться для создания более художественных изображений, которые будут выглядеть скорее как нарисованные, а не визуализированные. Вы просто усиливаете чувствительность эффекта обнаружения граней и добавляете другие фильтры, такие как эффект растяжения или шейдер полутонов с рис. 8.1.
Все, что вам надо, — создать простой фильтр обнаружения граней. Основная идея здесь — брать отдельные пиксели из оригинальной карты сцены и сравнивать их с соседними пикселями. В шейдерной модели 1.1 вы можете использовать только четыре входных текстуры, а в шейдерной модели 2.0 только восемь, следовательно вы ограничены в том, сколько пикселей можно использовать в пиксельном шейдере. Выполнять сравнение не так уж и просто, и это не слишком подходит для пиксельных шейдеров 1.1. Вместо этого просто возьмите центральную точку, умножьте ее на 2, и затем вычтите две соседние точки (верхнюю и нижнюю, и левую и правую). Затем получите значение градации серого с помощью функции Luminance и в результате вы получите ваши края.
Ниже приведен базовый код пиксельного шейдера; если вы работаете с шейдерной моделью 2.0, то можете делать больше выборок текстуры. Если вы не уверены в том, как расширить этот шейдер, посмотрите на шейдер обнаружения граней в Nvidia FX Composer. Тем не менее, вы должны попытаться создать законченный шейдер в FX Composer, а затем разработать класс C#, чтобы импортировать его в ваш движок. Переменные col1, col2, col3 и col4 — это четыре цвета из карты сцены, взятые из четырех координат текстур, передаваемых вами в пиксельный шейдер.
return Luminance( // Горизонталь (col1*2.0f-col2-col3)+ // Вертикаль (col2*2.0f-col1-col4));
Если вы сумеете заставить ваш шейдер работать, то должны увидеть нечто, похожее на рис. 8.24.
Рис. 8.24 |
netlib.narod.ru | < Назад | Оглавление | Далее > |