Строю тени на ATI
Автор: Alena Категория: Программист
Возможно вы помните, что наши тени работают только на GeForce карточках, потому что при построении карт теней я использовала специфические возможности этих карточек. Мне удалось построить очень симпатичные тени с учетом прозрачности (позже я в каком-то форуме вычитала, что тени с прозрачностью это круто, и возгордилась).
Вопрос с остальными карточками оставался открытым. На сравнительно слабых карточках (на карточках Intel, например) мне скорее всего все равно придется отключать тени, какие бы они не были, чтобы получить более-менее приличную скорость работы. Так что оставшиеся остальные, то есть не слабые карточки и не GeForce - это в основном ATI.
Я рассматривала два варианта построения теней на ATI. Это shadow volumes (”стенсильные теневые объемы”, их еще часто называют “стенсильные тени”) и shadow map (карты теней) с помощью шейдеров (в сделанном для GeForce варианте мне удалось обойтись без шейдеров вообще).
После некоторы раздумий я решила воспользоваться следующей мудростью: “Если не уверен каким способом делать что-либо, сделай обоими способами и посмотри какой из них лучше работает”.(c) Джон Кармак
Я пробовала два этих варианта параллельно. Сначала с одним поковыряюсь, переключусь на другой, потом со вторым поковыряюсь. Пока вперед вырвался вариант номер два. Но обо всем по порядку.
Shadow volumes
Большой плюс стенсильных теней это то, что они будут работать на любой карточке, все упирается только в производительность. Вроде как это не очень нужно, но все равно приятно.
Однако, когда Джим начинал рисовать модели, мы не рассчитывали на построение этих теней и не накладывали никакого ограничения на геометрию объектов. В первом посте про тени я сделала предположения по поводу причин возникающих с объектами проблем и стала изучать работу: Robust, Geometry-Independent Shadow Volumes. После ее изучения я начала долго и вдумчиво пытаться строить стенсильные тени. Эта работа мне не помогла. Мне удалось построить правильные тени от большинства объектов, но с меньшинством получились такие тени, что это просто никуда не годится. Вот хорошие красивые тени:

А вот так выглядит тень от одного из наших шлагбаумов:

Но это еще не все. У нас довольно много тонких створок. И если их ставить к свету в профиль, то теневые объемы получаются просто кошмарные, они еще и мигают, на скриншоте это не покажешь. Короче, Джиму пришлось бы перерисовывать или мне шаманить дальше.
Shadow map
Плохо то, что тут потребуются шейдеры определенной версии, которые есть не на всех карточках. То есть часть карточек мы оставляем вообще без шансов.
Джим любезно мне скачал ATI SDK, где есть аж три примера shadow map’ов.
Основная проблема, возникшая с программированием шейдеров состояла в том, что все, что я про них знала, это что есть они такие шейдеры и они должны мне сильно помочь. После некоторого количества изысканий я поняла, что поскольку я использую DirectX8.1, то я смогу работать только с ассемблерными шейдерами и никакие языки высокого уровня типа HLSL мне не светят. Могу ошибаться. Я не знаю, возможно ли скомпилять HLSL шейдер как-то отдельно в бинарник и подсунуть его DirectX8.1. В любом случае пример карт теней для Radeon 8500, самой слабой карточки, для которой есть пример карт теней в ATI SDK, написан на ассемблере, значит на нем и надо писать.
В итоге я прошла курс молодого бойца по программированию шейдеров на ассемблере: почитала серию статей на gamedev.net. Если вам когда-нибудь придется программировать шейдеры на ассемблере очень рекомендую: Hardcore Game Programming, там все статьи из серии Introduction to Shader Programming. Итого: всего лишь несколько дней битья головой об стену и тени начали падать как надо. Чтобы это все заработало требуется пиксельный шейдер версии 1.4, вертексный шейдер 1.0. Тени от прозрачных объектов будут сплошные.
Пока у меня тени падают толькно на объекты, не на ландшафт, падение на ландшафт я еще не доделала. Все аккуратно доделаю, когда проверю на ATI карточке, которая очень удачно есть у моей подруги. Будет смешно, если там не заработает…
По ходу дела возникла некоторая проблема с этими тенями из-за того, что у нас используются .x меши. И работаю я с ними стандартными способами, отрисовываю через DrawSubset. Так вот, этот DrawSubset выставляет свой вертексный шейдер, просто формат вершин определяет. Что отменяет мой вертексный шейдер, поставленный перед отрисовкой. Поэтому мне пришлось переписать отрисовку: вытянуть массивы вершин и индексов из меша и рисовать их самой.
Итак, я погоняю оба варианта на ATI и в зависимости от того, какой заработает, буду дорабатывать его. Очень надеюсь, что это будет второй вариант - карты теней через шейдеры.



