关于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)。
我现在正在做深度阴影映射,并从本教程中学习 (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)。