具有延迟渲染和环境光遮挡的镜子

时间:2018-12-28 12:48:35

标签: opengl deferred-rendering 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);
}

关于为什么出现这些黑色区域的任何想法或纠正它们的建议? 我只是可以忽略反射中的环境光遮挡,但是对此我并不满意。

也许,如果环境光遮蔽着色器使用了反射对象的位置和法线,就不会有问题。但是,那时我将麻烦在缓冲区中保存更多内容,因此我暂时放弃了这个想法。

0 个答案:

没有答案