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

hbao / hbao+

Страницы: 1 2 316 17 Следующая »
vindastПостоялецwww2 авг. 201814:57#0
В общем, хочу сделать данные штуковины. Где про них почитать?
Просветите меня)


Специально для MrShoor:

+ Показать

Правка: 2 авг. 2018 15:07

SuslikМодераторwww2 авг. 201815:07#1
vindast
на скриншотах не AO, а чёрт знает что. яркость плоских поверхностей должна быть ровно 1.0, поверхности внутри прямого двугранного угла — 0.5, причём вне зависимости от угла обзора. такие случаи очень легко отлаживать, просто выводишь цветом, например
gl_FragColor = abs(ao - 0.5f) < 1e-2f ? vec4(0.0f, 1.0f, 0.0f, 1.0f) : vec4(1.0f, 0.0f, 0.0f, 1.0f);

также при отладе рекомендую сначала отладить алгоритм со сканированием горизонта только в одном направлении, потому что так проще найти косяки. подобные алгоритмы бесполезно оценивать "на глазок" — надо брать случаи, для которых легко аналитически посчитать точное значение и сравнивать с ними.

> В общем, хочу сделать данные штуковины. Где про них почитать?
не поверишь, там же, где и про всё остальное. в интернете. пишешь название этого треда в гугл, добавляешь filetype:pdf и тыкаешь по первой ссылке.

Правка: 2 авг. 2018 15:10

vindastПостоялецwww2 авг. 201815:12#2
Suslik, вот скрин где отключена карта нормалей. То есть нет микрорельефа.

+ Показать

Suslik
> яркость плоских поверхностей должна быть ровно 1.0

Там все именно так.

Правка: 2 авг. 2018 15:13

SuslikМодераторwww2 авг. 201815:14#3
vindast
> Там все именно так.
ничего там не так, полная ерунда рендерится. у тебя в углублении, где номер должен быть, например, у граней разный уровень освещённости, когда значение AO для них должно быть одинаковым. для фрагментов, у которых должен быть околонулевой уровень освещённости, у тебя явно совсем не ноль.

повторяю — такие алгоритмы надо проверять на предельно простых сценах, у которых для отдельных участков можно посчитать точное решение. просто куб на змеле, например, в точке касания куба и земли яркость должна быть 0.5 в линейном пространстве. два куба близко поставить, оставив небольшой зазор — в зазоре яркость должна быть равна практически 0.

существует бесконечное количество способов посчитать AO неправильно. многие из них при определённых условиях будут выглядеть даже чем-то похоже на правильный, вот как у тебя. и существует только единственно верный корректный результат.

Правка: 2 авг. 2018 15:19

vindastПостоялецwww2 авг. 201815:18#4
Suslik, затенение не линейное. 

ao = 1.0 - pow(occlusion / kernelSize, 2.0) * ssaoPower; // ssaoPower = 1.0

Suslik
> у тебя в углублении, где номер должен быть, например, у граней разный уровень
> освещённости

Выборка такая. Почти 90% семплов отклонены от нормали не более чем на 1/3 пи. И радиус большой для мягкости. И того да, но мне такой результат очень нравится.

Правка: 2 авг. 2018 15:19

vindastПостоялецwww2 авг. 201815:26#5
Suslik
> существует бесконечное количество способов посчитать AO неправильно. многие из
> них при определённых условиях будут выглядеть даже чем-то похоже на правильный,
> вот как у тебя. и существует только единственно верный корректный результат.
Перепроверю все.
SuslikМодераторwww2 авг. 201815:31#6
vindast
> ao = 1.0 - pow(occlusion / kernelSize, 2.0) * ssaoPower; // ssaoPower = 1.0
сам же понимаешь, что это — ерунда

> И того да, но мне такой результат очень нравится.
это плохо. значит, что у тебя замылился глаз и ты больше не воспринимаешь правильное изображение как красивое. в физически достоверном рендеринге субъекнивное мнение не играет никакой роли, потому что корректное решение уравнения рендеринга существует единственное, если оно тебе не нравится, это твои проблемы.

