关于cg shader程序的一些问题(OGRE中的Depth Shadow Mapping)

some questions about cg shader program (Depth Shadow Mapping in OGRE)

我现在正在做深度阴影映射,并从本教程中学习 (http://www.ogre3d.org/tikiwiki/Depth+Shadow+Mapping)

我有以下3个问题:

(1)当我使用自定义阴影投射器时,我可以使用 "uniform sampler2D shadowMap " 获得阴影接收器的深度是否正确?

void casterVP( out float2 outDepth        : TEXCOORD0)
{
    outPos = mul(worldViewProj, position);
    outDepth.x = (outPos.z - depthRange.x) * depthRange.w;
}
void casterFP( float2 depth            : TEXCOORD0,
              out float4 result        : COLOR)
{
    result = float4(finalDepth, finalDepth, finalDepth, 1);
}

//shadow receiver fragment program
void receiverFP(uniform sampler2D   shadowMap       : register( s0 ))
{
}

(2) 我不是很确定这个矩阵(texture_viewproj_matrix)是干什么用的。

我猜,

纹理坐标->相机坐标->屏幕坐标??

并且纹理坐标应该是二维的。 我说得对吗?

(3) 在阴影接收器片段着色器中,我不知道这行是什么意思。 还有,这 3 个变量(finalCenterDepth,shadowUV.z 和 vertexColour)代表深度吗?

result = (finalCenterDepth > shadowUV.z) ? vertexColour : float4(0,0,0,1);

谢谢~ 任何建议对新手都有用:D

(1) 不确定我是否正确理解了这个问题。如果您将深度写入该渲染目标,那么您可以从关联的纹理中读取它。

(2) texture_viewproj_matrix 从世界 space 转换为光的屏幕 space 并将生成的 xy 从 [-1;1] 重新调整为 [0;1]。基本上在 xy/w 中你会得到接收器的阴影贴图 UV 坐标,在 z 中 - 接收器的阴影贴图深度。

(3) finalCenterDepth - 从阴影贴图中读取的深度并通过深度偏差进行调整以修复粉刺伪影。 shadowUV.z - 接收器的深度也由深度偏差调整。 vertexColour - 光照颜色,在顶点着色器中计算(请参阅 receiverVP 中的 outColour)。