我已经在自定义OpenGL引擎中进行阴影映射几天了。在阅读了一些指南后,我尝试尽可能地坚持基本方法:为阴影贴图本身创建一个带有GL_TEXTURE_2D的阴影贴图帧缓冲区,使用帧缓冲区和基本着色器从灯光的角度进行渲染,然后使用主着色器进行正常渲染。
然而,我遇到了一些奇怪的事情:当我使用默认深度函数进行渲染或手动将其设置为GL_LESS时,阴影贴图似乎只填充了0。(我通过将着色器中的shadowmmap值与0进行比较进行了测试,所以我相信它们实际上是0,而不仅仅是很小的数字。(
当我将深度函数设置为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, 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, 0, 0, 1);
}
我的猜测是您忘记清除深度缓冲区了。
你需要在每帧的开头填充最大深度
glClearDepth(1.0);
glClear(GL_DEPTH_BUFFER_BIT);
将其设置为1.0而不是0.0是非常重要的,否则将不会绘制