渲染器是怎么样渲染的.doc_第1页
渲染器是怎么样渲染的.doc_第2页
渲染器是怎么样渲染的.doc_第3页
渲染器是怎么样渲染的.doc_第4页
渲染器是怎么样渲染的.doc_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

渲染器是怎么样渲染的讲讲渲染算法作者:mayax哈哈,我又写文章了,这次是理论文章,想大家进一步了解渲染器的内部,所以写得尽量通俗一点,让更多的人容易理解。不过好象已经没有什么可以写的了,大家如果对渲染有什么问题想让我写一篇的就请说说吧,最好请给点意见,谢谢!渲染器是怎么样渲染的讲讲渲染算法EclipseChiao()渲染器品种繁多,有Max自带的、MentalRay、Brazil、Luma、RayMax、Radioray、FinalRender、VirtualLight、Lightscape、Maya自带的、Renderman(包括Prman和BMRT)、POVRay、XSI的MentalRay、Mantra(Houdini的)、Cinema4DXL等等。它们的渲染效果各有不同,速度、特点也有不同,但这不是主题,我在这里就不详细叙述了。其实所有的渲染器都离不开三种最基本的渲染算法:扫描线、光线跟踪、辐射度,这次我们就只说说这三种算法是怎么样工作的。(不谈好坏了,上次已经说够了;-))说这三种算法之前我们先讲讲光照的计算方法,影响光照的有什么因素。一、光照:什么是光照?就是光线照射到物体上。广义上的光照是GlobalIllumination,就是全局光照。但这里先说狭义的光照,就是物体上的一点受到光的照射后软件怎么样计算它的光照强度。首先我引入一个概念:法线。三维动画中的法线十分重要,法线是定义平面的方向的变量,严格上说,法线应该垂直于平面。但是!为了让多边形更好地工作,所以我们转变了一下法线的使用。看下面这个球体的表面,黑线表示球体的解释式所求出的多边形,但要很多的多边形模拟,所以我们用比较少的多边形模拟球体(红色的线表示)。可是这样渲染出来的面十分不好看(可以使用Flat光照模式看看效果),面一块一块的。为了解决这个问题,我们在顶点引入渲染法线(绿色的线),它并不同于表面的法线(紫色的线): 回复:渲染器是怎么样渲染的讲讲渲染算法作者:mayax回复:渲染器是怎么样渲染的讲讲渲染算法作者:mayax回复:渲染器是怎么样渲染的讲讲渲染算法作者:mayax然后法线中间的点就计算点到四个顶点的距离的比再乘上法线的值得出这个点的法线。图中蓝色的线就是紫色的线与绿色的线的平均值。这样就有了下面的问题,虽然表面是平滑的,但边缘却是有棱有角突起的,这个问题我记得王老师好象在火星人二就在说Polygon和Nurbs的时候提出过。因为当时Max引入了Nurbs,Nurbs就不存在这种问题。因为nurbs是一种解释曲面,是用软件解释表面的点的数学描述曲面。(关于Nurbs我会另外写一篇文章)知道了什么是法线,那光照就容易解决了。 回复:渲染器是怎么样渲染的讲讲渲染算法作者:mayax看上图,光源L向P点照射,N为P点的法线,视点为V,那么P点上受到L的光照为:Lambert:I=kd*Il*cos*decay*dist(P,L)Phong:I=Il*(kd*cos+ks*cosn)*decay*dist(P,L)其中H=(L+V)/2Blinn:I=Il*cosdw(kd*Rd+ks*Rs)其中Rs=F*D*G/pi*coscos(F、D、G的计算十分复杂,详细叙述对大多数人没有意义,想仔细了解的可以联络我)Il为灯光的颜色,kd为漫反射系数,ks为高光系数(包含高光颜色),n就是Maya中的cospower,decay是衰减,cos表示A和B的夹角的cos值。CookTorrance的是在Blinn的基础上加入光谱计算,Metal的只是在Lambert的基础上加入高光控制,Anistropic和Stratuss的都比较抽象。上面的公式比较抽象,但仔细看一看就发现并不难理解(除了Blinn的,因为如此复杂所以在Max2.0时才加入了),如果可以理解对于用好各种材质会有很大的帮助。(如果你要学写ShadingLanguage,那上面的公式就必须好好的理解)。分析:仔细地看可以知道Lambert模型是简单地把光线的入射角和光照亮度联系在一起,只有漫反射系数,没有高光,适合表现纸、墙壁、树木躯干等没有高光的材料。而Phong加入了对高光的控制,是用一个幂次来控制的,如果数学不错的朋友就可以知道Phong的高光变化其实就是幂函数的图象(如果不知道是怎么样的就查查数学书),这样的高光最适合塑料。而Blinn比较复杂,但通过我的分析(是我的分析,所以可信度不高),Blinn的高光在Roughness和Specularrolloff的控制下,从中心到一定的范围不变,但超出Specularrolloff后就以Roughness的值变化(Roughness通过Fresnel项计算,比较复杂)。这个可能要多练习才可以控制得好。要注意的是法线消隐和定向,比如说用了法线消隐,法线和灯光夹角大于90度小于0度的面就可以不用显示了(Backfaceculling),而且双面材质也是靠法线确定哪一面用什么材质的。线、面的光照模型:现在的软件都有了线、面的光源,线、面的光照比上面的要复杂,但都是以采样的方式计算。MR中就提供了Sample这个参数,就是计算一点上的光照时对光源的线或面进行的采样数目。二、扫描线这是大家最熟悉的,特别是从3ds开始玩起的元老。扫描线的基本概念就是把场景内的物体一一投影到视平面上,通过Z值的比较,距离视平面最近的物体就可以看见,距离远的就被消隐。Zbuffer算法是最优秀的扫描线算法之一。假设要渲染一幅720X576的图画,那么系统就分出720X576X5(RGBAZ)Xsizeof(float)的内存,然后逐一象素渲染,写入画面信息。但实际中渲染只要分配一行的Z深度值就够了。 回复:渲染器是怎么样渲染的讲讲渲染算法作者:mayax扫描线其实就这么多内容,关键是实现的时候有不同的方法,比如Renderman的经典算法REYES,可是那不是做动画的人要了解的内容,是写程序的人要头痛的,所以在这就不多说了。三、光线跟踪下面我们集中讲述光线跟踪,毕竟它是我们用得最多最频繁的。光线跟踪里最复杂的计算方法是MentalRay里面的,用可怕两个字形容绝对不过分。光线跟踪的基础是把光线看成没有大小和长度的射线,从光源开始发射,到漫反射面或背景(无交)就结束。光线跟踪已经十分成熟,有很多辅助算法使光线跟踪实现很多各种各样的效果,比如最好的运动模糊和景深算法分布式光线跟踪,Caustic模拟算法双向光线跟踪,GI算法MonteCarlo积分法和PhotonMap法等等,而且光线跟踪是辐射度渲染的基础,是唯一的折射算法。光线跟踪的加速也做的越来越好,BSP算法已经可以极大地加速光线跟踪,而且还可以加速Antialiasing。光线跟踪一般是逆向求交的,因为如果跟踪从光源发出的光线,那么就有大部分的光线都没有对画面进行贡献(非GI求解)。所以光线跟踪一般从视平面出发跟踪。 回复:渲染器是怎么样渲染的讲讲渲染算法作者:mayax光线跟踪的过程如下:从镜头计算出发出的光线(一般垂直于镜头),原点为镜头上的一点(假设正在渲染640X480的画面,可以把镜头分成640X480个小平面,每个平面代表一象素一点),然后光线象场内发射图片比较容易理解吧。 回复:渲染器是怎么样渲染的讲讲渲染算法作者:mayax实现的时候会用递归算法,十分耗效率,所以反射折射的次数要尽量少。或许会觉得以上的算法已经比较复杂,但MentalRay给出了一种更复杂的算法,而且现在Max、Maya的渲染有学习的趋向。 回复:渲染器是怎么样渲染的讲讲渲染算法作者:mayax光线跟踪还有分布式光线跟踪和双向光线跟踪。分布式光线跟踪是一种空间采样法,可以更好地表现画面的细节。他的思想是把要跟踪的象素划分成16个更小的格子(其实不一定是16个,只不过16个是4X4的Sampling),然后对这16个格子的光线进行一定的随机打乱方向(当然不能太乱),然后把跟踪的结果进行某种(详细是哪一种由软件定夺)加权平均的计算。 回复:渲染器是怎么样渲染的讲讲渲染算法作者:mayax现在分布式光线跟踪多数用在MonteCarlo积分GI计算上,因为可以快速地计算一片物体表面的光能采样。双向光线跟踪是因为Caustic而诞生的。1986年Arvo用illuminationmap成功地第一次模拟了Caustic现象。其实这就是把一片虚拟的空间贴图包裹在物体上,然后从光源发出光线射向非漫反射物体,贴图接受了光线的能量,变成了非漫反射物体受光照情况的分布图,然后在渲染时再加以采样处理就成了Caustic。因为渲染的时候既有逆向跟踪,也有正向的采样跟踪,所以叫双向光线跟踪。中国的图形学家朱一宁曾使用加速的算法模拟了一次传递的Caustic现象(1988)!四、辐射度辐射度比前面的算法复杂的多啦,涉及很多领域的理论:元面划分、积分逼近、不可见面消隐、空间传递加速算法、子结构等等,使用辐射度最好(最实际)的也就只Lightscape。与前面的算法一样,辐射度也是模拟逼近算法,所以也靠采样的精度。辐射度来源于物理学的热辐射,因为光和热的属性十分接近,所以公式也从热辐射度中继承了过来:回复:渲染器是怎么样渲染的讲讲渲染算法作者:mayax我相信很多人特别是做动画的人第一次看到这条公式也会和我第一次看到一样傻了眼,根本不知道说什么。我也是弄了两个多月苦思冥想才开始理解的。当然,有理科背景的人会很快看懂。我在这儿把辐射度讲得太细也没有必要,因为不多人使用,所以只说说辐射度的工作流程:1.剖分元面把场景内的多边形(Nurbs也先划成多边形,曲面的辐射度算法还不成熟)剖分成细小的元面,但不是统一的大小,是按它在空间中的位置、接受周围辐射的形状因子而决定的,通常来说是边角的地方比较分得细,因为辐射度的变化大,而空旷的位置的元面比较大。2.求解一般都是使用逐步求精的算法,不断地重复把过剩的能量辐射到周围的元面的过程,直到过剩的能量小于阀值。3.渲染为什么已经求解了还要渲染呢?因为辐射度只是负责把场景内的元面的能量分配求出,其他的他不管,所以真正的渲染还要靠扫描线和光线跟踪来完成。五、渲染前准备对了,说了那么多渲染的东西,那物体怎么从场景中调入到渲染器里?渲染前一般还要经过这些步骤:模型重组划分局部坐标系置换到场景坐标系场景坐标系进行取景变换和透视变换光栅化(就是我们平时所说的渲染)如果是扫描线算法还要进行多边形剪裁,跨越视平面内外的多边形剪裁到视平面内。六、其他还有其他的一些问题,但我以前的一篇文章渲染器算法的讨论已经有了十分详细的描述,包括贴图、灯光、材质、光线跟踪的BSP加速法等,有兴趣的朋友可以找一找看。上面比较集中地谈光照和光线跟踪,是因为各位都多用光线跟踪,本来还可以谈得详细一点,但又怕想渲染器算法讨论那样、很多人说看不明白,所以写得比较浅一些。回复:渲染器是怎么样渲染的讲讲渲染算法作者:xmaya受益非浅!非常感谢MayaX的辛劳。我们的专栏板块很快就开通了!MayaX的文章一定会成为最受瞩目的教程呀!MayaX能不能给自己写一个自我介绍发到我的信箱里?以便放在专栏作家的简历里面。回复:渲染器是怎么样渲染的讲讲渲染算法作者:周轶一,什么是元面?二,什么是jitter?三,光能传递仅基于自然的反射折射定律,为何还会出现如此多的求解算法?四,Raytrace采用了一套物理模型,并且完全遵守折射反射定律,为何只能解决两种传递方式?五,能具体解释一下渲染器算法讨论中MIDMAP工作方式排列图吗?不太好懂。六,你给出的一套光能传递效果图是在封闭室内的,而户外增加大气辐射后同样也是一种封闭空间,能否给出一张户外光能传递效果图?七,能具体讲解一下REYES算法吗?谢谢mayax兄了! 回复:渲染器是怎么样渲染的讲讲渲染算法作者:回廊能讲的更浅显点吗/?俺很菜的 FakeGlobalIllumination!作者:mayax因为要准备闭关修炼了,所以时间不多,写得并不很详细,写出来的只是契子,抛砖引玉,希望大家在此启发下有更多更好模拟的方法。但我必须指出,这是我所试过的最快捷最好效果的方法。其他的如:使用EnvMap控制反射pass然后融合到物体表面等方法都比较麻烦和不好控制。本文在没有光能传递的情况下用灯光模拟光能传递,适用于Max、Maya、Renderman、MentalRay、Mantra(Houdini4.1)等渲染器(甚至3DS),下面以Maya+Prman为例。FakeGlobalIllumination首先我们要了解光能传递的特点,其实光能传递的特点是:场景内所有受到光照的物体都是发光体,其发射的光相当于它在屏幕上显示的光。通过这样,我们可以得到模拟光能传递的一个原则在物体表面(比较光滑的部分或面积比较大的部分)上放置多盏灯光来达到模拟光能传递的效果。在使用之前我先提出一个概念灯光阵列。其实这是建立多盏灯光并放到同一个Group中统一管理,使用相似的属性(如Indensity,Decay等)。建立一个实验场景:回复:FakeGlobalIllumination!作者:mayax这是一个典型的光能传递实验场景,现在我们要在里面加灯光。灯光是从顶部照射的,但由于使用Shadowmap的聚光灯Angle不能太大,所以我们使用多盏聚光灯。而使用多盏聚光灯就必须把每一盏的光亮度调低:回复:FakeGlobalIllumination!作者:mayax回复:FakeGlobalIllumination!作者:mayax回复:FakeGlobalIllumination!作者:mayax可以看到,场景十分黑暗,这是因为没有发生光能传递,那我们就像上帝一样给它来做一个。首先建立一盏泛光灯,然后把Indensity和Decay调好:(如果是Maya的话就把Decay调成Quadratic,然后加大Indensity)然后做成阵列:回复:FakeGlobalIllumination!作者:mayax回复:FakeGlobalIllumination!作者:mayax先在每一个面上做阵列,但记住要颜色相同,而且因为主灯向下照射,所以灯光阵列应该偏下:回复:FakeGlobalIllumination!作者:mayax回复:FakeGlobalIllumination!作者:mayax这时候我们可以看到光能传递并不饱和,在理论上称为残差过大,我们必须在环境中添加环境中的散射。散射灯的Indensity不宜太大,而应加大Decay:回复:FakeGlobalIllum

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论