使用Cubemaps的OpenGL Pointlight Shadowmapping

时间:2013-10-30 16:01:34

标签: c++ opengl matrix glsl shadow

我想通过以下两遍来计算我的聚光灯的阴影:

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

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

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

VertexShader:

#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);
}

FragmentShader:

#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)中的片段位置

结果是,一切都被点燃了。不在阴影里。我确信,渲染到shadowmap有效。我尝试了几种计算阴影的实现,有时候会看到类似阴影的东西,可能是对象。但这是NDC shadowdepths而不是distancemethod。所以也要检查错误。

1 个答案:

答案 0 :(得分:0)

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

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

感谢您的帮助和澄清要点

重点是:始终确保比较相同的值!当depthmap存储worldspace-depth时,也会比较这样的值。