Понедельник, 23 Декабря 2024, 06:05

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Освещение, шейдеры, hlsl...
HuntlierДата: Вторник, 02 Апреля 2013, 21:26 | Сообщение # 1
был не раз
Сейчас нет на сайте
Кто может нормально объяснить как это работает? technique for the shader-based dynamic 2D shadows, а ещё лучше на этом примере объяснить Pixel perfect 2D shadow (похож на предыдущий, но доработанный)...
Я вообще не могу разобраться в шейдерах, просто не понимаю, весь код в комментах, но всё равно сложно понять, особенно когда не работал с этим.
Очень застрял на этом, если можете - распишите что да как работает, сижу уже неделю. confused
UndeadДата: Вторник, 02 Апреля 2013, 22:26 | Сообщение # 2
NeoAxis User
Сейчас нет на сайте
Там же всё подробно расписано. Или ты графический конвейер не можеш осилить?

Вcем зла.
HuntlierДата: Вторник, 02 Апреля 2013, 23:15 | Сообщение # 3
был не раз
Сейчас нет на сайте
Undead, графический конвейер я понимаю. Не понимаю каким образом вычисляются тени, хочу понять принцип, каким образом это выполняют шейдеры...

Добавлено (02.04.2013, 23:15)
---------------------------------------------
Как обычно, пока на форум не напишешь, не найдёшь решения...

Нашёл очень хорошо разжёванный материал, жаль первые примеры для меня всё ещё в тумане, но думаю разберусь.
А вот материал: Dynamic 2D Soft Shadows

Надеюсь это пригодится кому то ещё.


Сообщение отредактировал Huntlier - Вторник, 02 Апреля 2013, 23:16
ArchidoДата: Среда, 03 Апреля 2013, 16:09 | Сообщение # 4
Сэнсэй
Сейчас нет на сайте
Цитата (Huntlier)
Не понимаю каким образом вычисляются тени, хочу понять принцип, каким образом это выполняют шейдеры...

Конкретное что-нибудь или вообще ничего не понятно по теням? smile Как в 3D простые тени рисуют есть познания? Ибо очень многое там и тут пересекается...

В целом суть подобных техник заключается в том, что у нас есть некая информация (ShadowMap) о том, где находится самый ближайший шадоу кастер к источнику света (для этого сцену рендерят с позиции светильника). Это делает один шейдер, собственно он строит ентот ShadowMap (это еще не итоговая тень).
Во втором шейдере, которые уже будет рисовать непосредственно тень, зная эту информацию мы можем с помощью позиции пикселя и позиции источника света вычислить вектор направления, пустить луч по этому направлению и найти "пересечение" с ShadowMap и прочитать из него минимальную дистанцию до кастера. Собственно теперь, сравнивая полученное значение (расстояние) из шадоу мапы с расстоянием текущего пикселя до источника света, мы можем определить - находимся ли мы в тени или нет (меньше - не в тени, больше - в тени).

По первой сылке подробно рассказывается про то, как построить эту шадоу мапу. В кратце как-то так:
Все, что отбрасывает тень (шадоу кастеры) - рендерится в R канал текстуры, но записывается не просто цвет, а вычисляется расстояние от конкретного пикселя до источника света и оно уже пишется в текстуру. Далее лучи от пикселя до светильника выравнивают (делают параллельными) по горизонтали, располагают в 4-х треугольниках (верхний и нижний - для вертикальных лучей, левый и правый - для горизонтальных. После "выравнивания" треуглы превращаются в прямоугольники) и по 2 записываются в два канала текстуры.

Потом делается то, что называется "Reduction". У нас есть куча параллельных лучей и вдоль их направления (по всей шадоу мапе) записано расстояние от кастеров до источника, но нам нужно знать именно самое минимальное, что с помощью "Reduction'a" и делается... Который представляет собой DownSampling (уменьшение в 2..N раз за проход) текстуры с шадоу мапой по горизонтали, но делается не обычное усреднение соседних пикселей (среднее арифметическое), а выбирается минимальное из двух - что и нужно. Автор уменьшает текстуру с 512 до 2 пикселей за 9 проходов (только следует иметь в виду то, что сам размер текстуры не уменьшается smile , а эти 2 пикселя просто "размазаны" по каждой горизонтальной полосе (лучу) в 512 пикселей. В идеале надо уменьшать до 1, но автор экономит лишний проход - значит приемлимо). В итоге на всем протяжении луча - у нас записано необходимое минимальное расстояние, шадоу мапа готова.

Собсна, используя эту мапу, мы читаем из нее растояние, считаем расстояние от пикселя до источника и сравниваем. Если наше меньше чем в мапе, то тень в этом пикселе не рисуем, если больше - то рисуем. Когда основная тень отрисовывается - ей делается Gaussian blur и считается затухание источника света, собирается вместе и вуаля.


C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
JeryonaxДата: Среда, 03 Апреля 2013, 16:20 | Сообщение # 5
был не раз
Сейчас нет на сайте
Huntlier, для подобного освещение есть уже готовая библиотека krypton.
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг