-1

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

首先,我使用场景对象的模型空间、立方体贴图面的相应视图矩阵和具有 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是一个 samplerCube 类型的采样器

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

fragmentPos_worldspace是世界空间中的片段位置(* modelmatrix)

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

4

1 回答 1

0

所以,最后我做到了。我有阴影:)

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

感谢您的帮助和澄清点

关键是:始终确保比较相同的值!当 depthmap 存储 worldspace-depth 时,也与这样的值进行比较。

于 2013-10-30T17:31:09.047 回答