在阴影传递中计算立方体贴图的阴影贴图坐标?

我正在尝试使用立方体贴图来实现阴影贴图。 我相信我已经完成了立方体贴图的第一阶段,但对于最终的着色阶段,我不确定如何精确计算立方体贴图坐标。 任何指针?

要使用立方体贴图进行阴影处理,您需要重新创建正在渲染的像素的世界位置 ,然后从光源获取指向该世界位置的法线,现在可以计算像素距离光源的距离以及检查立方体贴图到第一个阴影投射对象的距离。

顶点着色器需要沿顶点的z和w分量发送,以便在片段着色器中执行unprojection

output.position = mul(input.position, worldViewProjMatrix); output.depth.xy = output.position.zw; 

然后,您可以将这些值与像素着色器中的逆向投影matrix结合起来,以重新创建每个像素的世界位置:

 float4 projectedPos = float3(input.position.xy, input.depth.x / input.depth.y, 1); float4 worldPos = mul(projectedPos, invProjectionMatrix); float4 lightDir = worldPos - lightPos float4 normal = normalize(light2pixel); float dist = distance(worldPos, lightPos); float shadow = texture(shadowCubeMap, normal); if (shadow > dist) // Perform lighting... 

我没有testing这个代码,所以可能有错误和错误,但它应该足以certificate我希望的想法(像素坐标的未投影与其他types的阴影贴图相同,主要区别是使用与立方体贴图正常,而不是用投影计算纹理坐标)。

立方体贴图使用方向作为纹理坐标。 来自OpenGL wiki的引用:

立方体贴图的纹理坐标是3Dvector方向。 这些概念是从cubemap定义的立方体内指向特定方向的方向。 vector不必被归一化。

您必须计算片段指向的方向以获取立方体贴图的方向。 你可以使用顶点法线或其他机制。 在你阴影的情况下,我猜(我自己也没做过,我也是学习者),你可以从相机到片段的方向得到正确的深度纹理,或者至less是类似的东西到那个。

阅读有关立方体贴图的教程 。