游戏开发论坛

 找回密码
 立即注册
搜索
查看: 1891|回复: 2

shadow map 一个疑惑

[复制链接]

2

主题

31

帖子

57

积分

注册会员

Rank: 2

积分
57
发表于 2010-5-1 16:48:00 | 显示全部楼层 |阅读模式
shadow map实现

VSOUTPUT_UNLIT VS_Unlit( float4 inPosition : POSITION )
{
        // Output struct
        VSOUTPUT_UNLIT OUT = (VSOUTPUT_UNLIT)0;

        // Output the transformed position
        OUT.vPosition = mul( inPosition, g_matWorldViewProj );
               
        // Output the projective texture coordinates
        OUT.vTexCoord = mul( inPosition, g_matTexture );//纹理矩阵=[灯光视图投影矩阵][映射],后面映射不会
                                                           //影响z值

        return OUT;
}
顶点程序处理,是以相机为视点的。一方面它输出位置,把数据传给光栅器处理。另一方面,原始位置乘上纹理矩阵后(以灯光为视点),这部分数据是不是放在放纹理显存中?由于场景中所渲染目标点极有可能在灯光形成视锥体外部,会不会发生裁剪?

float4  PS_Unlit( VSOUTPUT_UNLIT IN ) : COLOR0
{
。。。
  for( int i = 0; i < 9; i++ )
  {
  float A = tex2Dproj( ShadowSampler, vTexCoords ).r;//这里vTexCoords看作IN.vTexCoord的一个值就行
  float B = (IN.vTexCoord.z - 0.001f);//相对于灯光的矩离,值变小一点,是为了正确渲染
               
  // Texel is shadowed
  fShadowTerm += A < B ? 0.1f : 1.0f;
。。。
}
这里是像素程序对 以相机为视点经插值后的像素点作进一步处理。
tex2Dproj( ShadowSampler, vTexCoords ).r  
一些灯光视锥体外的顶点,他们原来在顶点程序阶段是要投影灯光的近裁平面上,所认最后生成的纹理坐标,我认为自然会跑到[0,1]外面(确切地说是,[0w,w],因为tex2dproj会做透视除法,真正归一化),让人困扰的是,用跑出纹理坐标外的点去检索那张一开始就成生的阴影图,结果会如何?显卡到底隐藏了什么细节?

问题是不是可以归结为:顶点/象素着色器中 :TEXTURE0 这个标识,显示到底是如何处理它的?

有高手一不小心路过,务必点拨一下。谢谢~

42

主题

140

帖子

158

积分

注册会员

Rank: 2

积分
158
发表于 2010-5-1 21:09:00 | 显示全部楼层

Re:shadow map 一个疑惑

结果在投影平面会重复N个阴影,一般纹理要Clamp吧。TEXTURE0 就是个寄器,存储空间

14

主题

345

帖子

376

积分

中级会员

Rank: 3Rank: 3

积分
376
QQ
发表于 2010-5-4 21:13:00 | 显示全部楼层

Re:shadow map 一个疑惑

这部分数据是不是放在放纹理显存中?
        放在RenderTarget中...不要只看shader嘛
会不会发生裁剪?
        你把RenderTarget当成图片画出来就知道了
结果会如何?
        结果就那里没阴影...如果不对算法进行优化, ShadowMap很容易就会看到边界的
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-6-9 23:25

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表