我要发帖 回复

新手上路

1

主题

18

积分

0

专家分

:

私信
发表时间 : 2008-1-2 14:58:44 | 浏览 : 2145    评论 : 11
公司要求本人实现一个虚拟现实控制系统,
本人对虚拟现实技术几乎一无所知,在经过2个月左右的学习后,现在采用的实现方案为底层使用图形渲染引擎加VC++混合编程实现。模型建立采用3ds max,为了减小纹理的使用,将采用body paint和纹理集技术,此引擎在本人机器上(本人机器比较差amd 3200+,内存512M)测试时渲染多边形总数39万的场景时,发行版fps26左右。可以满足系统的实时性要求。
本人将要实现的系统包含大约300-500可移动物体。所以瓶颈可能会在渲染的batch。
目前已经实现了场景设计,另加50个左右的可移动物体,总多边形约12000个,桢数32,cpu占用为40%(在未加入可移动物体前,仅为2%),但随着可移动物体的增加,cpu占用急速上升,所以本人很怀疑最终产品可能的效果。因为时间紧迫,3D实现部分开发时间仅有半年左右,所以本人也在考虑其实的解决方案
据说virtool是一个比较强大的工具,不知道在可移动物体达到300-500时,能否提供实时的渲染要求?
谢谢

最近VR访客

rhett 评论于2008-1-2 17:48:05
你遇到的这个问题,最好的解决方案就是采用LOD及裁减算法,把不可见的物体裁减掉
可移动物体batch的消耗是不可避免的,当然也有一些方法,不过对显卡要求比较高
另外,你说的可移动物体是什么?你首先要确定目前的bottleneck是什么,有可能不是渲染,而是移动物体的运动计算
konkoner 评论于2008-1-3 08:36:51
可移动物体是指可操作的物体,随时可以响应用户的要求而移动,旋转做出指定动作到指定的位置,这些物体有可能是同时可见的,
在目前来看,CPU使用上升是在加载移动物体后发生的,实际在指令发出前并未移动。
因为开发虚拟现实软件仅仅两个月,所以很多概念还很模糊,不过,我观察到每增加一个物体,batch增加了2,我猜测是因为使用了两个贴图纹理的原因,所以我想一方面,合并纹理,并使用纹理集技术(现在还在看文献,对此技术仍然所知很少),看看是否会有所改进,另一方面,看看是否有现成的软件可以提供此种支持。如果这两者都不行的话,看看角色动画是否会有帮助,(把一些同样的可移动物体集合到一个角色里,用骨骼联接)........还有其它一些想法,不过估计实现比较复杂,不知是否可行。 
rhett 评论于2008-1-3 09:25:27
3D程序性能优化是一个难度比较高的工作,影响因素很多,对于不同的硬件来说,情况又大不一样,它需要对理论掌握很透彻,需要大量的实践经验,对你来,可能会比较困难
你首先要确定目前的瓶径是什么,虽然你发现是在加载了移动物体 后性能下降,但这有可能会有很多原因
1 纹理内存耗费太多,2 多边形数量太大,填充率太大 ,3 批数量太大,造成CPU-GPU负担 4 小结点创建太多,造成遍历场景树(如octree)太慢......或者就是因为你程序上的垃圾代码造成,这些都是有可能的,但首先你要判断哪个是最重要的影响因素
    另外,你说的两种方法,1 纹理集技术 这个会渲染会有帮助,把小纹理打包成大纹理能够减少渲染状态的改变,但这比较适合静止小物件的渲染,如花花草草.而且在你这种情况下,并不能减少批数,因为你的物体是运动的,变化矩阵不同,批肯定不一样,除非你把变化放到shader,或者用instance技术,不过很麻烦,我觉的也不能解决瓶径问题.另一个方法更不可行,骨骼动画是最废的.
       给你一个建议,先检查你的每个模块代码,看看有没有垃圾代码影响效率,没有的话用性能评测工具对场景进行一个评测,然后把结果发上来,我帮你分析一下吧...
      斑竹这个帖子置顶吧,打这么多字好累!!
