Winding Trail project

 

Построение теней, бой не окончен

Декабрь 25, 2005, 14:56
Автор:
Alena
Категория: Программист

Я обещала рассказать про построение теней некоторое время назад, выполняю обещание. Тени оказались одним из самых сложных моментов разработки и до сих пор есть вещи, которые меня не устраивают и над которыми я буду работать.
При построении теней нам совершенно не подходили простые решения: например спроецировать весь объект на плоскость, потому что у нас ландшафт не является плоскостью, и потому что нам хотелось, чтобы объекты отбрасывали тень друг на друга и было самозатенение. Причем Джиму очень не нравилась идея сделать непонятное размытое пятно в качестве тени. Так что тень от объекта я строю честно.

Сначала я хотела построить стенсильные теневые объемы (stencil shadow volumes). Вот картинка с иллюстрацией теневого объема из статьи Cg Shadow Volumes.

В DirectX SDK есть пример построения теневого объема и я воспользовалась им. Оно работало, но обнаружились моменты, которые нас не устроили. Классический алгоритм построения теневых объемов накладывает ограничения на геометрию объекта. У объекта должно быть как бы две стороны. Не хочу приводить математические определения, но вот на примерах: от шара такую тень можно построить, от тора можно, а вот от листа бумаги уже нельзя. Джим к тому времени уже начал рисовать модели и они не удовлетворяли этому ограничению. Плюс к этому, нам очень хотелось построить тени от объектов с прозрачностью, в частности от пыли, и я не нашла как это можно сделать с теневыми объемами. Поэтому я от них отказалась.
И построила карты теней (shadow maps). Получилось неплохо: тень на ландшафте, тень падает от одного объекта на другой, пылинки не бросают тень друг на друга, тень от машины падает на пыль. Качество у меня получилось не идеальное, но приемлемое.

Самозатенение

Тень от пыли падает на землю.

Я строю тени корректно не от всех объектов с прозрачностью, а только от систем частиц, это в целях экономии. Например, тень от забора в сеточку сплошная.
Недостаточное качество хорошо заметно на скриншоте с аркой. Это пикселизованный край. Он хорошо виден на ажурной части арки. С этим можно бороться, но Джима такое качество устроило, ну и опять же это нам грозит потерей производительности, а, главное, потерей времени, так что я с этим ничего делать не планирую. Сейчас при построении карт теней я использую возможность, которая есть только у карточек GeForce3 и выше. Для ATI на сайте ATI есть пример построения карт теней, там придется использовать шейдер. То есть тени будут работать на последних GeForce’ах и ATI, а остальные карточки?
Я решила еще посмотреть теневые объемы. После долгих изысканий, я нашла мануал, который описывает построение теневых объемов, не накладывая ограничение на геометрию при этом. Вот он: Robust, Geometry-Independent Shadow Volumes. Я его вдумчиво читаю, пока особо с ним ничего не делала. Тени от систем частиц он мне построить не позволит, но у меня будут хотя бы нормальные тени от объектов, это лучше чем ничего.
В итоге на GeForce будут карты теней как они есть сейчас, на ATI будут карты теней с шейдером, выглядеть будут точно так же. Там, где мне не удастся построить карты теней, я попробую построить теневые объемы. Возможно, все получится настолько тормозно, что придется на этих карточках отказаться от теней в принципе, надо смотреть.
Некоторое время назад я на своем блоге описывала построение карт теней, там больше технических подробностей. Если кому интересно: Строю карты теней.


Автор: Goodwin (12.29.05, Декабрь 29, 2005, 12:16)

-=Alena=-
Если не удастся выйти за рамки GF3 и Radeon8k по части теней, будете делать бампинг? Хоть бы на песок, каменные дорожки?

Автор: Alena (12.29.05, Декабрь 29, 2005, 12:42)

Если не удастся выйти за рамки GF3 и Radeon8k по части теней, будете делать бампинг? Хоть бы на песок, каменные дорожки?

А тут дело не в тенях. Я могу анализировать карточку и в зависимости от этого что-либо включать/не включать. Тени сейчас именно так работают и игра просто не включает тени на Intel’овской карточке, например. Бампинг мы не планировали. Но пожелание понятно :-) .

Автор: Atz (01.04.06, Январь 4, 2006, 2:15)

Matrox когда-то придумала замечательную технологию, которая ныне уже, наверно, есть абсолютно во всех видеокартах!

Обычная текстура + текстура освещённости + …

+ карта высоты!

Ничего лучше для формирования ландшафтов наверное, не бывает: вся поверхность создаётся в 2D-редакторе типа фотошопа. Алгоритм автоматически (аппаратно!) разбивает её на треугольники и т.п.

В демке к Matrox Perhelia был замечальный аквариум, где рыбы представляли собой ВСЕГО ОДИН треуголник: часть его - прозрачна, часть - зарисована рыбой, а карта высоты делает треугольник выпуклым! Разумеется, в результате полигонов гораздо больше одного, вот только об этом знает разве что только сама видеокарточка, но уж никак не дизайнер!

Автор: Jim (01.04.06, Январь 4, 2006, 12:45)

А, вероятно, все так и делается. По крайней мере я работаю только с картой высот. Действительно, это просто обычный ч\б битмэп с пятнами переменной яркости, где каждая точка - вершина на ландшафте. А дальше оно там само все как-то строится. В зависимости от высоты выбирается нужный набор текстур, все это как-то хитрозадо смешивается и накладывается и т.п.

Автор: Aona (07.30.06, Июль 30, 2006, 20:01)

Есть ли FX файлы кастинга тени на ландшафт от текстуры( например листьев дерева. Помогите заткнулся на этом. Сильно.

Автор: Alena (07.31.06, Июль 31, 2006, 12:06)

Есть ли FX файлы кастинга тени на ландшафт от текстуры( например листьев дерева. Помогите заткнулся на этом. Сильно.

Понятия не имею, я FX файлами вообще не пользуюсь.

Pingback Winding Trail project (02.16.07, Февраль 16, 2007, 21:24)

[…] Возможно вы помните, что наши тени работают только на GeForce карточках, потому что при построении карт теней я использовала специфические возможности этих карточек. Мне удалось построить очень симпатичные тени с учетом прозрачности (позже я в каком-то форуме вычитала, что тени с прозрачностью это круто, и возгордилась). […]