我想通过以下两遍来计算我的聚光灯的阴影:
首先,我将场景从点光源视图渲染到立方体贴图到所有六个方向,包括场景对象的模型空间,立方体贴图面部的相应视图矩阵和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。所以也要检查错误。
答案 0 :(得分:0)
所以,最后我做到了。我有阴影:)
解决方案: 我使用了带有depthvalues的旧shadowmap技术。我从立方体贴图中采样仍然使用光到顶点的差异(两者都在世界空间中),但我将该值与上面提到的另一个问题中的vertexToDepth()方法进行比较。
感谢您的帮助和澄清要点
重点是:始终确保比较相同的值!当depthmap存储worldspace-depth时,也会比较这样的值。