代码改变世界

Point Based Rendering的一些测试

2010-05-29 16:37  六水  阅读(1390)  评论(15编辑  收藏  举报
最近实在没干什么能见人的东西,也没啥好发的.后来想想,实在太无聊,还是
发发上周做的几个关于PBR的一些测试好了,一方面聊聊自己对PBR的认识,
另一方面想和朋友们交流下想法.
几个测试的图如下:

images/pbr0_a.jpg

原始数据是以三角形组织起来的模型,大概20W个顶点.这还远远未能体现出
PBR的好处.

模型是使用FaceGen这软件做的,出来的MESH其实并不适合做PBR,因为它太
不均匀了,如上图的右边那张,嘴巴和眼睛周围的顶点太密了,与整个模型的顶
点排布情况相差太大,而我是在一批里渲染完的,点的大小都一样.,于是造成了
效果有问题.于是想使用3DSMAX等里提供的修改器来把模型修改均匀,结果
没找到对应的功能(Remeshing),后来问了下小老鼠,她说也没找着,或许是没
有这个功能了.以后要真的搞起PBR来,还真得自己去写Remeshing的算法了.

使用点的好处
跟三角形相比,点不需要保存拓扑关系,更加容易并行处理.于是产生了使用GPU
来加速点模型的相关操作的可能.<Highly Parallel Surface Reconstruction>一
文里就讲到了使用GPU加速点模型的表面重构,布耳运算以及其他修改的问题.

为什么要用Point Based Rendering
一方面,有些模型的采集结果本身就是点,譬如用扫描回来的模型数据.而往往
这些点会比较密集(比较多,譬如超过100W),这时候,使用PBR,就不需要把它
转换成三角网格也能渲染了.

另一方面,从相关的PAPERS里可以了解到,使用PBR,其实更加容易做LOD了.我
们也可以用PBR来渲染一些三角形面数目很多的模型.试想一下,假设渲染用的
分辨率是1024*768,那渲染的象素才不到80W个呢,那假如要渲染一个有着超
过100W个三角形的模型,那平均下来,每个三角形都不到一个象素呢,既然这样,
如果想加速渲染,为何不使用点来代替三角形?

以下是简化的模型,用来展现其几何结构:
 images/pbr1.jpg


PBR实现的简单方法
总的来说,有种方法了,如上图所示.开始的时候,人们提出了直接使用D3D或GL里
的点精灵来绘制.这方法应该来说是最快的.不过,当点比较少的时候,这方法经常
会存在比较严重的锯齿问题.也有人提出了使用超采样的方法来解决这种问题,但
当点比较少的时候,还是不能完全消除锯齿.
后来人们又提出了基于四边形(或两个三角形)+ALPHA纹理的方法来渲染.纹理里
其实就是绘制了一个带ALPHA的圆.从微分几何的角度来看,椭圆是能逼近曲线的.
不过,这样一来,所要渲染的三角形其实就增加了.于是,人们又提出了模型内自适
应LOD的优化方法.就是说,离视点比较远的点,就可以把几个"附近"的点合并成一
个点来渲染.这就涉及到许多空间划分的算法了....当然,基于点精灵的方法,也可以
使用该LOD方法来优化.

关于高质量的PBR
总的来说,PBR的效果并没有使用平常渲染方法的效果好.于是有些人似乎也很热衷
研究各种提高渲染质量的方法,譬如著名的使用EWA过滤的PBR.不过对这东西我还
不怎么热衷,呵呵,我还是想把精力放在高效率的渲染以及高效率的模型编辑上好了。
以后有可能会做做GPU加速的点模型并行计算.