我正在从网站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 中的阴影贴图
我想我错过了创建帧缓冲区的一些步骤,但不确定如何修复它。