Зеркала с отложенным рендерингом и окклюзией окружающей среды - PullRequest
0 голосов
/ 28 декабря 2018

Как видно из названия, я пытаюсь создать зеркальное отражение при использовании отложенного рендеринга и ambient occlusion.Для внешней окклюзии я специально использую алгоритм ssao.

Для создания зеркала я использую основную идею - отразить все модели на другой стороне зеркала, а затем отобразить только части, видимые через зеркало.

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

Моя проблема теперь связана с алгоритмом ssao.Кажется, что отраженные объекты рассчитаны на высокую степень окклюзии, и это приводит к темным областям, которые вы можете увидеть в зеркале:

enter image description here

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

Обратите внимание, что все данные в gBuffer находятся в поле зрения.Так что здесь должна быть связь.Возможно, случайные выборки, используемые во время ssao или их нормалей, не рассчитаны правильно.

Итак, это фрагментный шейдер для внешней окклюзии:

void main()
{
vec3 fragPos = texture(gPosition, TexCoords).xyz;
vec3 normal = texture(gNormal, TexCoords).rgb;
vec3 randomVec = texture(texNoise, TexCoords * noiseScale).xyz;

vec3 tangent = normalize(randomVec - normal * dot(randomVec, normal));
vec3 bitangent = cross(normal, tangent);
mat3 TBN = mat3(tangent, bitangent, normal);

float occlusion = 0.0;
float kernelSize=64;
for(int i = 0; i < kernelSize; ++i)
{
    // get sample position
    vec3 sample = TBN * samples[i]; // From tangent to view-space
    sample = fragPos + sample * radius;
    vec4 offset = vec4(sample, 1.0);
    offset = projection * offset; // from view to clip-space
    offset.xyz /= offset.w; // perspective divide
    offset.xyz = offset.xyz * 0.5 + 0.5;

    float sampleDepth = texture(gPosition, offset.xy).z;

    float rangeCheck = smoothstep(0.0, 1.0, radius / abs(fragPos.z - 
sampleDepth));
    occlusion += (sampleDepth >= sample.z + bias ? 1.0 : 0.0) * rangeCheck;

}
occlusion = 1.0 - (occlusion / kernelSize);

//FragColor = vec4(1,1,1,1);
occl=vec4(occlusion,occlusion,occlusion,1);
}

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

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

...