konkoner 评论于2008-1-4 08:14:53
不管怎么说,非常感谢
因为比较忙,所以没有即时看到,我现在正忙着合成纹理,给每个移动物体只加载一个纹理,原来有二到三个,我想不管将来怎么做优化,这一步是必须的,不过因为对软件不熟,这三天没有一点进展,bodypaint方面的资料太少了,因为
我对纹理的平铺U向,V向都超过了1,希望在这个底纹理的基础上再画一个纹理,而后一个纹理没有任何U,V向的拉伸(不知道术语说的对不)但无论怎么试,bodypaint里都会出现多个笔头(假设我U,V向平铺为6的话)
关于骨骼动画(有人这么建议我做的,如果我没理解错的话,他原话是Skeleton mesh),他认为这种技术会有帮助,但当且仅当每个节点的纹理是一样的。我还没有试过
不过我想你提到的3 批数量,和4 小结点应该是我重点考虑的对象
另外,你说用性能评测工具?都有哪些工具?我对此一无所知,
再次感谢
rhett 评论于2008-1-4 09:14:17
http://blog.csdn.net/rhett_graph ... /07/08/1682805.aspx
俺又王婆卖瓜了,真不好意思
konkoner 评论于2008-1-7 08:10:54
谢谢,呵呵,受教了,再请教一个问题,建模时,比如两个完全相同的长方体,交 叉成一个十字架,此时我该如何建模才能达到效率最高?
方法一,都用各分段为1的长方体,直接交叉,这样三角形最少,但我担心在渲染时,计算消隐会消耗额外的时间。
方法二,也用各分段为1的长方体,但交叉后,使用bool并集,这样显然增加了多边形个数,但或许计算消隐时会有利。
不知rhett兄有何指教,谢谢
rhett 评论于2008-1-7 09:38:02
方法一
bool运算最好不要用
记得把看不见的面删除掉
现在的显卡多边形数量往往不是瓶颈,而是受限与batch,把一些材质一样的小物体合并起来
konkoner 评论于2008-1-7 09:59:02
bool运算不用的原因是?它产生的边不合理?
受限是指什么?谢谢
在我所说的情况里,因为长方体分段均为一,所以不可见的面是不存在的,只是面的一部分不可见
konkoner 评论于2008-1-11 13:02:23

关于bool运算,找了篇文章,bool不是不能用,而是要慎用

