Освещение, шейдеры, hlsl...
| |
Huntlier | Дата: Вторник, 02 Апреля 2013, 21:26 | Сообщение # 1 |
был не раз
Сейчас нет на сайте
| Кто может нормально объяснить как это работает? technique for the shader-based dynamic 2D shadows, а ещё лучше на этом примере объяснить Pixel perfect 2D shadow (похож на предыдущий, но доработанный)... Я вообще не могу разобраться в шейдерах, просто не понимаю, весь код в комментах, но всё равно сложно понять, особенно когда не работал с этим. Очень застрял на этом, если можете - распишите что да как работает, сижу уже неделю.
|
|
| |
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) Не понимаю каким образом вычисляются тени, хочу понять принцип, каким образом это выполняют шейдеры... Конкретное что-нибудь или вообще ничего не понятно по теням? Как в 3D простые тени рисуют есть познания? Ибо очень многое там и тут пересекается...
В целом суть подобных техник заключается в том, что у нас есть некая информация (ShadowMap) о том, где находится самый ближайший шадоу кастер к источнику света (для этого сцену рендерят с позиции светильника). Это делает один шейдер, собственно он строит ентот ShadowMap (это еще не итоговая тень). Во втором шейдере, которые уже будет рисовать непосредственно тень, зная эту информацию мы можем с помощью позиции пикселя и позиции источника света вычислить вектор направления, пустить луч по этому направлению и найти "пересечение" с ShadowMap и прочитать из него минимальную дистанцию до кастера. Собственно теперь, сравнивая полученное значение (расстояние) из шадоу мапы с расстоянием текущего пикселя до источника света, мы можем определить - находимся ли мы в тени или нет (меньше - не в тени, больше - в тени).
По первой сылке подробно рассказывается про то, как построить эту шадоу мапу. В кратце как-то так: Все, что отбрасывает тень (шадоу кастеры) - рендерится в R канал текстуры, но записывается не просто цвет, а вычисляется расстояние от конкретного пикселя до источника света и оно уже пишется в текстуру. Далее лучи от пикселя до светильника выравнивают (делают параллельными) по горизонтали, располагают в 4-х треугольниках (верхний и нижний - для вертикальных лучей, левый и правый - для горизонтальных. После "выравнивания" треуглы превращаются в прямоугольники) и по 2 записываются в два канала текстуры.
Потом делается то, что называется "Reduction". У нас есть куча параллельных лучей и вдоль их направления (по всей шадоу мапе) записано расстояние от кастеров до источника, но нам нужно знать именно самое минимальное, что с помощью "Reduction'a" и делается... Который представляет собой DownSampling (уменьшение в 2..N раз за проход) текстуры с шадоу мапой по горизонтали, но делается не обычное усреднение соседних пикселей (среднее арифметическое), а выбирается минимальное из двух - что и нужно. Автор уменьшает текстуру с 512 до 2 пикселей за 9 проходов (только следует иметь в виду то, что сам размер текстуры не уменьшается , а эти 2 пикселя просто "размазаны" по каждой горизонтальной полосе (лучу) в 512 пикселей. В идеале надо уменьшать до 1, но автор экономит лишний проход - значит приемлимо). В итоге на всем протяжении луча - у нас записано необходимое минимальное расстояние, шадоу мапа готова.
Собсна, используя эту мапу, мы читаем из нее растояние, считаем расстояние от пикселя до источника и сравниваем. Если наше меньше чем в мапе, то тень в этом пикселе не рисуем, если больше - то рисуем. Когда основная тень отрисовывается - ей делается Gaussian blur и считается затухание источника света, собирается вместе и вуаля.
C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
|
|
| |
Jeryonax | Дата: Среда, 03 Апреля 2013, 16:20 | Сообщение # 5 |
был не раз
Сейчас нет на сайте
| Huntlier, для подобного освещение есть уже готовая библиотека krypton.
|
|
| |
|