|
:四少: 帮主 VI.Forum 终极核心力量
  
[後]--[知]--[後]--[觉]
|
1#
大 中
小 发表于 2007-4-27 10:37 只看该作者
[转]几种渲染算法简介...
来源:arting365 作者:咖啡屋
Radiosity光能传递法
==========
西方计算机界的定义:一种渲染法则,对场景中所有表面之间的光和
颜色的满发射都加 以计算。通俗的说,一个物
体反射的光可以着亮其他物体,该效 果就是光
能传递效果。
直接光计算: 有
间接光计算: 有
运算导致的场景结果:全局照明结果,即场景中无论直接光照到还是
没照到的地方都是
亮的,并且明暗符合一定物理规律。
场景渲染效果评判: 非常真实
适合的对象: 单帧图像,如建筑、环艺专业的效果图,不适
合动画
代表软件: Lightscape, RAD, Radiance, Luminaire
Scanline Render扫描线渲染法
==============
西方计算机界的定义:构成一张光栅图像的像素的水平行
直接光计算: 有
间接光计算: 无
运算导致的场景结果:只有被直接光照到的地方才是亮的,场景中不
存在光传递运算概 念上的非直接光。想使直接
光照射以外的地方亮起来,只能靠认 为的方法
在场景中设置光源模拟非直接光效果。
场景渲染效果评判: 不易真实
适合对象: 低品质要求场景,小场景
代表软件: 3D Stutio Max
Indirect Illuminate间接照明法
===============
西方计算机界的定义:是光能传递算法的简化,与光能传递遵循的运
算法则相同,但运 算量要比光能传递少得多
直接光计算: 有
间接光计算: 有,不充分
运算导致的场景结果:全局照明结果。场景中无论直接光照到的地方
还是没照到的地方 都是亮的,别且明暗符合一
定物理规律。
场景渲染效果评判: 较真实
适合对象: 较快(不同软件的情况不甚相同)单帧与动画
均可,是质量与速 度均可兼顾的最佳选择
代表软件: Enlight, Luma, Mantal ray
Raytracen光线跟踪法
==========
西方计算机界的定义:是一种渲染技术,用于定义可见表面和产生真
实阴影,反射和折 射。
直接光计算: 有
间接光计算: 有,不完全
运算导致的场景结果:部分全局照明结果,因为只计算高光反射,所
以照明结果有限。
场景渲染评判: 真实(定向使用)
适合对象: 最适合阴影以及金属,玻璃等反射、折射材质
的渲染。基本不会 被单独使用。
代表软件: Raygun 该方法一般被作为使用其他渲染方法的
软件的辅助内嵌功能使用。
==========================================
三维CAD产品中一般使用两种渲染算法:深度缓存(zbuffer)和光线跟踪(raytracing)。这两种算法中,深度缓存算法速度快,在较好的图形硬件支持下,数万个三角形的渲染时间都可以控制在0.1s以内,但是在高速度的同时也牺牲了图像的质量,深度缓存不能生成阴影,物体的质感也无法很真实地表现。光线跟踪算法支持多种类型的光源,能够生成阴影,从而产生更加逼真的图像,但是渲染速度较慢。所以在实际应用中,造型时多采用深度缓存算法以加快显示速度,而在需要生成高质量的图像时则采用光线跟踪算法。
在6个产品的基本模块中,只有SolidEdgeV8和InventorR2提供了一些高级渲染选项,SolidWorks2000可以通过第三方插件PhotoWorks进行高质量渲染,其他软件均只能显示一般的Shading图。由于多采用OpenGL进行渲染,所以渲染效果和速度差别不大。InventorR2对渲染速度进行了特别的优化,它可以在用户移动/旋转模型时自动简化一些模型的细节部分,这样,即便是很大的装配件,用户也可以快速地移动/旋转它们。
6个产品均可以调节渲染的一些基本属性,如光源设置,模型属性(颜色,透明度,反射系数等等)。InventorR2可以指定模型的材质,部分材质带有纹理贴图,可以产生很逼真的画面。SolidEdgeV8的渲染效果给人留下了很深刻的印象。它除了可以设置模型的颜色、纹理,设置背景为单色、渐变颜色或一幅图像,还设置了非常多的渲染开关,如渲染效果,纹理,反射,景深,反走样,阴影等等,用户可以通过设置这些选项在渲染速度和渲染效果中作出选择。可以说,SolidEdgeV8已经具备了专业渲染软件的基本功能。
在动画效果方面,GSCAD98可以生成模型自动旋转的动画效果;InteSolid98可以做数控机床的动态仿真;SolidWorks2000通过插件Animator可以做装配中的动态仿真;InventorR2在装配模块中可以进行动态仿真;SolidEdgeV8提供了两个强大的动画工具:Motion可以进行装配的动态仿真,VirtualStudio可以通过指定模型运动轨迹来生成更灵活的动画效果。
扫描线渲染器是Max6以前版本的唯一的渲染器,它的渲染采用的是模拟的算法,要想得到逼真的渲染效果,对灯光的设置要求非常高,不是那么容易就能达到的,需要非常的积累,调试...
=================================================
一般来说, 定位渲染通道瓶颈的方法就是改变渲染通道每个步骤的工作量, 如果吞吐量也改变了, 那个步骤就是瓶颈. 找到了瓶颈就要想办法消除瓶颈, 可以减少该步骤的工作量, 增加其他步骤的工作量.
一般在光栅化之前的瓶颈称作”transform bound”, 三角形设置处理后的瓶颈称作”fill bound”
定位瓶颈的办法
1. 改变帧缓冲或者渲染目标(Render Target)的颜色深度(16 到 32 位), 如果帧速改变了, 那么瓶颈应该在这里.
2. 否则试试改变贴图大小和贴图过滤设置, 如果帧速变了,那么瓶颈应该是在贴图这里.
3. 否则改变分辨率.如果帧速改变了, 那么改变一下pixel shader的指令数量, 如果帧速变了, 那么瓶颈应该就是pixel shader. 否则瓶颈就在光栅化过程中.
4. 否则, 改变顶点格式的大小, 如果帧速改变了, 那么瓶颈应该在显卡带宽上.
5. 如果以上都不是, 那么瓶颈就在CPU这一边.
优化方法36条:
1. 尽量减少无用的顶点数据, 比如贴图坐标, 如果有Object使用2组有的使用1组, 那么不 要将他们放在一个vertex buffer中, 这样可以减少传输的数据量.
2. 使用多个streamsource, 比如SkinMesh渲染, 可以把顶点坐标和法线这些每一帧都要修改的数据放在一个动态VB中, 其它不需要修改的(如贴图坐标)放到一个静态VB中, 这样就减少了数据传输量.
3. 尽量使用16位的索引缓冲,避免32位的. 一方面浪费带宽, 一方面也不是所有的显卡都支持32位的索引缓冲.
4. 可以考虑使用vertex shader来计算静态VB中的数据.比如SkinMesh的顶点可以放到vectex shader中计算, 这样就可以避免每一帧都从AGP内存中向显存传送数据. 这样也可以使用静态VB了.
5. 坚决避免使用Draw**UP一族的函数来绘制多边形.
6. 在设计程序之前好好规划一下显卡内存的使用, 确保framebuffer, 贴图, 静态VB能够正好放入显卡的本地内存中.
7. 尽量使顶点格式大小是32字节的倍数.可以考虑使用压缩过的顶点格式然后用vertex shader去解. 或者留下冗余的部分, 使顶点大小刚好使32字节的倍数.
8. 顶点在顶点缓冲中的顺序尽量符合绘制的顺序, 考虑使用strips来代替list.
9. 如果可能尽量多的使用static vertex buffer代替dynamic vertex buffer
10. 动态VB使用DISCARD参数来lock更新, 使用NOOVERWRITE来添加.尽量不要使用不带参数的lock调用(0)
11. 尽量减少lock的次数, 有些东西并不一定非要每一帧都更新VB, 比如人物动画一般每秒钟更新30次VB基本上就够了.
12. 如果是因为需要绘制的顶点数据太多了可以考虑使用LOD, 但是现在的显卡的绘制能力都很强劲, 所以需要权衡一下LOD是否能够带来相应的好处, 如果过分的强化LOD很可能将瓶颈转移到CPU这边.
13. 避免过多的顶点计算,比如过多的光源, 过于复杂的光照计算(复杂的光照模型), 纹理自动生成的开启也会增加顶点的计算量. 如果贴图坐标变换矩阵不是单位矩阵, 也会造成顶点计算量的增加, 所以如果纹理变换已经结束, 记得要将纹理变换矩阵设为单位矩阵同时调整贴图坐标.
14. 避免Vertex shader指令数量太多或者分支过多, 尽量减少vertex shader的长度和复杂程度. 尽量使用swizzling代替mov
15. 如果图象质量方面的计算(pixel shader)范围很大, 并且很复杂, 可以考虑试试全屏反走样.说不定更快.
16. 尽量按照front
QUOTE:
我活了这么多年,人民群众对我的评价一向是风趣幽默,温文而雅,博识广记,乐善好施。总而言之一句话,很有生活情趣的大好人一个。如果你对我有什么负面印象地话,那应该反省的是你自己,因为当你有这个想法地时候,你已经悍然站在了人民的对立面!!
|