LS阴影锯齿与阴影漏
和初学朋友探讨探讨阴影锯齿与阴影漏以及建模中的问题, 同时了解一下产生阴影锯齿与阴影漏的原因, 从原理上了解一些, 就不用瞎子摸象了 当模型开始传递时.系统侦测光源在网格单元的各个顶点的光强度,计算出一个平均值 来定义这个单元, 当这个平均值不足以体现光在面上的变化时, 系统以网格变量来细化这个面, 有时我们看到灯光边缘呈锯齿状,就是网格划分不足以体现光在面上的变 化造成的
由于LS细化网格时是以每个单元边的中心点来插入新的顶点把单元分成 4 个部分。这样就不免会造成阴影或光束无法与网格相对齐。这就是我们看到的有锯齿的阴影边界,通常用下面几种解决方法:
1,最简单的办法是减小最小网格间距来解决这个问题, 由于只是减小最小网格间距,所以只是在灯光变化大的(如阴影边缘,高亮区等)区域增加了网格,避免了对其它不必要区域网格的细分,是一种比较经济的细分方 法,象阳光或是射灯的明显的阴影边界效果,对网格要求细分较高, 它是以消耗内存和时间为代价的。它的每次变量是以四倍变量递增的, 会增加大量的网格面, 所以应该适度.
2,利用光影追踪, 这种方法是对产生该阴影的灯源使用光影跟踪直接光照选项, 它能在网格相对粗糙的情况下, 通过间接光照的相互反射,在渲染时产生好的视觉效果。不过光影跟踪在渲染时会相对化费很多的时间,所以一般都在最终渲染时才打开该灯源的光影跟踪直接光照 选项, 其实省了细分,累了渲染,这也是LS中没办法的事
3. 利用表面处理对面进行增加细化,来增强边缘的清晰度, 这种方法对于个别受光面,象光域网和日光很有效,但网格的增量不能一味求高, 它也是以消耗内存和时间为代价的.
4. 利用不同的灯光设置产生不同的阴影边界线光源边缘在面细分小时柔和,面光源边缘在面细分大时柔和 . 与线光源相比, 面光源在不调整面的细分时柔和得多,点光源可用灯光属性中的光束角和区域角来调节它的锐度和柔和度, 它在柔和时对网格细分的要求不高,而光影追踪是这种效果的很好辅助下面是点光几种设置产生光影边界的示图(使用较粗的网格,启用了光影追踪)
当光束与区域角相等时,边界最清晰当区域角调大时,边界变得柔和起来, 变得更自然当光束角调小时,光的聚光范围变小了
5, 不要刻意为追求灯光产生的效果而不惜工本,它能起到画龙点睛的作用,但不能把它看作产生好的效果的唯一途径,
阴影泄漏阴影漏就是一个对象因边界和顶点没有与相接触的表面边界和顶点相对齐, 在光的作用下产生向表面周围泄漏的黑暗区域, 合理的建模能有效抑制阴影漏.漏光,能节时与增效避免很多麻烦,从下面中图来看: 由于园柱是无法与地面网格顶点对齐的,园柱盖住地面的不受光部位是地面网格的部分顶点,而光是根据网格面的顶点颜色取一个中间值来决定这个网格面的受光强 度的,所以这几个面就与其它面有差异并向外渗透,这个差异就在视觉上产生了阴影漏解决方法之一是取消园柱封闭面",使光能穿过园柱而不投射阴影在地面上 (见下右图).但它会失去该物体的所有阴影一般这个处理方法都用于如嵌灯的灯罩,墙上的开关板,墙体等无须体现阴影的地方
建模中产生阴影漏常见的几个因素及通常处理方法
1, 模型的相交和重叠
LS中很在乎边界和顶点对齐, 模型的相交和重叠,边界顶点没有对齐就都会产生阴影漏,在MAX和VIZ建模中能做到边界对齐,但是要做到顶点对齐却要化费些心思了, 必要时,可以根据细分增量的规律,通过计 算,合理安排相邻面的尺寸比来达到,
2,不规则的三角面
复杂的模型生成往往会产生不规则的三角面,导入LS后不规则的三角面也是造成网格顶点对不齐的而影响阴影漏的因素, 这是在建模时就要考虑的因素, 尽量减少不规则的三角面特别是狭长的三角面, 由于不等边差距太大,往往会造成计算错误,如果实在无法避免,(特别是带园角布尔的面) 可以用二种方法解决:A, 带园角布尔的面可以在MAX中先细分后再布尔, 虽然牺牲了一个整面但效率是显见的. B,在LS中用新建面替换掉杂乱的面
3, 通过细化网格单元来处理
减小最小网格间距参数能解决阴影漏,但模型会产生大量的网格单元,这对于特别是比较复杂的大场景将意味着大量的内存和亢长的处理时间
4, 通过光影追踪来处理:
这种处理优点是能保持较少的网格.而且效果很好,不过,光影跟踪光源也增加了光影跟踪处理的时间,对于场景中灯光比较复杂的模型来说,应该权衡得失
建模要对LS负责
不管是CAD或是MAX,建框架只要有一定复杂度,(一般用拉伸或是布尔),都可能会产生的碎面这是LS中最烦恼的事,不仅增多了面,而且狭长三角面挺难处理,处理多了,费工又费时
1, 注意相交处的对齐, 如是在MAX中建模,要习惯使用对齐和捕捉
2, 倡导单面建模, 多余的面会浪费无谓的计算时间
3, 简化复杂面,尽量求整面和规则面,
4, 减少狭长的三角面,如果狭长三角面有所难免,尽可能缩短和规则狭长三角面长度和形状.
5, 可用LS新建面替换由太多碎面或狭长三角面所组成的一组面,建模合理能有效抑制阴影漏.漏光,能节时与增效,能避免很多麻烦, LS也有建模功能, 只不过它的建模是较简单的新建面,复制和变换,可以利用它和MAX,CAD结合起来运用,互补缺陷
第一种方法:
  由园角和园弧布尔的面最易出现狭长三角面, 并会派生许多复杂的小面,在这种情况下宁可在MAX中给予适当的细分再进行布尔来避免和缩短一些不规则面的产生