вот так выглядит корректный ssao без учёта корректировки скринспейс артефактов, потому что они решаются уже после:
Изображение

обрати внимание, что в месте контакта колонны с землёй, например, яркость пикселя 182, то есть после перевода в линейное пространство — что-то вроде 0.49(чуть меньше 0.5, потому что есть посторонние окклюдеры). яркость пикселей между шторами и колоннами — околонулевая.

Правка: 2 авг. 2018 15:46

vindastПостоялецwww3 авг. 201813:37#7
Suslik, так норм? (косяки с выходом за экран не убраны)
Это тот же ssao но с рандомной выборкой. Ну почти ) Я нашел косяк в вычислении мировой позиции через буфер с линейной глубиной и начал юзать текстуру с мировой позицией от g-буфера
+ Показать

Как картинка? :)

Правка: 3 авг. 2018 13:45

SuslikМодераторwww3 авг. 201813:47#8
vindast
ближе, но всё равно неправильно. сделай нормальный вывод без всяких pow(), просто значение самого ao. о совмещении ao с pbr-освещением пока даже не думай, потому что это вовсе не просто умножение env map на ao. ты ещё, судя по всему, пытаешься отбрасывать семплы, у которых слишком большой скачок глубины — для начала на это тоже забей, сделай, чтобы корректно работало хотя бы без этого, потом уже сверху навешивай.

у меня складывается ощущение, что у тебя происходит oversaturation, то есть на плоскостях значение ao становится больше 1. такого быть не должно нигде, выведи каким-нибудь ярким цветом все пиксели, у которых ao > 1 — если всё работает правильно, таких пикселей быть не должно. пиксели между машиной и землёй должны иметь практически полный occlusion, то есть ao = 0, у тебя они явно светлее.

Правка: 3 авг. 2018 13:51

vindastПостоялецwww3 авг. 201813:50#9
Suslik
> без всяких pow()
Теперь без, и отсечение по радиусу тоже выкл.

Изображение

SuslikМодераторwww3 авг. 201813:52#10
vindast
на последнем скриншоте пространство в окнах драндулета, например, должно иметь практически полный occlusion, то есть должно быть чёрным. у тебя явно не так.

сколько у тебя сейчас выборок на пиксель?

Правка: 3 авг. 2018 13:54

vindastПостоялецwww3 авг. 201813:53#11
Suslik
> у меня складывается ощущение, что у тебя происходит oversaturation, то есть на
> плоскостях значение ao становится больше 1. такого быть не должно нигде, выведи
> каким-нибудь ярким цветом все пиксели, у которых ao > 1 — если всё работает
> правильно, таких пикселей быть не должно. пиксели между машиной и землёй должны
> иметь практически полный occlusion, то есть ao = 0, у тебя они явно светлее.
color = vec3(texture(ssaoTex, TexCoords).r > 1.0f ? 1.0 : 0.0);

Все черное.

SuslikМодераторwww3 авг. 201813:57#12
vindast
> Почти 90% семплов отклонены от нормали не более чем на 1/3 пи.
ещё вот эта фраза говорит о том, что у тебя какая-то ерунда происходит. ты когда горизонты ищешь, вообще не должен вручную ничего от нормали отклонять — просто шагаешь по направлению и ищешь максимальный угол горизонта для каждого направления.

двугранный угол между стеной и полом должен иметь гораздо шире область затенённости.

Правка: 3 авг. 2018 13:58

vindastПостоялецwww3 авг. 201813:57#13
Suslik
> сколько у тебя сейчас выборок на пиксель?
64

Может это по тому что у меня линейный ao? то есть перекрыто 50% семплов, то и Ao = 0.5

1.0 - occlusion / kernelSize;
 
vindastПостоялецwww3 авг. 201813:58#14
Suslik, на скринах ssao...
Страницы: 1 2 316 17 Следующая »

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

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