13

我所在位置的快速背景(以确保我们在同一页面上,并检查我是否遗漏/假设一些愚蠢的东西):

  • 目标:我想使用延迟光照和阴影贴图来渲染我的场景。
  • 奋斗:找到关于如何使用 shadow2D 和 sampler2DShadow 的清晰一致的文档。

这是我目前正在做的事情:

在我的最终渲染通道的片段着色器(实际计算最终片段值的那个)中,我有来自灯光的通道的 MVP 矩阵,来自所述通道的深度纹理(又名“阴影贴图”),以及我的几何缓冲区中的位置/法线/颜色纹理。

据我了解,我需要找到当前片段的位置对应的阴影贴图的UV。我通过以下方式做到这一点:

//Bring position value at fragment (in world space) to screen space from lights POV
vec4 UVinShadowMap = (lightProjMat * lightViewMat * vec4(texture(pos_tex, UV).xyz,1.0)).xy; 
//Convert screen space to 'texture space' (from -1to1 to 0to1)
UVinShadowMap = (UVinShadowMap+1)/2;

现在我有了这个紫外线,我可以从光线的 pov 中获得感知的“深度”

float depFromLightPOV = texture2D(shadowMap, UVinShadowMap).r;

并将其与当前片段位置与灯光之间的距离进行比较:

float actualDistance = distance(texture2D(pos_tex, UV).xyz, lightPos);

问题来自“深度”存储在值 0-1 中,而实际距离位于世界坐标中。我尝试手动进行转换,但无法正常工作。在网上搜索时,看起来我应该这样做的方式是使用 sampler2DShadow ...


所以这是我的问题:

我需要进行哪些更改才能使用 shadow2D?shadow2D 甚至可以做什么?它或多或少只是一种从深度到世界的自动转换纹理?我可以使用相同的深度纹理吗?还是我需要以不同的方式渲染深度纹理?我将什么传递给 shadow2D?我要检查的片段的世界空间位置?还是和以前一样的紫外线?

如果所有这些问题都可以在一个简单的文档页面中得到解答,我希望有人可以发布它。但我发誓我已经搜索了好几个小时,但找不到任何能简单说明 shadow2D 到底发生了什么的东西!

谢谢!

4

1 回答 1

50
于 2014-03-15T16:28:56.957 回答