图细分步骤:
1,转成面片后,在修改面板中的Surface下的View steps(步长)调到02选中顶面选择Subdivide(细分)第一次细分不勾选边上的勾, 按下细分该面被划分为4块
3.选中细分成四块的其中一块面, 勾上边上的勾,再细分
4, 在点级别成排选择点,进行移动(如要精确可用移动工具的数字定位)
5, 按照下图按下三维捕捉纽,右键弹出菜单中勾选Endpoint(结束点)其它都不勾选, 在内框两个对角拉一矩形, 根据自己要求来倒角或变形

一些结构较复杂的模导入,如果模型面太乱,可以用LS的”建立表面”替换掉原来的面, 这里借用上面的模型,(假设它是较复杂的)
LIGHTSCAPE人造痕迹解决
1。阴影漏 一般出现在墙上,建议把墙设为不投射阴影 打开灯的光影追踪选项或加细网格的划分
2。光泄漏 建议有间断的墙或地分两布建 打开灯的光影追踪选项或加细网格的划分
3。锯齿边 建议柔化灯光边界 打开灯的光影追踪选项或加细网格的划分
4。漂浮 打开灯的光影追踪选项或加细网格的划分
5。马赫边 打开灯的光影追踪选项或加细网格的划分
6。条状阴影 打开灯的光影追踪选项或加细网格的划分
单幅图片用打开灯的光影追踪选项[光影追踪阶段解决]
单幅图片或动画加细网格的划分[光能传递阶段解决]
LS中关于减轻阴影漏的一种尝试
总结一下:其实使用的方法很简单,就是运用MAX中的布尔合运算!!!
   1、在MAX中使用布尔合运算把整个模型的大框架天地墙合并为整体,如果一道墙将另一道墙截为两半,另一道墙不要分两部分建,建议你使用合运算。
因为在使用合运算后,两个物体已合并成为一个物体,在相交处也就自然点线对齐了,不过要注意重要一点的就是,墙体在看不见的情况下,尽量把墙宽设厚点再进行合运算,如240、360等等。如果你的墙厚为0,即使合并为整体还是会出现阴影漏,上面有例子。
   2、在使用布尔合运算时,那就是千万不要用大物体来和小物体来合并,(比如你用很大的一面层顶和走廊中的一个柱子进行布尔合运算)因为这样会产生许多三辖 长的三角形面,这意问着什么你应该知道。合并的原则,尽量不要产生三角面。总之在进行合运算时不要太死板,要结合些以前一些方法灵活运用。
   3、在使用合运算前,只要简单把相应的物体,附上不同的漫反射颜色,再改成方便确认的名子。转换成LP格式后,在LS中可以使用层来控制材质。
   4、自已的一点小经验:
