我现在正在进行深度阴影贴图,并从本教程中学习 (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
答案 0 :(得分:1)
(1) 不确定如果我正确理解了这个问题。如果你在渲染目标中写入深度,那么你可以从相关的纹理中读取它。
(2) texture_viewproj_matrix从世界空间转换为光的屏幕空间,并重新调整xy从[-1; 1]到[0; 1]的结果。基本上在xy / w中你可以获得接收器的阴影贴图UV坐标和接收器的z - 阴影贴图深度。
(3) finalCenterDepth - 从阴影贴图读取深度并通过深度偏差调整以修复痤疮伪影。 shadowUV.z - 接收器的深度也由深度偏差调整。 vertexColour - 亮色,在顶点着色器中计算(参见receiverVP中的outColour)。