阴影图是否为GL_LESS而不是GL_GREATER或GL_ALWAYS为空白?

问题描述

我已经在我的自定义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非常重要,否则将不会绘制任何内容

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...