Оставить комментарий
Небольшой совет (скорее для читателей) - если только начинаете заниматься комп. графикой, не бросайтесь сразу в шейдеры.
В частности, для shadow maps шейдеры необязательны. Есть различные студенческие программки (1999 и 2000 годов, без всяких доп. возможностей видеокарт) - в одной даже размытые мягкие тени (так называемые soft shadows) реализованы (т.е. та же shadow map, но от протяженного источника, фактически несколько раз просчитанная).
Главная сложность там была в том, чтобы подобрать диапазон значений z (depth) так, чтобы его можно было поместить в альфа-канал (чтобы 8бит этой альфы хватило для представления всего диапазона глубин в сцене), а дальше уже для расчетов использовался этот самый альфа канал текстуры (где и была глубина записана).
Я не знаю, насколько в нынешнее время целесообразны подобные изыски сейчас для разработки небольших игр, но тем, кому интересна именно комп. графика, думаю, стоит с этим повозиться.
Автор: tensor (07.05.06, Июль 5, 2006, 12:24)Может, вы уже видели, но вот пример низкобюджетной игры (IIRC, трое французов под Парижем делали). Жанр не ваш, другой, но поездка “машина по пустыне” присутствует
http://www.ag.ru/screenshots/trackmania
Нешейдерные тени там есть.
Автор: Jim (07.06.06, Июль 6, 2006, 22:53)Посмотрел скриншуты. Да, тени там есть. Вроде ничего… Как человек, мало в этом понимающий затрудняюсь охарактеризовать их нешейдерность
Не вполне понятно: там есть скриншут, где машины по сетке катаются. Вот эта сетка (явно текстура с “дырками”), она тень отбрасывает тоже с дырками?
Впрочем, тут с тенями у нас свои приключения. Одно время Алену очень бесило в играх, когда скажем, летит вертолет и отбрасывает тень на землю. А когда он пролетает над строением, его тень проходит ПОД строением. А на самом строении никакой тени не было вообще. Алена это победила в нашем случае. Все, что пролетает над строениями отбрасывает тень, как положено - и на землю, и на строения.
Сам я еще часто замечал, что строения сложных форм во многих играх не отбрасывают тени сами на себя. Т.е. на землю отбрасывают. Но, скажем, если из крыши торчит башня, то тень от этой башни на земле будет, а на крыше того же здания - нет. Это Алена тоже прикрутила.
Я не знаю, насколько уместны были в нашем случае шейдеры. Повторюсь - мало что в этом понимаю. Но итоговый результат по тенеоотбросу в нашем движке, меня, как дизайнера - устраивает по полной программе… А там хоть шейдеры, хоть маленькие чертики с краской, которые сидят в видеокарточке - мне пофиг. Думаю, игрокам - тоже. Были бы тени достойные.
Автор: tensor (07.07.06, Июль 7, 2006, 20:09)Не вполне понятно: там есть скриншут, где машины по сетке катаются. Вот эта сетка (явно текстура с “дырками”), она тень отбрасывает тоже с дырками?
Там 5 или 6 уровней настройки качества теней. Плюс графические настройки. Где-то на средних и выше - уже “тень с дыркой”.
Ну а с практической точки зрения (меньше времени потратите при аналогичном качестве) - получается, лучше шейдеры. Тем более все равно сейчас уже даже ноутбуки с нормальными карточками продают. А дальше еще сильнее будет.
Оставить комментарий