延迟阴影贴图GLSL

3

我目前正在实现延迟渲染管线,并卡在了阴影映射上。

我已经成功地将其实现到正向渲染管线中。

我的步骤如下:

  1. 获取在光照视图中的位置
  2. 转换为光照视图剪裁空间
  3. 使用* 0.5 + 0.5获取阴影纹理坐标
  4. 检查深度

编辑:使用新的结果图片更新了代码:

float checkShadow(vec3 position) {
// get position in light view
mat4 invView = inverse(cameraView);
vec4 pEyeDir =  sunBias * sunProjection  * sunView * invView  * vec4(position, 1.0);

// light view clip space
pEyeDir = pEyeDir / pEyeDir.w;

// get uv coordinates
vec2 sTexCoords = pEyeDir.xy * 0.5 + 0.5;

float bias = 0.0001;
float depth = texture(sunDepthTex, sTexCoords).r - bias;
float shadow = 1.0f;

if(pEyeDir.z * 0.5 + 0.5 > depth)
{
    shadow = 0.3f;
}

return shadow;

以下是代码中重要的一些变量:

vec3 position = texture(positionTex, uv).rgb;

在某些相机位置上,当我将阴影值乘以最终颜色时,会出现深色背景(网格保持不变)。如下图所示: enter image description here 根据要求,以下是位置和太阳深度纹理: position shadow depth

乍一看,使用眼睛向量计算shadowTexCoord似乎很奇怪。它应该使用translate(0.5,0.5) * scale(0.5,0.5) * lightProj * lightView * vertexPos - (modelTransformations * vertexPos)进行计算。 - j-p
vec4 ModWorldPos = inverse(gl_ModelViewMatrix) * gl_Vertex - inverse(modelView) * gl_Vertex; ShadowCoord = gl_TextureMatrix[7] * (gl_Vertex - ModWorldPos); 这里是我的代码,纹理矩阵为 translate(0.5,0.5) * scale(0.5,0.5) * lightProj * lightView - j-p
你确定你使用了延迟渲染吗?我不知道该如何将每个模型矩阵传递到延迟通道,因为这只是一个着色的四边形。而且你使用了已弃用的GLSL函数,比如glTextureMatrix。我使用的是4.2核心版本。 - Raphael Mayer
有效地说,这不是延迟的,抱歉。从未尝试过延迟阴影映射... - j-p
你能显示原始的positionTex和shadowTex吗? - j-p
显示剩余4条评论
1个回答

5

好的,我已经修复了。问题是光深度与gbuffer纹理的尺寸不同。

为了使用不同的纹理尺寸,我必须对它们进行归一化处理。

coords = (coords / imageSize ) * windowSize;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接