0

我正在从网站https://learnopengl.com/学习 OpenGL ,并且对延迟渲染中的阴影映射有疑问。

阴影贴图在前向渲染中有效,但是当我将其切换到 SSAO 模式时,阴影贴图不会像在前向渲染中那样显示。

创建 gBuffer FBO

unsigned int gBuffer;
glGenFramebuffers(1, &gBuffer); 
glBindFramebuffer(GL_FRAMEBUFFER, gBuffer); 
const unsigned int SHADOW_WIDTH = 1024, SHADOW_HEIGHT = 1024;

unsigned int gPosition, gNormal, gAlbedo, gShadowmap;
glGenTextures(1, &gPosition);
glBindTexture(GL_TEXTURE_2D, gPosition);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA16F, SCR_WIDTH, SCR_HEIGHT, 0, GL_RGBA, GL_FLOAT, NULL);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, gPosition, 0);


glGenTextures(1, &gShadowmap);
glBindTexture(GL_TEXTURE_2D, gShadowmap);
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT24, SCR_WIDTH, SCR_HEIGHT, 0, GL_DEPTH_COMPONENT, GL_FLOAT, NULL);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, gShadowmap, 0);
glDrawBuffer(GL_NONE);
glReadBuffer(GL_NONE);

绘制模型

glBindFramebuffer(GL_FRAMEBUFFER, gBuffer);
    glClear(GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT);

    geoSSAO.use();
    geoSSAO.setMat4("projection", projection);
    geoSSAO.setMat4("view", view);
    geoSSAO.setMat4("model", model);
    backgroundModel.Draw(geoSSAO);

    glBindFramebuffer(GL_FRAMEBUFFER, 0);

绘制四边形

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glm::vec3 lightPosView = glm::vec3(camera.GetViewMatrix() * glm::vec4(lightPos, 1.0));
    shaderLightPass.setVec3("light.Position", lightPosView);
    shaderLightPass.setVec3("light.Color", lightColor);
    shaderLightPass.setMat4("lightSpaceMatrix", lightSpaceMatrix);
    shaderLightPass.setVec3("viewPos", camera.Position);
    glActiveTexture(GL_TEXTURE0);
    glBindTexture(GL_TEXTURE_2D, gPosition);
    glActiveTexture(GL_TEXTURE1);
    glBindTexture(GL_TEXTURE_2D, gNormal);
    glActiveTexture(GL_TEXTURE2);
    glBindTexture(GL_TEXTURE_2D, gAlbedo);
    glActiveTexture(GL_TEXTURE3);
    glBindTexture(GL_TEXTURE_2D, gShadowmap);
    glActiveTexture(GL_TEXTURE4);
    glBindTexture(GL_TEXTURE_2D, ssaoColorBufferBlur);
    renderQuad();

片段着色器

float calculate_shadows(vec4 fragPosLightSpace){
    vec3 projCoords = fragPosLightSpace.xyz/ fragPosLightSpace.w;
    projCoords = projCoords * 0.5 + 0.5;
    float closestDepth = texture(gShadowmap, projCoords.xy).r;
    float currentDepth = projCoords.z;
    
    float shadow = currentDepth -bias> closestDepth? 1.0: 0.0;

    return shadow;};
    void main(){

    float shadow = calculate_shadows(lightSpaceMatrix * vec4(FragPos, 1.0));

    lighting += ((1.0 - shadow) * (diffuse + specular));

    FragColor = vec4(lighting, 1.0);
}

前向渲染中的阴影贴图

SSAO 中的阴影贴图

我想我错过了创建帧缓冲区的一些步骤,但不确定如何修复它。

4

0 回答 0