SSAO Opengl问题

时间:2016-02-22 17:14:37

标签: c++ opengl ssao

所以我从这个Tutorial = Good Tutorial Here

中实现了SSAO

我的SSAO着色器

#version 330 core
out float FragColor;
in vec2 TexCoords;

uniform sampler2D gPositionDepth;
uniform sampler2D gNormal;
uniform sampler2D texNoise;

uniform vec3 samples[64];

// parameters (you'd probably want to use them as uniforms to more easily tweak the effect)
int kernelSize = 64;
float radius = 1.0;

uniform vec2 widthAndHeight;

// tile noise texture over screen based on screen dimensions divided by noise size
vec2 noiseScale = vec2(widthAndHeight.x/4.0f, widthAndHeight.y/4.0f); 

uniform mat4 projection;

void main()
{
    // Get input for SSAO algorithm

    vec3 fragPos = texture(gPositionDepth, TexCoords).xyz;
    vec3 normal = texture(gNormal, TexCoords).rgb;
    vec3 randomVec = texture(texNoise, TexCoords * noiseScale).xyz;
    // Create TBN change-of-basis matrix: from tangent-space to view-space

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

    // Iterate over the sample kernel and calculate occlusion factor

    float occlusion = 0.0;

    for(int i = 0; i < kernelSize; ++i)
    {
        // get sample position
        vec3 sample = TBN * samples[i]; // From tangent to view-space
        sample = fragPos + sample * radius; 

        // project sample position (to sample texture) (to get position on screen/texture)
        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; // transform to range 0.0 - 1.0

        // get sample depth
        float sampleDepth = -texture(gPositionDepth, offset.xy).w; // Get depth value of kernel sample

        // range check & accumulate
        float rangeCheck = smoothstep(0.0, 1.0, radius / abs(fragPos.z - sampleDepth));
        occlusion += (sampleDepth >= sample.z ? 1.0 : 0.0) * rangeCheck;           
    }
    occlusion = 1.0 - (occlusion / kernelSize);  
    FragColor = pow(occlusion, 4);
}

我认为只有一个问题。当使用着色器时,我得到了奇怪的灰色线条,我真的不知道我现在应该做什么。 Here's a picture from the problem 我测试了不同的值等等。但我从来没有完全正确。 有人有什么想法吗?

0 个答案:

没有答案