Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум
GameDev.ru / Программирование / Форум / hbao / hbao+ (3 стр)

hbao / hbao+ (3 стр)

Страницы: 1 2 3 4 516 Следующая »
vindastПостоялецwww3 авг. 201819:00#30
Suslik
> если ты помножишь лучи на косинус угла, то сумма перестанет быть равной 1
occlusion += dot(normal, sampleDir)
Угол между нормалью и направлением семпла? да?
Про сумму не понятно, я же просто суммировал те семплы, что провалили тест на их видимость.


Suslik
> нужно помножить на . и далее нужно ещё раз провести тест
Не понимаю что нужно умножить на 2 пи и какой тест. Длину луча?

Правка: 3 авг. 2018 19:14

vindastПостоялецwww3 авг. 201819:01#31
Suslik
> например, hbao
Я думал Вы про эффективную трассировку луча.
vindastПостоялецwww3 авг. 201819:03#32
Suslik
> кривой power curve к результату применил?
Нет.

Я не понимаю просто, там на ярких областях либо плоскости, либо выпуклые поверхности на которых не должно быть оккулюзии. Так что все правильно.

Правка: 3 авг. 2018 19:04

vindastПостоялецwww3 авг. 201819:07#33
Или я что-то не так думаю?
SuslikМодераторwww3 авг. 201819:20#34
vindast
> Я думал Вы про эффективную трассировку луча.
hbao как раз и эквивалентен эффективной трассировке целого семейства лучей. но, повторюсь, сначала лучше сделать без него, потому что у hbao куча мест, в которых можно ошибиться и лучше сначала разобраться, как правильно делается в лоб, чтобы было, с чем сравнивать.

vindast
> Я не понимаю просто, там на ярких областях либо плоскости, либо выпуклые
> поверхности на которых не должно быть оккулюзии. Так что все правильно.
дело в том, что при достаточно большом радиусе вообще не должно быть полностью белых поверхностей, так хоть какой-то луч хоть во что-то да попадёт почти всегда. посмотри на мой скриншот с первой страницы — совершенно белых поверхностей практически нет, они есть только в идеальном случае, где вообще нет окклюдеров. на твоей картинке у меня складывается впечатление, что она пересвечена, потому что нет достаточно тёмных теней.

vindast
> Не понимаю что нужно умножить на 2 пи и какой тест. Длину луча?
погоди, может, не 2 пи. мне лень сейчас считать, но коэффициент нормализации должен быть другой, потому что если вклад каджого луча не [cht]\frac{1}{N}[/cht], а [cht]\frac{cos(\vec n \cdot \vec \omega)}{N}[/cht], то в сумме [cht]N[/cht] лучей дадут не 1, а меньше. так вот надо результат помножить на множитель, чтоб получилась снова 1. я думал, что множитель равен 2 пи, но на самом деле нет, можешь сам посчитать или найти.

Правка: 3 авг. 2018 19:21

MrShoorУчастникwww3 авг. 201819:44#35
Suslik
> погоди, может, не 2 пи.
ты про это:
https://tinyurl.com/ycn9v3jz
?

Правка: 3 авг. 2018 19:44

SuslikМодераторwww3 авг. 201820:22#36
MrShoor
да, оно. короче, интеграл с косинусом получается равен [cht]\pi[/cht], без косинуса — [cht]2\pi[/cht], поэтому множитель должен быть равен [cht]\frac{\pi}{2\pi}=\frac{1}{2}[/cht] для случая с косинусом и [cht]1[/cht] — без косинуса.
vindastПостоялецwww4 авг. 20186:01#37
Suslik
> большом радиусе вообще не должно быть полностью белых поверхностей
У меня радиус 0.5, расстояние в один юнит можно считать одним метром. Какой радиус у белых человеков?

Suslik, Вы суммируете лучи, которые не были перекрыты, или те, что были перекрыты?

SuslikМодераторwww4 авг. 20186:06#38
vindast
> У меня радиус 0.5, расстояние в один юнит можно считать одним метром. Какой
> радиус у белых человеков?
чтобы получить красивый результат, нужно хотя бы метров 2-3

vindast
> Вы суммируете лучи, которые не были перекрыты, или те, что были перекрыты?
закон косинуса относится к падающему свету. поэтому ты складываешь все лучи, которые не перекрыты. хотя в принципе можно из 1 вычитать все лучи, которые перекрыты и получиться должно то же самое.

vindastПостоялецwww4 авг. 20186:16#39
Suslik
Суммирую не перекрытые семплы.

normal - нормаль в точке
sampleDir - направление нормали в пространстве нормали

occlusion += dot(normal, sampleDir); 

Делю на kernelSize, kernelSize - число семплов

occlusion = occlusion / kernelSize

Умножаю на 1 / 2

occlusion = occlusion * 0.5;

И вот что вышло.
Радиус 2 метра. Получилась хрень.
Изображение

vindastПостоялецwww4 авг. 20186:18#40
Тоже самое с делением на 1/2
Изображение
SuslikМодераторwww4 авг. 20186:20#41
vindast
> Умножаю на 1 / 2
ну так делить же надо. как ты делишь на N(количество семплов), так же надо делить на 0.5(нормировочный коэффициент). когда это исправишь, плоские поверхности станут белыми, но у тебя явно какой-то баг в расчёте, потому что пиксели рядом с машинами на земле, например, пересвеченные, почему в них не находится ни одного пересечения? напомню, что суммируются только лучи, у которых ни одна точка на пути не проокклудилась.

кстати, у тебя по коду суммируется occlusion, хотя в таком способе ты наоборот суммируешь отсутствие окклюжена, то есть по сути light или ambientLight. вопрос именования переменных, но он прямым образом определяет смысл вычислений.

Правка: 4 авг. 2018 6:21

vindastПостоялецwww4 авг. 20186:21#42
vindast
> Тоже самое с делением на 1/2
vindastПостоялецwww4 авг. 20186:23#43
Изображение
SuslikМодераторwww4 авг. 20186:26#44
во, это уже ближе. какое у тебя условие на окклюжен пикселя луча? сделай так, чтобы если хоть одна точка луча глубже z-buffer'а, то луч считается перекрытым. без всяких threshold'ов, без ничего. пиксели внутри фар у машин, например, должны быть практически чёрными, потому что почти все лучи должны быть перекрыты.

но это уже выглядит как что-то.

Правка: 4 авг. 2018 6:30

Страницы: 1 2 3 4 516 Следующая »

/ Форум / Программирование игр / Графика

2001—2018 © GameDev.ru — Разработка игр