![]() |
Генерация ShadowMap.
Значит решил я сделать шейдер динамических теней ShadowMapping, и столкнулся с такой проблемой. Суть алгоритма такова: вначале вся сцена отрисовывается в текстуру используя только оттенок серого (такая текстура называется shadowmap), т.е. цвет пикселя в текстуре равен глубине пикселя. Затем отрисовываются все объекты, но координата Z текущего пикселя сравнивается с соответствующим значением пикселя на shadowmap. Но проблема состоит в том, что у текстуры не хватает точности для записи глубины, т.е. координаты 30 и 60 отображаются одним цветом. Подскажите, может как-то можно повторно использовать depth-buffer или какие-то алгоритмы для теней, более точные.
|
Так может не ограничивать себя оттенком серого (0-255), а "писать" глубину, используя три канала для хранения куда большего диапазона (0-16M)?
|
Как мне это сделать? Допустим, как мне записать получившееся значение глубины 0.29398240345 в 3 цвета?
|
Ты должен выяснить пределы. Когда тебе будут известны минимальное и максимальное значения глубины, записывай глубину как-то так:
Код AS3:
Код AS3:
Разумеется вот это вот (maxDepthValue - minDepthValue) лучше вычислить один раз и хранить в какой-то depthValueRange. |
Это как бы понятно. Но проблема в том, что в агал нет побитовых операций.
|
Битовым операциям есть альтернатива — целочисленное деление, поиск остатка от деления, вот это вот все. Погугли, как это делается в AGAL, бо я его совершенно забыл.
|
Не об этом ли речь идет?
Код AS3:
|
Да, об этом.
Alex Lexcuk А можешь объяснить очень подробно, что тут. Просто хочу, не просто скопировать, но и понимать всё происходящее. Комментарии к коду я конечно прочитал, но хотелось бы понимать. Добавлено через 15 минут И это как я понял генерация шадовмапа, а где шейдер считывания глубины, вот именно само преобразование. И еще, Код AS3:
|
Тут разжевано
http://www.kirupa.com/forum/showthre...l-thread/page9 Код AS3:
div деление mul умножение frc похоже на как-бы остаток деления (не может быть больше 1 естественно) sub вычитание итого глубина кодируется в серо-синий с преобладанием все-же серого цвет, а потом достается снова как-то так Код AS3:
|
А нормали ваще нужны?
|
Для построения буфера глубины нормали в данном конкретном случае ненужны.
|
Вложений: 1
Если я все правильно сделал, то shadowmap должен быть таким
|
Похоже это оно.
|
Не могу понять, как происходит обратное получение глубины. Вот этими тремя строчками чтоли?
Код AS3:
Совсем не то получается. |
Вложений: 1
Да как-то так глубина и получается: из текстуры глубины считывается и переводится в число.
Вот пример с kirupa |
Что-то тут тень, мягко говоря кривая.
Добавлено через 48 секунд https://pp.vk.me/c633827/v633827268/...525Ch6X04Q.jpg |
Вложений: 1
Сделал тени очень далеки от совершенства.
https://pp.vk.me/c633827/v633827268/...s3Uvq4DSQo.jpg Управление: Стрелки - двигать камеру Z,X - поднять/опустить камеру W,A,S,D - перемещать блок Q,E - поднять/опустить блок |
| Часовой пояс GMT +4, время: 04:31. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.