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

SSAO

IBetsПользовательwww13 июня 201820:45#0
Читал статьи по SSAO, и чет не понимаю что происходит
Почему не сделать вот так?

Пусть у нас сформирован G-буффер, kernel - набор векторов  в полусфере,  текстура  со случайными нормалями 

float3 position; //Из G-буффера
float3 normal;  //Из G-буффера
float   depth;  //Из G-буффера
float3 random //Из текстуры с нормалями
Проводим ортогонализацию Грамма-Шмидта:
float3 tanget  =  normalize(normal - dot(normal, random) * normal)
float3 binormal = cross(normal, tanget)
//Формируем матрицу перехода к другому базису
float3 TNB = (tanget, normal, binormal)

/И собственно производим расчет

float occlusion = 0
for(int index = 0; index < SSAO_KERNEL_SIZE; index ++) {
  oclussion += ComputeOccusion(mul(kernek[index], TNB), position, depth, radius)
}
PS: Нормали и позиции в мировом простаранстве

Правка: 13 июня 2018 20:57

MisanthropeПостоялецwww13 июня 201821:30#1
IBets
> Почему не сделать вот так?
ну сделай, в чем проблема?
MrShoorУчастникwww13 июня 201821:37#2
IBets
> Почему не сделать вот так?
А чем твой вариант приципиально отличается? Ну кроме того, что он вычислительно сложнее.
IBetsПользовательwww13 июня 201821:43#3
MrShoor
Ну я и спрашиваю. Я сделал так зная идею. Но вижу чужой код, там по другому и нет коментарив почему именно так. Еще возникают шумы при движении камерой

Правка: 13 июня 2018 21:43

MrShoorУчастникwww13 июня 201821:56#4
IBets
> Но вижу чужой код, там по другому и нет коментарив почему именно так.
Не знаю какой именно другой код ты смотришь, но попробую объяснить самый тру вей.
Вот у тебя есть куча векторов, случайно распределенных по сфере.
Понятное дело, что ты хочешь получить кучу векторов, случайно распределенных по полусфере, и чтобы эта полусфера была ориентирована вдоль нормали к поверхности.
Так вот, чтобы получить такую полусферу - достаточно флипнуть те вектора которые тебе не подходят. А не подходят тебе те, которые dot(n, kernel[ i ]) < 0
Вот и выходит, что все, что тебе нужно сделать, это помножить на sing от этого dot:
for(int index = 0; index < SSAO_KERNEL_SIZE; index ++) {
  float3 current_ray = kernek[index] * sign(dot(kernek[index], normal));
  oclussion += ComputeOccusion(current_ray, position, depth, radius)
}
И твоя математика с TBN тут нафиг не нужна.

Правка: 13 июня 2018 21:57

IBetsПользовательwww13 июня 201822:20#5
MrShoor
Во норм объяснение благодарю
MAMOHT-92Постоялецwww13 июня 201822:36#6
IBets
> Во норм объяснение благодарю
плюсую

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

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