延迟阴影映射 GLSL

Rap*_*yer 3 opengl mapping glsl shadow deferred

我目前正在实现延迟渲染管道,但我仍然坚持使用阴影贴图。我已经成功地将其实施到前向管道中。

我所做的步骤是:

  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;
Run Code Online (Sandbox Code Playgroud)

}

这里有一些对于上面的代码很重要的变量:

vec3 position = texture(positionTex, uv).rgb;
Run Code Online (Sandbox Code Playgroud)

另外,我在某些相机位置得到深色背景(网格保持不变),只有当我将阴影值乘以最终颜色时才会发生。

在此输入图像描述

根据要求,以下是位置和太阳深度纹理:

位置 阴影深度

Rap*_*yer 5

好吧,我修好了。问题是因为光深度的大小与 gbuffer 纹理的大小不同。

要使用不同的纹理大小,我必须将它们标准化

coords = (coords / imageSize ) * windowSize;
Run Code Online (Sandbox Code Playgroud)