OpenGL Pointlight Shadowmapping with Cubemaps

OpenGL Pointlight Shadowmapping with Cubemaps

本文关键字:Cubemaps with Shadowmapping Pointlight OpenGL      更新时间:2023-10-16

我想用以下两个通道计算我的点光源的阴影:

首先,我将场景从 pointlight 的视图渲染到立方体贴图的所有六个方向,其中包含场景对象的模型空间、立方体贴图面部的相应视图矩阵和具有 90 度 FOV 的投影矩阵。然后,我将顶点和光源位置之间的距离存储在世界空间中(这是摄像机的位置,因此只是在世界空间中渲染的顶点的长度)。在这里存储世界空间对吗?

立方体贴图是GL_DEPTH_COMPONENT类型化纹理。对于定向和聚光灯,阴影效果很好,但这些都是单一的2D纹理

这是我尝试用来存储距离的着色器:

顶点着色器:

#version 330
layout(location = 0) in vec3 vertexPosition;
uniform mat4 modelMatrix;
uniform mat4 viewMatrix;
uniform mat4 projectionMatrix;
out vec4 fragmentPosition_ws;
void main(){
    gl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4(vertexPosition, 1.0);
    fragmentPosition_ws = modelMatrix * vec4(vertexPosition, 1.0);
}

片段着色器:

#version 330
// Ouput data
layout(location = 0) out float fragmentdist;
in vec4 fragmentPosition_ws;
void main(){
    fragmentdist = length(fragmentPosition_ws.xyz);
}

在第二步中,在渲染光照本身时,我尝试获取如下所示的距离值:

float shadowFactor = 0.0;
vec3 fragmentToLightWS = lightPos_worldspace - fragmentPos_worldspace;
float distancerad = texture(shadowCubeMap, vec3(fragmentToLightWS)).x;
if(distancerad + 0.001 > length(fragmentToLightWS)){
    shadowFactor = 1.0;
}

笔记: shadowCubeMap是采样器立方体类型的采样器

lightPos_worldspace是世界空间中的光源位置(光源已经在世界空间中 - 没有模型矩阵)

fragmentPos_worldspace是世界空间中的碎片(*模型矩阵)

结果是,一切都被照亮了,而不是在阴影中。我敢肯定,渲染成阴影贴图是有效的。我尝试了几种计算阴影的实现,有时锯出类似阴影的东西,可能是物体。但这是 NDC 阴影深度而不是距离方法。因此,也要检查一下是否有错误。

所以,我终于成功了。我有阴影:)

解决方案:我按照建议使用了带有深度值的旧阴影图技术。我从立方体图中采样,仍然使用光与顶点的差异(两者都在世界空间中),但我将该值与提到的另一个问题的 vertexToDepth() 方法进行了比较。

感谢您的帮助和澄清要点

关键是:始终确保比较相同的值!当深度图存储世界空间深度时,还要与这样的值进行比较。