【问题标题】:Deferred Shadow Mapping GLSL延迟阴影映射 GLSL
【发布时间】:2014-05-17 19:04:18
【问题描述】:

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

我做的步骤是:

  1. 在灯光视图中获取位置
  2. 转换为灯光视图剪辑空间
  3. 使用 * 0.5 + 0.5 获取阴影 tex 坐标;
  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;

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

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

【问题讨论】:

  • 一些图片要显示??什么同步性..:-)
  • 乍一看,用眼睛向量计算shadowTexCoord很奇怪。它应该用translate(0.5,0.5) * scale(0.5,0.5) * lightProj * lightView * vertexPos 计算 - (modelTransformations * vertexPos)
  • 您看到的图像是不使用眼睛矢量的结果。我只使用了位置纹理中的位置。是否需要对象模型矩阵?这不是 gbuffer 位置纹理的用途吗?
  • 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
  • 您确定使用延迟渲染吗?我不知道我应该如何将每个模型矩阵传递给延迟传递,因为这只是一个阴影四边形。并且您使用不推荐使用的 glsl 函数,例如 glTextureMatrix。我使用 4.2 核心。

标签: opengl mapping glsl shadow deferred


【解决方案1】:

好的,我修好了。问题在于光照深度与 gbuffer 纹理的大小不同。

要使用不同的纹理大小,我必须用它们进行归一化

coords = (coords / imageSize ) * windowSize;

【讨论】:

    猜你喜欢
    • 2015-01-17
    • 2014-01-16
    • 1970-01-01
    • 2016-12-22
    • 1970-01-01
    • 2015-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多