nicky

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
很久没更新了。。。
最近做的一个demo,其实就是毕设了。算起来写这个之前大概已经有一年没写代码了,呵呵。

系统要求:
R300+, NV40+显卡
需要d3dx9_29.dll
ppprt.part1.rar
ppprt.part2.rar

原理比较简单,将SH光照对HL2的3个轴的结果利用MRT渲染3张lightmap到SH纹理空间(也可以叫lightmap空间),之后利用HL2的Radiosity Normal Mapping方法渲染最终结果,HDR作后期处理。
具体:
预计算建立5阶SH纹理,PRT光照在像素级别计算,这样可以适应低模场景。只不过跟一般的像素PRT不同,考虑Phong光照下的BUMP MAPPING渲染,这样就需要实时采样法向量。P.P.Sloan利用各种基函数来实现BUMP,不过这些都是对渲染公式分出3项进行SH编码,然后计算对法向的卷积,导致SH矩阵的需求。为避免SH矩阵,可以将实时的法向分离到3个已知的HL2正交基进行预计算。考虑到公式的求值复杂性specular用一阶函数(r.s)。渲染时首先对3个基向量渲染得到当前所见的区域的lightmap,具体参考ATi Ruby demo。渲染结果用RGBS编码减少存储和带宽。之后利用法向和眼反射向量对3个基向量的COS权值完成最终的光照公式求值。
HDR在ATi显卡上考虑到fp filter不支持可以用int16渲染中间结果。天空纹理用RGBS编码,filter效果很不错。


2006-7-2:
更新了一下,加入了一些选项:
/Files/nicky/ppprt_update.rar
解压后覆盖原bin文件夹

本想作一下FSAA,发现找不到一个很好的方法。FP16+MSAA的硬件尚未普及,我们只好用其他方法。利用shader作SSAA耗费太大了,FPS剧减而且采样率还不能太高。利用RGBE/RGBS/RGBdiv等编码通过framebuffer来作MSAA倒是可行,不过都属于hack,而且感觉RGBS/RGBdiv实在是不能适应很广的动态范围,会出现banding。Edge-detection FSAA,只能说是一种柔化边界的方法,因为根本上来说采样率并没有提高。

截图:


posted on 2006-06-27 02:18  nicky  阅读(1903)  评论(7编辑  收藏  举报