【发布时间】:2013-08-01 15:26:19
【问题描述】:
我为我的图形引擎编写了一个阴影贴图着色器。我遵循了这些教程: Part 1 及以下部分。
不幸的是,我得到的结果有点偏离。这里有一些screenshots。它们显示了我的场景通常的样子,启用了阴影的场景和阴影贴图的内容(请忽略中心的白色东西,这只是鸭子的几何形状)。
这是我在片段着色器中计算坐标以对阴影贴图进行采样的方式:
float calcShadowFactor(vec4 lightSpacePosition) {
vec3 projCoords = lightSpacePosition.xyz / lightSpacePosition.w;
vec2 uvCoords;
uvCoords.x = 0.5 * projCoords.x + 0.5;
uvCoords.y = 0.5 * projCoords.y + 0.5;
float z = 0.5 * projCoords.z + 0.5;
float depth = texture2D(shadowMapSampler, uvCoords).x;
if (depth < (z + 0.00001f))
return 0.0f;
else
return 1.0f;
}
lightSpacePosition 向量通过以下方式计算:
projectionMatrix * inverseLightTransformationMatrix
* modelTransformationMatrix * vertexPosition
投影矩阵为:
[1.0f / (tan(fieldOfView / 2) * (width / height)), 0.0f, 0.0f, 0.0f]
[0.0f, 1.0f / (tan(fieldOfView / 2), 0.0f, 0.0f]
[0.0f, 0.0f, (-zNear - zFar) / (zNear - zFar), 2.0f * zFar * zNear / (zNear - zFar)]
[0.0f, 0.0f, 1.0f, 0.0f]
我的阴影贴图似乎没问题,我确保渲染通道使用与我的阴影贴图通道相同的 lightSpacePosition 矢量。但我不知道出了什么问题。
【问题讨论】:
-
[0.0f, (-zNear - zFar) / zRange, 2.0f * zFar * zNear / zRange] 只有3个变量???
-
浮点 z = 0.5 * projCoords.z + 0.5;也许应该是 float z = projCoords.z
-
哦,我的错 - 我会编辑它。不,那是行不通的。然后每个像素都赢得了阴影/照明测试并被点亮。无论如何,我在这里有点困惑。我在其他教程和关于堆栈交换的问题中找到的偏差矩阵对 z 值的作用相同,但这些深度值不应该已经在 [0;1] 中,还是它们实际上在 [-1;1] 中并且负片被剪掉了?
-
我真的不知道,我从来没有做过阴影贴图
标签: opengl glsl shadow shadow-mapping