找回密码
 立即注册

QQ登录

只需一步,快速开始

vray材质库
查看: 5194|回复: 5

灯光渲染器算法讨论

[复制链接]

该用户从未签到

1504

主题

1279

回帖

2万

积分

管理员

积分
23445
发表于 2002-11-16 10:58:00 | 显示全部楼层 |阅读模式
Eclipse 众所周知,Renderman,MentalRay,Brazil,FinalRender,Lightscape都是一流的渲染器,孰优孰劣,大家都在网上讨论了很多了。这次我想从它们的算法入手进行分析,看它们在算法上的优劣,希望能让大家对它们有更深入的了解,从而改进对渲染器的使用。   首先,每一个渲染器都基于一套基本的求解算法,这些算法的名称大家都已耳熟能详了。基本渲染算法有三种:Scanliner(扫描线)、Raytrace(光线跟踪)、Radiosity(辐射度)。Scanliner与Raytrace都为大多数软件所采用,而Radiosity就只有BMRT与Lightscape采用.Scanliner最早被开发,应用亦最广泛。其中Renderman的REYES(Render Everything You'd Ever Seen)算法是Scanliner的最极致的发挥,但也表示Scanliner已经走到了尽头了。Raytrace的应用越来越广泛,它最初用来求解非漫反射面之间的光能传递,即反射与折射的模拟。后来分布式光线跟踪与双向光线跟踪得到长足发展,特别是先进的有限元采样算法得到发展后,光线跟踪也被应用于漫反射面的光能传递求解。MentalRay的Global Illumination、Brazil、FinalRender就是很好的例子。其中,分布式光线跟踪的算法决定了软件输出的质量。MentalRay假定每个元面都有一张PhotonMap(在双向光线跟踪算法的创始人Arvo(ARVO1986)的论文中叫Illumination Map),在PhotonMap上投射光线采样,然后把PhotonMap像Texture一样贴在元面上。所以MentalRay必须设定光线的大小(Radius)以方便在PhotonMap上采样。这样保证了速度,但要在有丰富经验的人调较下才能渲染出高质量的图片。Brazil直接用半球体采样,用立体方位角投射到元面表面,类似于Radiosity算法的立方体采样,但Brazil通过控制辐射残差来加快速度,也牺牲了质量,所以在采样不足的情况下,Brazil渲染的质量是最差的。FinalRender用有限元采样,同时保证了速度和质量。有限元是一种结合Radiosity的采样方法。Radiosity是在80年代末发展起来的渲染算法,它采用热力学的辐射积分式:   B(x)=E(x)+p(x)$B(x')[cos(x)cos(x')/pi*r^2]*HID(dS(x),dS(x'))dA(x'),其中x'为源元面,x为目标元面,B(x)是x的辐射度分量, E(x)是x的源能量,p(x)是x的漫反射系数,$是对元面x积分,HID是遮挡函数(x与x'之间有遮挡为0,没有则为1),dA(x)是x的面积。 可以看到,Radiosity是通过对整个场景的表面都求解辐射度来达到模拟光能传递效果。Lightscape的求解过程就是Radiosity的Shooting过程,它采用空间四叉树算法来加速求解,所以速度比较快。Radiosity渲染基于物理学理论,其渲染效果真实,是Raytrace所不能比拟的, 但从视觉效果上考虑,现在Raytrace和Radiosity不相上下,在速度上,Raytrace更占绝对优势。而且,Refract(折射)、caustic(焦散效果)是Radiosity无法模拟的(所以Lightscape也带了Raytrace渲染器)。   第二,每个渲染器都有贴图的优化算法,这也是成败的关键,因为高级的渲染往往极依赖贴图,像一些优秀的CG都"无图不欢"甚至"无图不成",所以贴图的质量是十分重要的!Renderman的优化算法堪称第一!为什么?它用了先进的改良式B-spline(B样条)算法,克服了许多贴图变形的问题,尤其是在同等元面由于镜头焦距不一引起的走样(因为软件常常假设同一元面在画面上的分辨率是一样的,就导致当镜头对准元面中心,而元面两极z值直差超过了MipMap或Liner的极限,z值小的部分和z值大的部分之间的区域过度产生严重走样,MR2用z值细分元面解决了问题,但造成了运算量的不必要增加)。在渲染器多如牛毛的今天,很多标榜光能传递的软件都忽略了贴图算法的重要性,片面的加强实际上专业用户并不需要的功能,舍本逐末。也是因为如此,使用最原始的Scanliner的Renderman在今天能稳稳地坐在电影制作的第一把交椅上。      贴图是渲染里一个复杂的大系,它包括原始图象的处理、合成,与几何物体坐标的互换,过程化的贴图以及过渡性的贴图PhotonMap和ShadowMap等)。贴图也参加几何变换(Displacement),灯光的定义(VolumeShader)以及镜头特效。    Max向渲染器提供了贴图的原始处理,可以让渲染器直接使用它的输出而专心于画面的质量,它包括了图形学里的4X3种贴图投射方式:(平面、圆柱体、立方体、球面)~(表面向量、景物中心、中介面法向量)。其实真正有用只有:平面~中介面法向量、圆柱体~中介面法向量、立方体~中介面法向量、球面~景物中心、立方体~景物中心。所以不要盲目选择贴图方式。详细的贴图方式指引请参考《计算机真实感图形的算法基础》。Maya的贴图分为Normal和Project(Stencil不在贴图方式的讨论之列),也就是UV和以上的四种贴图表面(平面、圆柱体、立方体、球面),当然,它还包含了衍生出来的三角平面和摄象机平面。 Renderman提供了更详细的贴图方案,但对普通用户有用的只有ST(就是UV)和MayaUV(还是UV)。因为在Renderman里面要精确控制贴图必须写Expression。   所谓的UV,就是指曲面坐标。在我们看来,空间是三维的(用三个分量表示一个向量),而在曲面上看来,空间是二维的,如地图上的经度和纬度一样。要指出曲面上的一点,就要用向量v(u,v)表示。而贴图则是平面的,要影射到空间的元面上必须用一种贴图影射(就是以上讨论的几种):在曲面坐标上P(u,v)可以转换成贴图坐标T(s,t),就是若曲面S(u[0,1],v[0,1])那贴图就是T(s[0,Tmax_x],t[0,Tmax_y]),然后求屏幕坐标E(p)=Sp(u,v)=S'(u,v)=T(s,t),得到屏幕的颜色为F(T(s,t)),F为加工的过程。在max中选择的贴图方式就是S'。这就是贴图在渲染器内的工作方式。   贴图的合成主要是Renderman的结点式思想,这点在Maya中的已经得到体现,相信我不用在讨论。但结点式Shader并不是Maya第一个使用,早在1984年,Cook(著名图形学家,提出了著名的Cook-Torrance光谱光照模型)就提出了左右结点的Shanding language。最初,Renderman就是这一思想的实验产物,可以说Shading language导致了Renderman的诞生。所以Renderman的贴图处理能力可以说是Renderman的看家本领了。   贴图的反走样:主要的方法有Liner(一次)、Quadric(二次)、Gaussian(高斯)、MipMap等。其中MidMap应用最广泛,从OpenGL到DirectX到MayaRenderer到Renderman的Script都可以看到它的身影。所以我们主要讨论MidMap(其他的请"望文生义"吧)。    MidMap的工作方式是在内存中建立一张比源文件还要大的正方形查找表,也就是N X N的数组。大多少?例如:一张TIFF(256 X 256 X 24bit NoAlpha)的贴图,MidMap将打开一个(512X512)+1的数组。其排列为(用图形比较清楚): --------------------------------------------- | | | | | | | | | | R | G | | | | | | | --------------------------------------------- | | | | | R | G | | | | | | |--------------------| B | | R | G | | | |---------| B | | | X | B | | | --------------------------------------------- 使用的时候计算在匹配的分辨率下应使用哪一张Map。如此可见MidMap是一种的速度和质量可以达到最平衡的算法。所以Maya以MidMap为缺省方式。   在贴图的讨论中,我们主要讨论的是Renderman的贴图,因为其他的几个软件并没有太多的贴图文献(而Renderman则几乎每年的SIGGRAPH都有)所以不作讨论。    下一节,我们将讨论Renderman所没有的--Radiosity和Raytrace!   第三,我们来集中讨论一下光能传递。    关于光能传递,相信有必要详细叙述,因为网上和市面的许多教材都存在片面的说法,许多使用光能传递软件的人甚至写教材的人都没有比较扎实的光能传递理论基础,这导致我们很多时候都无法发挥渲染器的最大潜能。这也是许多人就算用Lightscape、MentalRay也只能做出很"假"的图的原因了。了解光能传递,就算用Max的渲染器也可以做出很真实质量很高的图形。   所谓光能传递,就是物体表面反射物体吸收波长以外的光能在封闭环境中的面到面之间的传递。所以光能传递必须满足: 1、场景封闭;2、场景内有原始的未被吸收的光能;3、传递方式为面到面。    我们之所以看到物体有不同的颜色,是因为物体表面属性决定了物体吸收一定波长的光能,而不吸收的一部分反射到我们的眼睛里,产生了颜色。如果一束全波段光波射到一白色物体和红色物体上(两物体靠近,都是漫反射面),则白色物体并不吸收任何可见波波长的光能(理论上,实际上它还是要吸收一部分),把接收的光能都反射出去。那么红色物体就吸收了除红色波长以外的所有可见光光能,把红色波长的光能反射出去。这样,白色物体从环境中获得的光能发生了不平衡,红色光波的能量战多数,于是,在实际中的以上情况,我们将看到两物体之间发生了光能传递。    还有一个例子,就是镜子。因为漫反射面十分粗糙,几乎每个点的法线都不同,所以光能发射的方向不一,就造成了辐射现象;而非漫反射面表面法线一致,所以光能反射方向一致,所有光能向同一方向反射,造成镜面现象。    要注意的是,生活中我们是在一个封闭的空间中观察物体的,就算是户外,因为空气有散射作用,所以也可以算是封闭。就是在一定范围内光能必须趋向平衡。所以几乎所有的光能传递演示场景都是在封闭的室内,而室外的场景则必须添加大气辐射。Lightscape中的完成百分比实际是它估算的环境内辐射平衡残差(以后会讨论),但也可以看作是封闭环境中剩余的未平衡能量。   光能传递分成四种类型:漫反射~漫反射、非漫反射~漫反射、非漫反射~非漫反射、漫反射~非漫反射。这四种传递性质各异, 难以以统一的算法求解,也导致了两种完全不同的算法的产生。 Raytrace光线跟踪是最早开发来解决反射、折射的涉及非漫反射面参与的光能传递的算法,它基于假设光线是一根没有大小、长度的射线,从屏幕平面投射到场景中,与可见面相交;它完全遵守反射折射定律。所以Raytrace极其成功地解决了两种传递:非漫反射面~非漫反射面 和 漫反射面~非漫反射面。
室内人成立于2002年11月7日。室内人欢迎你!
.....提示:网站下载资源都有备份,如遇到下载地址失效请及时联系管理员(QQ:3459039404)恢复下载地址(个别无法恢复会退币)

该用户从未签到

30

主题

351

回帖

805

积分

新手上路

积分
805
发表于 2002-11-20 19:36:00 | 显示全部楼层
不错啊!!大家多看看!!好啊!!
回复 支持 反对

使用道具 举报

该用户从未签到

1504

主题

1279

回帖

2万

积分

管理员

积分
23445
 楼主| 发表于 2002-11-27 12:45:00 | 显示全部楼层
Eclipse 谢谢提醒会注意的
室内人成立于2002年11月7日。室内人欢迎你!
回复 支持 反对

使用道具 举报

该用户从未签到

8

主题

133

回帖

260

积分

新手上路

积分
260
发表于 2002-11-27 13:27:00 | 显示全部楼层
hao
回复 支持 反对

使用道具 举报

该用户从未签到

0

主题

46

回帖

47

积分

新手上路

积分
47
发表于 2003-4-4 01:01:00 | 显示全部楼层
说得好
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

室内设计工具箱

QQ|手机版|Archiver|室内人 ( 辽ICP备05022379号 )

GMT+8, 2024-5-4 19:31

Powered by Discuz! X3.5关于室内人 | QQ:3459039404(客服) | Email:snren_com@163.com

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表