永远也不完美的程序

不断学习,不断实践,不断的重构……

常用链接

统计

积分与排名

好友链接

最新评论

总结一下shadowmap的实现

        花了大概几周的时间实现了软阴影。总的来说难度还是比较大的,而且我也走了些弯路,不过也值得,单是写shader不是很难,但要放到引擎中还是有点难度。shadowmap的原理我就不讲了,网上有很多。
        这里所说的是light space shadowmap。单是shadowmap的实现有两种:一种是创建浮点纹理存放深度,然后在shader中与当前像素的深度比较。另一种是创建depthstencil纹理,并设为当前的深度缓冲,最后拿这个纹理作为shadowmap。注意,第二种才是真正的nvidia上说的hardwareshadowmap,第一种并不是。我这里说的是通过两种的比较来总结一下。
        这两种方法都有一个共同点:就是要把像素中的坐标转换到lightviewproj(以灯为视点的投影空间)的纹理坐标。
        我之前一直是用第一种方法,也参考了nvidia上的hardwareshadowmap和softshadowmap,但问题就出来了,深度一定要自己比较,所以当实现了软阴影的时候,自己比较就无法看到软阴影,但不比较,深度又有错误,而且depthbias起不到应有的作用。
        后来改用第二种方法,所有问题都解决了,纹理为D24S8,用tex2DProj就可以自动比较深度,至于为什么能比较,我也不太清楚。如果有高手可以解释一下就非常感谢了。

posted on 2010-07-23 16:01 狂烂球 阅读(3834) 评论(4)  编辑 收藏 引用 所属分类: 图形编程

评论

# re: 总结一下shadowmap的实现 2010-08-04 16:53 Jean

N卡和A卡处理Depth/Stencil Texture(DST)很不同,N卡是D24S8,D32,D16这样的格式,A卡是DF24,DF16这样的格式,而且采样时N卡自动实现深度对比,并且提供同Fetch2x2过滤,A卡则需要另写代码对比  回复  更多评论   

# re: 总结一下shadowmap的实现 2010-08-04 18:37 liangairan

@Jean
呵呵,应该是高手啊,A卡方面的实现,遇到软阴影我暂时还不知道如何做。  回复  更多评论   

# re: 总结一下shadowmap的实现 2012-01-05 23:29 leeco

推荐你看一下VSM,可以用浮点纹理存放深度,就创建成普通的RenderTarget不需要是深度缓冲区,因为通过VSM可以解决对深度值做硬件线性插值没有意义的问题。  回复  更多评论   

# re: 总结一下shadowmap的实现 2012-01-08 10:08 liangairan

@leeco
谢谢!我有空研究一下。  回复  更多评论   


只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理