Войти
ПрограммированиеФорумГрафика

hbao / hbao+

Страницы: 1 2 316 17 Следующая »
#0
(Правка: 15:07) 14:57, 2 авг. 2018

В общем, хочу сделать данные штуковины. Где про них почитать?
Просветите меня)


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

+ Показать


#1
(Правка: 15:10) 15:07, 2 авг. 2018

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
(Правка: 15:13) 15:12, 2 авг. 2018

Suslik, вот скрин где отключена карта нормалей. То есть нет микрорельефа.

+ Показать

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

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

#3
(Правка: 15:19) 15:14, 2 авг. 2018

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

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

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

#4
(Правка: 15:19) 15:18, 2 авг. 2018

Suslik, затенение не линейное. 

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

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

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

#5
15:26, 2 авг. 2018

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

#6
(Правка: 15:46) 15:31, 2 авг. 2018

vindast
> ao = 1.0 - pow(occlusion / kernelSize, 2.0) * ssaoPower; // ssaoPower = 1.0
сам же понимаешь, что это — ерунда

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

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

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

#7
(Правка: 13:45) 13:37, 3 авг. 2018

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

+ Показать

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

#8
(Правка: 13:51) 13:47, 3 авг. 2018

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

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

#9
13:50, 3 авг. 2018

Suslik
> без всяких pow()
Теперь без, и отсечение по радиусу тоже выкл.

Изображение
#10
(Правка: 13:54) 13:52, 3 авг. 2018

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

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

#11
13:53, 3 авг. 2018

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

color = vec3(texture(ssaoTex, TexCoords).r > 1.0f ? 1.0 : 0.0);

Все черное.

#12
(Правка: 13:58) 13:57, 3 авг. 2018

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

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

#13
13:57, 3 авг. 2018

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

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

1.0 - occlusion / kernelSize;
 
#14
13:58, 3 авг. 2018

Suslik, на скринах ssao...

Страницы: 1 2 316 17 Следующая »
ПрограммированиеФорумГрафика