相关疑难解决方法(0)

glsl sampler2DShadow和shadow2D澄清

我所在的快速背景(确保我们在同一页面上,如果我失踪/假设有些愚蠢的话,进行健全检查):

  • 目标:我想使用延迟光照和阴影贴图渲染阴影场景.
  • 奋斗:找到有关如何使用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;
Run Code Online (Sandbox Code Playgroud)

现在我已经拥有了这个紫外线,我可以从光的pov中获得深刻的"深度"

float depFromLightPOV = texture2D(shadowMap, UVinShadowMap).r;
Run Code Online (Sandbox Code Playgroud)

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

float actualDistance = distance(texture2D(pos_tex, UV).xyz, lightPos);
Run Code Online (Sandbox Code Playgroud)

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


所以这是我的问题:

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

如果所有这些问题都可以在一个简单的文档页面中得到解答,我很乐意,如果有人可以发布这个问题.但我发誓,我一直在寻找几个小时,找不到任何简单的说什么与shadow2D发生了什么!

谢谢!

opengl glsl shadow-mapping

9
推荐指数
1
解决办法
1万
查看次数

标签 统计

glsl ×1

opengl ×1

shadow-mapping ×1