注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

oxeyeball杂谈

CG技术,动慢等个人喜欢的一切

 
 
 

日志

 
 
关于我

不要穿着拖鞋去扔垃圾哦

网易考拉推荐

Pixie的Point Based occluaion  

2007-09-18 15:34:49|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

        Point Based occluaion的原理,老实说,我也不是太了解,据说起源是有篇在Nvidia Gems2上写的关于如何硬件实现实时occ的论文(迟点买本中文的看看Pixie的Point Based occluaion - oxeyeball - oxeyeball杂谈)。

       关于PBOcc(以下都这样简称了)的优点,就是快!而且不会出现一般光线跟踪产生的噪点。对,PBOcc就是不需要用光线跟踪的。如果你说想看到PBOcc的渲染效果,去看加勒比海盗2~3就了解了。因为PBOcc对付置换表面的时候,并不会像光线跟踪那样速度大幅下降,海盗里面的角色100%使用置换,模型极度复杂,并且使用SSS等技术。ILM公开的数据说PBOcc比光线跟踪的Occ平均快4倍。

       在prman 13之后的版本,PBOcc被加入,另外也加入了Point Based color bleeding。有幸能用到RFM 2.0或者R studio的朋友可能就了解了。另外,Pixie在2.2.1也加入了这些功能,可以说是跟进得很快了。

       再回头说说PBOcc的原理,首先需要用带bake3d()函数的shader,把场景bake成点云数据,并且带有区域面积信息,有法线指向。收集的时候,用occlusion()函数来收集(不了解原理了)。bake点云的密度,直接跟bake渲染时的shading rate有关,area的大小,则与micropolygon areas的大小有关系,法线方向跟bake对应点位置的法线一致。渲染的时候,应该附近的点云密度,area的大小,跟法线方向都对渲染结果直接影响。通常的情况,点云的数据是很大的,简单场景基本都5~6m以上,复杂场景就说不清楚了。所以,通常都是用比较高的shading rate进行bake,最终渲染时再用低shading rate。

 

       介绍到这里,说说如何在maya跟Liquid上实现吧。有经验的,应该看看pixie的官网的说明就知道了。连接在这里:http://www.george-graphics.co.uk/pixiewiki/Documentation/Point_based_GI

      其实bake点云在prman跟pixie上都不是什么新鲜事了,在Liqiuid上实现,需要用maya分层。Liquid是能比较好的支持maya分层的,在命令里面也有简单支持,可惜在job scripts方面,却好像没法把层任务写入进xml里面作任务队列(关于这个,是后话)。

      首先分一个用来bake点云的层。所有物体用以下shader:

surface bake_areas(string filename="")
{
normal Nn = normalize(N);

float a = area(P,"dicing");
bake3d(filename,"_area",P,Nn,"interpolate",1,"_area",a);

// Set Ci and Oi
Ci = Cs * Os * (-normalize(I).Nn);
Oi=Os;
}

 

        然后设置shading rate 到10或20以上,当然要加入层变动属性了。在渲染设置的Options底下的Before WorldBegin里面,加入以下的RIB语句 DisplayChannel "float _area" 。还有以下3项。

Pixie的Point Based occluaion - oxeyeball - oxeyeball杂谈     

       在材质里面填个名字areacloud.ptc,然后渲染,就会在Liquid对应设置的Textures/Generated Maps路径下找到这个.ptc文件。

       Pixie提供一个show.exe,可以用来在3维空间看到点云或者photon的分布状况。不过注意,10m以上的点云文件能打开的机会很少。按p是显示点,默认d是显示一片黑色,其实是一堆堆的有面积“小圆盘”能看到area大小跟大致的法线方向

 Pixie的Point Based occluaion - oxeyeball - oxeyeball杂谈Pixie的Point Based occluaion - oxeyeball - oxeyeball杂谈

 

        再分一个层,然后用以下shader渲染:

 

surface ptocclude(string filename="";float maxsolidangle=0.05;float offset=0;float mut=1)
{
 normal  Ns = faceforward (normalize(N), I);
 float  occ = 0;

 // Compute occlusion
 occ = occlusion(P, Ns, 0, "pointbased",1,"filename",filename,"maxsolidangle",maxsolidangle);
 // Set Ci and Oi
 Ci = (1 - occ*mut+offset) * Cs * Os;
 Oi=Os;
}

 

      然后就得到类似以下的结果:

Pixie的Point Based occluaion - oxeyeball - oxeyeball杂谈

 

       在Pixie的官网,提供的信息,调节Occ得质量似乎只有一个值,就是maxsolidangle。调节起来是越大速度越快,质量会下降。在光线跟踪里面有用的一些参数,比如最大搜索距离,搜索夹角等都似乎变得没有用。

 

       关于后续的问题………………

       以下的问题,不知道是我使用上出差错,还是pixie的bug,还是PBOcc这种方法的固有缺陷。不过一般而言应该首先是我出错了Pixie的Point Based occluaion - oxeyeball - oxeyeball杂谈,希望得到解答。

     

       1:加入DisplayChannel "float _area" 这句RIB十分重要,bale3d()函数要调用,估计对于判断micropolygon areas大小有十分重要的关系。没有加入,就会出现场景过黑,还有Occ不均匀的情况(在多边形密度高的地方黑,少的白),如下图

Pixie的Point Based occluaion - oxeyeball - oxeyeball杂谈

         另外就是这3个设置

       Attribute "cull" "hidden" 0   # Bake out hidden surfaces
       Attribute "cull" "backfacing" 0 # Bake out back faces
       Attribute "dice" "rasterorient" 0   # view-independent dicing
        这里的意思自己意会了,不了解去看看书或prman的docs就知道了,另外直接测试下不同开关状况,然后看看点云的具体情况,会更直观点。

 

       2:关于置换,在bake层跟render层同时使用displacement是可行的,速度也不会下降!这个情况跟ryatrace Occ情况下打开Trace Displacement的情况接近,理论上质量会比较好,而且不同的shader也可以bake在同一个点云文件上。但是估计是Pixie的问题,在nurbs球的极点上镶嵌会产生碎裂状况,这种情况会导致这些位置micropolygon areas判断失误,导致产生过大的area,极点上会发黑。所以这样使用,要判断好模型的的状况跟点云的情况,才做实际使用。一般bake层不置换,render才置换,效果会差点,但是可靠性会更高(这点不知道prman的情况如何)。

       3:关于hair,bake hair的点云好像并不太可靠,会出现area判定不准的情况,好像不好处理。

       4:关于Motion Blur,在bake层使用MB,会发现点云的密度变得很稀疏,分布状况也不理想!其实pixie渲染情况也会这样,micropolygon得分布会变得很稀疏。这样导致点云的判断十分不准,area也是,渲染会出现过黑或者过白的情况。所以不建议在bake层用MB,一般运动模糊不拖太长的情况,这样做大致也不会出错。

       5:关于SUBD,不知道是Liquid翻译的问题,还是Pixie的问题(估计前者问题居多~),Pixie渲染maya的SUBD法线是反的,于是生成的点云的法线…………Pixie的Point Based occluaion - oxeyeball - oxeyeball杂谈解决方法迟点查查Liquid的代码,或者专门写反转法线用的shader代码给SUBD用…………

       6:关于自动化,每次渲染都要手工渲染2个层真麻烦~,Liquid提供了不错的mel命令去发动渲染,作信息反馈等工作,也提供了不错的job scripts操作。可是job scripts部分我查不到很好的办法写进层渲染的信息。因为点云的文件比较大,假如生成点云序列,你看着自己的硬盘是会痛哭流涕的,最好的办法是每桢都替代掉之前的点云文件,大概。不过job scripts好像并不能提供这样的任务排序~。于是我的解决方法是用mel写出.bat文件,然后再用maya自动执行这个.bat来渲染,作自动任务排序渲染。由于要连shadow rib也恰当排序,虽然liquid能反馈shadow rib的信息,不过也要作很多蹩脚的字符串操作~~。关于mel,以后打算扩展成能把其他点云信息,sss,假反射等也加入的综合性的东西,并且能做比较好的渲染任务排序等。这个就下回分解了。这里多谢yuyu叔跟sea叔在mel方面的不遗余力的指导Pixie的Point Based occluaion - oxeyeball - oxeyeball杂谈

        关于Liquid的mel命令,请看以下连接:http://liquidmaya.sourceforge.net/liquidwiki/index.php/Reference/commands

  评论这张
 
阅读(760)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017