(1)渲染时分两次将模型导入,先将删除家俱的空房子导入,调整光线、材质,再将家俱导入,这样可以大大加快调整速度。
(2)光能传递时请进入wireframe(线框)显示方式,因为这样要比在solid(实体显示)时快许多,其速度等同于在DOS状态下光能传递。
(3)在用LS做水时,渲染后水面上经常会出现一些黑斑的问题,请加大光线反弹次数来消除黑斑。系统缺省反弹次数是10,把它改为100或200,最佳具体参数依实际情况而定,控制水底的颜色同控制水面的颜色同样重要!
关于LS中贴图会曝光过度对策的探索之一
大家应该都知道,LS中很让人头疼的一个毛病就是走完光后贴图会有过度曝光的现象
为这事我看过了一些书,有一点点的心得:
(理论)我们眼睛看到的一切其实并不是它们的本色,而且光在它们表面经过反射后所产生的颜色,所以,我们所用的贴图,其实并不是它们本来的色彩。
而LS却几乎是完全的模拟了真实的光线运行,也就是说,我们所用的贴图(就是指已经过了现实生活中光线的曝光的)在走光过程中,会被再次曝光,结果自然就是曝光过度并失真了。。。
所以如果想要让贴图呈现出我们在图片预览中的效果,那我们在走光之前就应该先用PS对其进行一定的“吸光”处理,也就是还原其在无光环境下的真面目,然后再进行走光。。。。
我的做法是,先用PS中曲线命令将贴图的GAMA值大大降低,但不许降低最高亮度
并如何加快LS的渲染速度
优化你的模型, 删除不需要的面 ,连门底也不放过半 ,不要反射细小的面 .
第一招 小模型不要让他反射光能,比如灯泡,椅子,因为这些东西对于大的场景的影响不是很大! 选择这些面,右键菜单,取消reflecting前面勾.
第二招 降低光能传递参数,然后在重点模型上加大面的细分精度.
第三招 合理使用光滑族 减少曲面模型的面数 .
第四招 在dos下渲染,可以省掉重画模型的时间 .
第五招 如果你的灯光使用了ray trace direct lllumination,请在灯光设置中取消,store dirct iiiumination前面的勾勾(其实他们都在灯光设置窗口:0) .
第六招 尽量不要使用raytrace the direct illumination of the Sky light 菜单[Light]>>[Daylight]>>[Processing]) 知道sky light是怎么产生的吗,他是用数百盏point灯来模拟的,知道了吧,知道就别用. 第七招 如果你的阳光使用了raytrace the direct illumination 请不要store it''s direct illumination 见菜单Light]>>[Daylight]>>[Processing
另存为其它的文件,然后再在LS中调用其。。。。。。。
Lightscape漏影的问题
第一:在Ls中渲染,建模的方法很重要。
我几乎全部在CAD里面完成建模,而且使用的是surface,而不是3D实体。这主要是因为surface导入到ls中之后,都是矩形的表面;而3D实 体导入后,是三角性的表面。虽然这两种类型的表面,在进行光能传递的解算之前,都会被转化成ls的Mesh,但矩形表面的使用效率更高。因为很多三角形的 表面,在角度很小的(尖锐的)一端,特别容易形成黑影。很多人都习惯在MXA/VIZ里面建模,这样的模型导入到ls中之后,也是三角形的表面。
在CAD里面建模,还有一个好处就是表面对齐的精度很高,因为CAD的物体捕捉能力是很强的!这一点非常重要。因为表面不对齐、有重叠都是漏影的罪魁祸首。
在MAX/VIZ中,要慎用布尔运算,虽然它是解决对齐的很好的方法,但它也有一个弊病!那就是“破坏”原三角表面的分布,特别是在墙体上开圆形的洞口, 这种情况就会更严重了!圆边会分裂成很多细小的、狭长的三角表面,而且三角表面的锐角汇集到一处,这给ls转化成Mesh和计算光照都会带来麻烦!
关于正确的建模方法,我会在合适的时候整理出来。(最近太忙了!!!)
第二:表面导入到lightscape中后,表面的属性也很重要!
首先是Mesh精度的问题,很多人习惯在Process Parameters对话框中设置Mesh的精度,这不是很科学的方法。因为在这里的设置将会应用到所有的表面,过高的精度虽然可以降低漏影,但过密的Mesh,会使计算的时间变得漫长……
我的做法是,在表面属性的对话框中,增加主要表面的Mesh的精度,何谓主要表面呢?就是可以充分体现出照明光斑和阴影特征的表面,置于其它的表面,可以根据情况,把Mesh的精度降低到1以下。
另外,照明光斑和阴影的锯齿,通常出现在Mesh精度较低的地方,但这里面还有些细小的差异。在同样的Mesh精度下,光源与表面的夹角越小,光斑产生锯齿的“机会”就越大!而阴影似乎也存在这个问题(光线追踪阴影除外)。
回到漏影的话题,ls的默认设置,所有的表面都可以投掷阴影、都接受、反射光线,这使得漏影的几率更大!对于某些表面,完全可以关闭它的阴影,或者只接受 光照而不反射光照。但这里面又分为很多种情形,在没有实例的条件下,很难将得很细致,大家可以自己试试!比如,地板就可以取消Occludin选项,它将 不阻挡光线,也就不会产生阴影。这么做的另一个好处就是,可以加快解算的速度。
konkoner 评论于2008-1-28 16:49:04

经过大量实验,我认为bool还是可以用的,

当然要结合polygon cruncher,虽然有时候不得不手动清除一些莫名其妙产生的不可见面,但是的确优化到了我满意的效果。
好象这个论坛不能上载?否则我可以我精简后的一个模型发上来,可以说除了我建模型水平和思路的问题,这个模型本身几乎没有一个多余的面
wgfvirtools 评论于2008-9-28 18:08:09
相信楼主会完成任务的,加油

手机版|VR开发网 统计 津ICP备18009691号
网安备12019202000257

GMT+8, 2021-4-23 10:17 AM

返回顶部