Внедрение OpenGL GLSL SSAO - PullRequest
       111

Внедрение OpenGL GLSL SSAO

13 голосов
/ 30 января 2012

Я пытаюсь реализовать Screen Space Ambient Occlusion (SSAO) на основе демоверсии R5, найденной здесь: http://blog.nextrevision.com/?p=76

Фактически я пытаюсь адаптировать их SSAO - Linear shader, чтобы вписаться в мой собственный маленький движок.

1) Я вычисляю нормали поверхности View Space и значения линейной глубины. I Сохраняю их в RGBA-текстуре, используя следующий шейдер:

Вершина:

varNormalVS = normalize(vec3(vmtInvTranspMatrix * vertexNormal));
depth = (modelViewMatrix * vertexPosition).z;
depth = (-depth-nearPlane)/(farPlane-nearPlane);
gl_Position = pvmtMatrix * vertexPosition;

Фрагмент:

gl_FragColor = vec4(varNormalVS.x,varNormalVS.y,varNormalVS.z,depth)

Для моего линейного расчета глубины я ссылался на: http://www.gamerendering.com/2008/09/28/linear-depth-texture/

Это правильно?Текстура кажется правильной, но, возможно, это не так?

enter image description here

2) Фактическая реализация SSAO: Как упоминалось выше, оригинал можно найти здесь:http://blog.nextrevision.com/?p=76

или быстрее: на pastebin http://pastebin.com/KaGEYexK

В отличие от оригинала, я использую только 2 входные текстуры, так как одна из моих текстур хранит обе, нормали какRGB и Linear Depht als Alpha.

Моя вторая текстура, случайная нормальная текстура, выглядит следующим образом: http://www.gamerendering.com/wp-content/uploads/noise.png

Я использую почти точно такую ​​же реализацию, но мои результаты неверны.

Прежде чем углубляться в детали, я хочу сначала прояснить некоторые вопросы:

1) ssao shader использует projectionMatrix и его обратную матрицу.

Поскольку это постЭффект обработки, отображаемый на выровненный по экрану квадратор с помощью ортографической проекции, projectionMatrix - это ортографическая матрица.Правильно или неправильно?

2) Наличие комбинированной текстуры нормалей и глубины вместо двух отдельных.

На мой взгляд, это самая большая разница между реализацией R5 имоя попытка внедрения.Я думаю, что это не должно быть большой проблемой, однако, из-за различных текстур глубины, это наиболее вероятно, чтобы вызвать проблемы.

Обратите внимание, что R5_clipRange выглядит следующим образом

vec4 R5_clipRange = vec4(nearPlane, farPlane, nearPlane * farPlane, farPlane - nearPlane);

Оригинал:

float GetDistance (in vec2 texCoord)
{
//return texture2D(R5_texture0, texCoord).r * R5_clipRange.w;
const vec4 bitSh = vec4(1.0 / 16777216.0, 1.0 / 65535.0, 1.0 / 256.0, 1.0);
return dot(texture2D(R5_texture0, texCoord), bitSh) * R5_clipRange.w;
}

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

return texture2D(texSampler0, texCoord).a  * R5_clipRange.w;

Правильно или неправильно?

1 Ответ

11 голосов
/ 30 января 2012

Ваша нормальная текстура кажется неправильной.Я предполагаю, что ваша vmtInvTranspMatrix - это матрица вида модели.Однако это должна быть матрица проекции модель-вид (обратите внимание, что вам нужны нормали пространства экрана, а не нормали пространства просмотра).Расчет глубины правильный.

Я реализовал SSAO один раз, и нормальная текстура выглядит следующим образом (заметьте, здесь нет синего цвета):

screen space normal

1) ssao shader использует projectionMatrix и его обратную матрицу.Поскольку это эффект постобработки, отображаемый на выровненный по экрану квадратик посредством ортогональной проекции, projectionMatrix является ортогональной матрицей.Правильно или неправильно?

Если вы имеете в виду второй проход, на котором вы отрисовываете квад для вычисления фактического SSAO, да.Вы можете избежать умножения на матрицу ортогональной проекции в целом.Если вы визуализируете экранный квадрант с размерами [x, y] в диапазоне от -1 до 1, вы можете использовать действительно простой вершинный шейдер:

const vec2 madd=vec2(0.5,0.5);

void main(void)
{
    gl_Position = vec4(in_Position, -1.0, 1.0);
    texcoord = in_Position.xy * madd + madd;
}

2) Вместо комбинированной текстуры нормалей и глубины вместодва отдельных.

Нет, это не вызовет проблем.Это обычная практика.

...