问题描述
我已经在我的自定义OpenGL引擎中进行阴影映射工作了几天。阅读一些指南之后,我尝试着尽可能地坚持基本方法:为阴影贴图本身使用GL_TEXTURE_2D创建一个阴影贴图帧缓冲,使用该帧缓冲和一个基本着色器从灯光的角度进行渲染,然后使用我的主要着色器。
但是,我遇到了一些奇怪的事情:当我使用默认深度功能进行渲染或将其手动设置为GL_LESS时,阴影贴图似乎只填充了0。 (我通过在shader中将shadowmmap值与0进行比较进行了测试,因此我相信它们实际上是0,而不仅仅是很小的数字。)
当我将depth函数设置为GL_GREATER或GL_ALWAYS时,阴影贴图包含非0值,尽管我无法确定这些非0值是否是我要实现的值。
作为参考,这是我正在使用的一些代码:
设置与光有关的矩阵:
glm::vec3 lightPos(100,200,0);
glm::mat4 lightProjection,lightView;
glm::mat4 lightSpaceMatrix;
float near_plane = 0.1f,far_plane = 1000.0f;
lightProjection = glm::ortho(-1000.0f,1000.0f,-1000.0f,near_plane,far_plane);
lightView = glm::lookAt(lightPos,glm::vec3(0.0f,32.0f,0.0f),glm::vec3(0,1,0));
lightSpaceMatrix = lightProjection * lightView;
shader.setMat4("lightSpaceMatrix",lightSpaceMatrix);
用于测试阴影贴图的代码-使用GL_GREATER深度函数,我渲染的对象显示为红色,而使用GL_LESS则显示为红色:
vec3 projCoords = FragPosLightSpace.xyz / FragPosLightSpace.w;
// transform to [0,1] range
projCoords = projCoords * 0.5 + 0.5;
...
float closestDepth = texture(shadowMap,projCoords.xy).r;
if (closestDepth > 0) {
FragColor = vec4(1,1);
}
解决方法
我的猜测是您忘记清除深度缓冲区。
您需要在每个帧的开头填充最大深度
glClearDepth(1.0);
glClear(GL_DEPTH_BUFFER_BIT);
将其设置为1.0而不是0.0非常重要,否则将不会绘制任何内容