关于cg着色器程序的一些问题(OGRE中的深度阴影映射)

时间:2015-07-11 08:16:01

标签: rendering shader shadow ogre cg

我现在正在进行深度阴影贴图,并从本教程中学习 (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 )用于什么。

我想,

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

和纹理坐标应为2-D。 我是对的吗?

(3) 在阴影接收器片段着色器中,我不知道这条线的含义。 并且,这三个变量(finalCenterDepth,shadowUV.z和vertexColour)代表深度吗?

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

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

1 个答案:

答案 0 :(得分:1)

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

(2) texture_viewproj_matrix从世界空间转换为光的屏幕空间,并重新调整xy从[-1; 1]到[0; 1]的结果。基本上在xy / w中你可以获得接收器的阴影贴图UV坐标和接收器的z - 阴影贴图深度。

(3) finalCenterDepth - 从阴影贴图读取深度并通过深度偏差调整以修复痤疮伪影。 shadowUV.z - 接收器的深度也由深度偏差调整。 vertexColour - 亮色,在顶点着色器中计算(参见receiverVP中的outColour)。