【问题标题】:Shadow mapping with a deferred rendering带有延迟渲染的阴影映射
【发布时间】:2014-12-13 17:58:58
【问题描述】:

我正在尝试实现一种阴影贴图技术,但我遇到了一些问题才能让它发挥作用。

我在灯光的位置有一个相机,这是我得到的阴影贴图。所有的顶点都乘以每个modelViewProjectionMatrix

我还有一个带有顶点世界位置的纹理。这是一个GL_RGBA32F 纹理,因为所有点都乘以每个ModelMatrix 以得到世界空间中的点。

还有着色器:

layout(binding=5) uniform sampler2D shadowMap;
layout(binding=6) uniform sampler2D positionMap;

in vec2 texcoord;
uniform mat uViewProjectionMatrix;

out vec4 color;

void main() {

   vec4 pos = texture(positionMap, texcoord);

   vec4 ShadowCoord = uViewProjectionMatrix * pos;
   ShadowCoord.xy = ShadowCoord.xy * vec2(0.5,0.5) + vec2(0.5,0.5);

   float a = texture(shadowMap, ShadowCoord.xy).z;
   color = vec4(a, a, a, 1.0);
}

输出(摄像头与灯光几乎在同一位置):

我只是想看看每个顶点的投影是否正确地从相机的位置开始,但看起来不是。 这一切的重点是比较:

if ( texture(shadowMap, ShadowCoord.xy).z <  ( ShadowCoord.z-bias ) )

但它也不起作用。

如果有任何帮助,我将不胜感激。 谢谢。

【问题讨论】:

    标签: opengl shadow-mapping deferred-rendering


    【解决方案1】:

    你错过了透视划分,你似乎完全忽略了深度范围。

    这里的总体思路是将ShadowCoord.xyz 置于[0,1] 范围内(用于纹理查找和深度比较)。您的代码在 uViewProjectionMatrix * pos (剪辑空间坐标)在 [-1,1] 范围内的假设下运行,但除非您除以w(国家数据中心坐标)。

    我会考虑这样的事情:

    void main() {
      vec4 pos = texture(positionMap, texcoord);
    
      vec4 ShadowCoord = uViewProjectionMatrix * pos;
      ShadowCoord /= ShadowCoord.w;
    
      ShadowCoord.xyz = ShadowCoord.xyz * vec3 (0.5f, 0.5f, 0.5f) + vec2 (0.5f, 0.5f, 0.5f);
    
      float a = texture(shadowMap, ShadowCoord.xy).z;
      color = vec4(a, a, a, 1.0);
    }
    

    在此之后,ShadowCoord.xy 将是在您的阴影贴图中查找的纹理坐标,ShadowCoord.z 将是当前片段从您的灯光角度看的深度。您可以使用ShadowCoord.z 与采样深度进行比较。

    事实上,您甚至可以考虑使用sampler2DShadow 来更有效地执行此操作。有关示例,请参阅this related question and answer

    【讨论】:

    • 如果答案不清楚,我还调整了您的代码,以便将剪辑空间 z 坐标缩放和偏置到 [0 范围内, 1](来自 [-1,1])。从阴影贴图中获取的值将在 [0,1] 中,因此您不能忽略该步骤。你需要为xyz 做这件事,而不仅仅是像原来的xy
    • 带有 sampler2DShadow 的“陷阱”是使用最近的样本,即使最小/mag 过滤器使用线性也是如此。如果您希望通过在阴影贴图深度上使用线性插值来减少阴影粉刺,这可能会令人困惑。见gamedev.stackexchange.com/questions/88187/…
    • @PaulRenton:实际上,它实际插值的是 4 个最近邻深度样本的 4 个二进制通过/失败深度测试的结果。我链接到的答案中对此进行了解释。
    • 哇!这就是问题所在。我已经尝试过除以 w,但我忘了在 z 分量中进行乘法和加法运算……所以当我比较深度时……奇怪的事情发生了。非常感谢您的宝贵时间。
    猜你喜欢
    • 2016-12-22
    • 1970-01-01
    • 2015-01-17
    • 2014-05-17
    • 1970-01-01
    • 2018-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多