Компьютерная графика

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.



Radiosity Normal Mapping

Сообщений 1 страница 7 из 7

1

Эту технологию используют Valve в Source Engine. Суть идеи в том, чтобы тексели лайтмэпы хранили векторы направления пришедшего света, и эту информацию уже использовать при расчете попиксельного освещения совместно с картами нормалей.

Что вы думаете об этом? Кто-нибудь из вас уже пробовал такое реализовать?

P.S. недавно пробовал переписать q3map (из исходников quake3-1.32b) под построение такой лайтмэпы... но результат пока далек от совершенства

0

2

Мне идея очень нравится, сам все собираюсь сделать пример, но руки не доходят
Там кроме этого мне еще очень нравится niormal maps with directional occlusion, когда сразу в них еще и микро-AO запекают

0

3

Как мне кажется, сложность реализации заключается именно в инструментарии для построения таких лайтмэпов (Directional Lightmaps), а сам процесс рендера почти как при Bump-Mapping'е, только вместо куб-мэпы применяется лайтмэп.

Мне пришла в голову мысль, что можно так же и динамическое освещение эффективно добавить. Фрагменты кубмэпов от каждого динамического источника могут на лету запекаться в Directional Lightmaps (на подобие как было сделано в quake 2 с запеканием в обычный лайтмэп).

P.S. что такое normal maps with directional occlusion? Это для учета затенения?

Отредактировано X-ti (2011-02-06 15:18:08)

0

4

Процесс постоения таких лайтмэпов почти ничем не отличается от обычных - просто вместо одной нормали на грань берется три и для каждой из этих норалей считается освещенность.

normal maps with directional occlusion - да, счимтается затенение микрорельефом и умножается на коэффициенты normal map-а, поскльку эти коэффициенты уже не единичный вектор а просто веса

У Valve есть целая презентация на эту тему

0

5

http://www.decew.net/OSS/references.php вот тут хорошая подборка на эту тему есть

Три нормали на грань в смысле три орты? То есть расчитывать три лайтмэпа для каждого из трех орт на подобие
I_t = max (t*l)
I_b = max (b*l)
I_n = max (n*l)

вы это имеете в виду?

Но, по-моему, имеет смысл тогда записывать значение текселя как (I_t, I_b, I_n). То есть объединить в одну лайтмэпу.

Тогда при рендере мы имеем:

I_result = I_classic * (Nx*I_t + Ny*I_t + Nz* I_n) , где

I_classic = значение освещенности записанное в обычную лайтмэпу
(Nx, Ny, Nz) - значения из карты нормалей
(I_t, I_b, I_n) - значения из directional lightmap

То есть получается, что значения из карты нормалей выступают в виде весовых коэффициентов.

НО это чисто мои догадки =))))

P.S. под directional lightmaps я иное подразумавал всё таки. Просто значения компонент вектора L в каждый тексель лайтмэпы записывать. Естественно предварительно L надо перевести в касательное пространство.

Отредактировано X-ti (2011-02-07 12:21:06)

0

6

Поищите статью от Valve, там все очень хорошо расписано

0

7

http://s56.radikal.ru/i154/1102/e8/76bc06f6c640.jpg

Вот что у меня получилось =)))))

P.S. Directional-лайтмэп делал в фотошопе из обычного лайтмэпа с помощью плагина от NVidia. В коде рендера используется ARB_texture_env_dot3.

Отредактировано X-ti (2011-02-11 23:53:03)

0



создать форум