渲染求交算法
㈠ 求高手解释GPU渲染和软件渲染的区别
渲染
有两种
时时渲染,和最终渲染
显卡的工作,换句话说
显卡的职责,显卡最初的设计理论,当初为什么要设计,发明显卡
是为了解决3D时时加速的。
在当时的应用就是游戏,和3D应用。显卡的工作就是多边形生成和纹理贴图。
在3DMAX中间
4个透视窗口中我们建立模型是依靠显卡gpu进行运算的,时时计算3D加速
支持opengl或者D3D
这些都是时时渲染加速,不支持复杂的光照运算。
之所以显卡不支持复杂光照运算是由于显卡的构造而决定了。
我举个例子
画笔和图案印章
。同样画图
很显然图案印章的效率明显比画笔快,压以下一个图案,但是印章的局限就是图案简单,也就是说它只能画出gpu本身所支持的算法,也就是几个简单的加减乘除,和函数计算(gpu只继承了这些算法)
gpu就是图案印章。
画笔
我不说你也应该知道它就是cpu了
虽然画画速度慢
但是他想画什么就能画什么,只要软件支持。因为cpu的指令集非常丰富,能进行软件所支持的任何计算,无论是加减乘除还是复杂的函数运算,根号运算都支持。
而这个就是渲染最终效果图所需要的。
即使现在的游戏,光影都是由cpu负责的,
显卡的工作就是多边形生成
和文理贴图,
不具备光影处理能力。
现在的游戏中
光影都是假光影,物体的反射都是材质贴图,也就是说镜子所反射的不是周围的物体
而是制作了一个周围物体的贴图给了镜子。
从D3D9以后
显卡能够多一点的分担cpu的负担
集成的更多的指令集和函数流水线,但是他毕竟是用来加速时时3D的
所以流处理器的个数才是最重要的。1个流处理器就是一个cpu
只不过指令集和功能比cpu少的可怜。
无论是专业显卡还是中等的图形工作站
显卡都不参与效果图渲染。
即使以后显卡能够渲染效果图了,我们也不会使用显卡渲染
因为CPU体积比显卡小多了,大型服务器
超级计算机
图形渲染集群都是成千上万的CPU组成的
一般一部服务器
安装了500
600个CPU,如果换成显卡,那体积不得了。而且用途也不广泛,CPU是万能的。
㈡ 求一篇毕业论文,关与计算机应用的,最好不少与2000字,如果有,麻烦粘贴过来,谢谢……
GPU光线跟踪算法加速结构研究
摘要:基于GPU的光线跟踪算法是当前图形学研究的一个热点,也是将来用于广告、电影、游戏等娱乐产业的关键技术。本文论述了如何对基于GPU的光线跟踪算法进行实现,以及利用各种加速结构,加速算法实现,提高算法执行效率,并对各种加速结构的效果进行了比较研究。
关键词:GPGPU 光线跟踪 BVH KD-Tree
1.引言
近年来,CPU无论在运算能力,还是在可编程性上都得到了大幅的提高,GPU已经在需要大量运算的密集运算领域发挥了举足轻重的作用。各种基于CPU的密集运算被移植到GPU上,以利用GPU巨大的运算能力,加速整个算法的运算过程。光线跟踪算法是生成真实感图形的一种非常重要的方法,在电影、游戏、广告等产业,获得广泛的应用,而光线跟踪算法也是典型的密集运算算法,利用原始的基于CPU的光线跟踪渲染一幅图片是非常耗时的操作。因此,如果能够将CPU上的光线跟踪算法,映射到CPU上,加速光线跟踪算法的执行时间,将会带来巨大的经济效益。因此,基于CPU的光线跟踪算法已成为国内外科研人员的研究热点。
2.基于GPU的光线跟踪
2.1 相关工作
当前,主要由两种方法利用CPU来加速光线跟踪算法。第一种是Carr等人提出来的,将CPU转换为一个蛮力的执行光线一三角形求交的计算器,而将任何的光线生成以及着色过程在CPU上完成。这就需要CPU依然执行绝大部分的渲染工作。C arr等人指出,在ATI Radeon 8500上,每秒最快能够执行1亿2千万次的光线一三角形求交。同时,作者也指出,由于GPU的单精度浮点的限制,图片上依然存在一些不太真实的地方。
第二种方法由Purcell等人提出的,改种方法将整个光线跟踪器都移植到CPU上进行实现。从光线的产生,加速结构的遍历,到最后的着色过程都在GPU上执行。此后,有很多相同的项目都是基于Purcell的模型上进行的。
2.2 GPU上的光线跟踪算法的映射方式
将传统的CPU上执行的光线跟踪算法,映射成为一个GPU协助的,或者基于GPU的光线跟踪器有众多方法。下面重点介绍Purcell提出的映射模型,以及在本文的实现中提出的一个基于CPU的Whitted模型的光线跟踪器。该光线跟踪器的布局如图2.1所示:
在Purcell的论文中,它将光线一三角形求交,以及遍历过程分离成两个独立的遍历内核和求交内核。本文的实现中,也按照上述模型图,将光线跟踪算法分解成光线生成,光线一三角形求交,着色这三个步骤。
在对光线进行跟踪之前,需要生成从视点指向屏幕的原始光线( primary ray)。在一个GPU上,能够使用光栅器的插值的能力,在一个单一的内核调用中,产生所有的原始光线。
给定观察矩形(被采样用于产生图片的投影平面的一部分)的四个角,以及视点,首先计算出这个视锥体的四条边线。如果让光栅器在这4条光线之间,按照512×512规格,在这四条光线之间按照方向进行插值,最终就可以获得能够产生一幅512×512图片(一个像素一个采样点)的所有原始光线的方向。同时能够将这些方向存储在一个纹理里,并把它作为求交内核的输入。所有的原始光线具有相同的起始点,但是仍然把它存储在一个同方向纹理具有相同维度的纹理内。因为当生成阴影光线或者反射光线的时候,光线的原点会发生改变。
求交内核把光线的原点,方向,以及场景的描述作为输入数据。在内核被调用数次之后,我们对于每一个像素输出一个击中记录。如果一条光线击中了场景中的某个三角形,返回击中点的3个重心坐标,以及相关的被击中的三角形。此外,还将输出被发现的交点沿光线的距离,以及被击中三角形的材质。这就需要使用5个浮点数值组成一个击中记录。纹理只能够支持4个颜色通道( RCBA),所以,如果能把击中记录裁减到4个值,那么将是非常有益的。
观察发现,只需要3个重心坐标的两个,因为在三角形内部,它们相加的和总是1。这就使得在一个单独的RGBA纹理中存储交点记录是可行的,并且它的维度同其它两个光线纹理的维度相同。
Moller和Trumbore提出了一个高效的光线一三角形求交算法,使用这个算法,并利用CPU在向量计算上的优势来进行求交计算。下面列出了求交的代码,这个代码也展示了如何利用向量指令来提高效率。
当所有的原始光线都已经计算出了相交的状态的时候,就能够查询着色过程所需要的表面法线和材质的信息。每一个击中记录都存储了一个指向材质纹理的索引,这个材质纹理包含了三角形的法线,材质颜色以及类型。三个顶点的法线根据击中记录的中心坐标进行了插值。最终的颜色能够按(N-L)C进行计算,此处Ⅳ是法线,L是光源的方向,G是三角形的颜色。
现在根据击中的三角形所具有的材质的类型(漫反射材质,或者镜面反射材质),需要产生二次光线,以此来计算阴影和反射。
1)如果一条光线射出场景之外,像素就被赋予全局的背景颜色。
2)如果一条光线击中了一个漫反射材质表面,就发射一条阴影射线( shdow ray)。这些光线的起始点在击中点,方向为从击中点指向光源。
3)如果一条光线击中了一个镜面反射材质表面。就发射一条镜面反射光线。镜面发射光线的起始点也在击中点,但是它的方向是在击中点处关于入射光线和插值后的法线对称的方向。一个真正的Whitted类型的光线跟踪器也支持透明材质,从而能够产生折射光线。但由于主要是研究加速结构,所以在本文的实现中,没有考虑折射光线。
4)如果阴影光线击中了某个几何体,这就说明在光源和击中点之间,存在某个几何体,所以这个像素就应该是黑色(处于阴影中)。当跟踪阴影光线的时候,不关心最近的那个击中点,更加关心的是是否存在这样的击中点。因此,当有一个交点被发现,就可以停止整个求交过程,从而加速算法的处理过程。在本文的实现中,以相同的方式跟踪阴影光线和反射光线,因此,就没有使用到这个优化策略。
已经对每一个像素产生了正确二次光线,如果需要,就能够执行另外一趟遍历/求交过程,对上述的二次光线进行跟踪。每一次调用着色程序就能够对每一个像素返回一个颜色值和一条新的光线。着色内核也可以将前一次着色程序的输出当作本次着色程序的输入。这就使得能够在跟踪连续的光线的时候合并这些连续的镜面反射的颜色。
同Carr等人的程序不同,本文所采用的程序不存在浮点精度太低的问题,因为Ceforce 7300在整个管线中支持真正的32位浮点操作。
3.加速结构的实现和比较
3.1均匀栅格
均匀栅格是第一个在GPU上实现的加速结构。Purcell给出了很多选择均匀栅格作为加速结构的理由,但是Purcell没有详细的说明为什么均匀网格对于硬件实现而言比其它的加速结构要更加的简单。当在探讨了均匀栅格的一些主要特性的时候,更加清晰的知道了均匀栅格为什么会成为一个好的GPU机速结构。
首先,只用使用简单的算术运算,就能够对于每个体素的遍历在常量时间能被定位和存取。这就消除了对树的遍历的需要,以及重复的纹理查找工作,而纹理查找是相当耗时的。
其次,体素的遍历是通过递增算术运算来完成的。这就消除了对堆栈的需要,使得我们能够从光线的起始点开始,以距离递增的顺序访问体素成为可能。
再其次,由于对于体素的访问是沿着光线,以距离递增的方式遍历的,所以,一旦在一个被访问的体素中报道发现有一个交点,就可以停止这条光线对体素的遍历过程,从而提高整个遍历过程的速度。
最后,用于遍历的代码非常适合用向量编写,而向量形式的编码风格又非常适合GPU的指令集。
然而,均匀栅格的缺点就是由于它是空间细分结构的一种特殊情况,多个体素可能包含相同三角形的多个引用。由于无法使用mailbox技术,这就意味着需要对于相同的光线和三角形之间进行不止一次的相交测试。
3.2 KD-tree
最近,Havran等人对基于CPU的光线跟踪算法的加速结构进行了比较,得出的结论是对于众多不同类型的测试场景,平均而言,KD-tree是最快的。所以,有必要考察一下对于基于KD-tree的GPU光线跟踪算法,是否也会有相似的结论。
就像均匀栅格一样,KD-tree也是一种空间细分结构。同均匀网格不同的是,KD-tree利用一个二叉树将场景表示成一个层次结构。
在二叉树中,我们将内部节点和叶子节点区分开。叶子节点用来表示体素和与之相关的保存在该体素内的三角形的引用。一个内部节点用来表示空间区域的某个部分。所以,内部节点包含一个分裂面的两个子树的引用,而叶子节点只包含一个三角形列表。
KD-tree的创建过程从上而下,根据一个评价函数,通过放置一个分离平面,递归的将场景分离成两个体素。我们能够以递归的方式遍历KD-tree,但是由于GPU没有堆栈结构,所以无法应用递归的策略。取而代之的是,我们能够通过记住我们沿着光线前进了多远来向上或者向下遍历树。这种策略消除了需要堆栈的限制,使得用CPU来完成对KD-tree结构的遍历成为可能。
当使用GPU对KD-tree进行遍历的时候,KD-tree像均匀栅格那样被表示成一个纹理的集合。这就意味着有一个保存树数据的纹理,一个保存三角形列表的纹理,和一个保存实际的三角形数据的纹理。GPU的遍历首先调用一个初始化内核,然后按照需要,多次调用合并后的遍历和求交内核。
3.3 包围体层次(BVH)
给定一些随机的光线,通过计算遍历包围体层次的平均花费,就可以测量出该包围体层次的质量。迄今为止,还没有构建最优的包围体层次的算法,也就是说,如何准确的测量一个包围体层次的平均遍历时间还不是很明显。
Goldsmith和Salmon提出了一个评价函数,通常被称为表面积启发式函数。他们通过父节点和孩子节点的表面积之比来形式化的表述这个关系,此评价函数如下所示:
此处,hit(n)是光线击中节点n的情况,Sn是节点n的表面积,c和p分别表示父节点和孩子节点。
这个评价函数给出了,当用一条随机的光线同层次结构求交的时候,成本上的估计。由于没有最优的方法去有效的构造一个最优的BVH,提出了不同的构造技巧。下面,将列出比较通用的方法。
在实践中,对于包围体应用的最广泛的就是轴对齐包围盒(AABB)。AABB易于实现,并且同光线的求交测试非常快。大多数有关BVH的论文在描述BVH的创建的时候,通常分别以Kay和Kajiya,或者Goldsmith和Salmon这两种基本的想法为基础。Kay和Kajiaya建议以自上而下递归的方式进行BVH的创建。
Goldsmith和Salmon提出了一个更加复杂的自底向上的构造方式。Goldsmith和Salmon指出,BVH的质量同作为输入传人的三角形的顺序有关。因此,他们建议在构造BVH之前,随机打乱三角形的顺序。下述算法就是利用Kay/Kajiya的思想创建某个场景的包围体层次的方法:
4.结束语
本文成功的在GPU上实现了用于光线跟踪算法中的各种加速结构,并对这些加速结构在GPU上的加速效果进行了比较。均匀栅格作为第一个在CPU上实现的光线跟踪器的加速结构,也被证明是最慢的,除非是只包含一个单独的物体的场景的情况。均匀栅格不适合几何体的密度非常高的场景。另外,对于均匀栅格的CPU上的遍历表示,也需要大量的数据。Foley和Sugerman认为,对于大多数场景,KD-tree的效率要比均匀栅格高。但是,在KD-tree的遍历过程中,无论是重置阶段还是回退阶段,片元程序都非常的复杂,但这种复杂性也使得其能够在场景的几何体的密度改变的时候做出适当的调整。本文实现的BVH被证明在加速效果上要超过均匀栅格和KD-tree,在现阶段,BVH是在GPU上实现的最快的加速结构。并且在GPU上实现BVH加速结构要比实现其他加速结构更加的简单。
参考文献:
[1]Randima Femado编,姚勇,王小琴译.GPU精粹一实时图形编程的技术,技巧和技艺[M].北京:人民邮电出版社,2006.
[2] Matt Pharr编着,龚敏敏译.GPU精粹2-高性能图形芯片和通用计算编程技巧[M].北京:清华大学出版社.
[3]昊恩华,柳有权.基于图形处理器(GPU)的通用计算叨.计算机辅助设计与图形学学报,2004,16(5): 601-[4] Philip J.Schneider,David H.Eberly着,周长发译,计算机图形学几何工具算法详解[M].北京:电子工业出版社,2005.
[5] Martin Christen. Implementing ray tracing on GPU. Master´sthesis, University of Applied Sciences Basel,
㈢ 如何用Vray渲染求Vray渲染技巧
1、创建或者打开一个场景
2、指定VRay渲染器
3、设置材质
4、把渲染器选项卡设置成测试阶段的参数:
①把图像采样器改为“固定模式“,把抗锯齿系数调低,并关闭材质反射、折射和默认灯。
②勾选GI,将“首次反射”调整为lrradiance map模式(发光贴图模式)
调整min rate(最小采样)和max rate(最大采样)为-6,-5,
同时“二次反射”调整为QMC[准蒙特卡洛算法]或light cache[灯光缓冲模式],降低细分。
5、根据场景布置相应的灯光
①开始布光时,从天光开始,然后逐步增加灯光,大体顺序为:天光----阳光----人工装饰光----补光。
②如环境明暗灯光不理想,可适当调整天光强度或提高暴光方式中的dark multiplier (变暗倍增值),至直合适为止。
③打开反射、折射调整主要材质
6、根据实际的情况再次调整场景的灯光和材质
7、渲染并保存光子文件
①设置保存光子文件
②调整lrradiance map(光贴图模式),min rate(最小采样)和max rate(最大采样)为-5,-1或-5,-2或更高,同时把 [准蒙特卡洛算法] 或 [灯光缓冲模式] 的细分值调高,正式跑小图,保存光子文件。
8 、正式渲染
1)调高抗钜尺级别,
2)设置出图的尺寸,
3)调用光子文件渲染出大图
建筑表现、建筑动画初学者我建议报班
智点道教育建筑表现、建筑动画还不错呢,同学在学,进步比较大,作品牛着呢
㈣ 界线的求交算法
当需要进行求交运算的界线较少,且每条界线上的线段也不多时,逐一对分别来自两条界线上的线段进行求交运算是可行的。但是,当界线很多时,这种求交方法将花费大量计算时间,效率十分低下。为此,本书将介绍一种算法:先利用网格定位,尽可能排除不可能相交的线段对,然后逐一对可能相交的线段对进行求交运算。该方法的具体步骤如下:
(1)确定界线矩形包围盒。将所有界线上的所有结点按坐标进行排序,找到最小与最大的三维坐标(xmin,ymin,zmin)与(xmax,ymax,zmax),作为矩形包围盒的角点坐标。
(2)矩形包围盒的网格划分。以一定的间距,将包围盒划分成规则六面体格网,3个方向的间距可以不同,也可以相同。
(3)界线的网格定位,即确定每条界线上的每条线段与哪些网格单元相交,并将与某个网格单元相交的线段记录在该单元的相交线段集上。线段与网格单元的相交判断可以根据线段的端点坐标直接定位。
(4)组建可能相交的线段对。在每个格网单元中,将来自不同界线的线段进行组对,并删除重复出现的线段对。
(5)线段对求交运算。
(6)结点的统一编排。将原有界线上的结点、界线的交点按坐标进行统一排序,按一定的阈值合并距离很近的结点,然后重新设置界线与新结点集中结点的关系。
(7)简单弧的划分。将每条界线划分成若干简单弧,保证每条简单弧是唯一的,并且确保简单弧上除端点以外的内部点不被其他简单弧共享。简单弧划分方法见第7章线框架生成方法。
㈤ 视点相关的层次细节渲染技术
在三维可视化应用中,用户可以用一种自然方式以任意的角度、任意的高度、任意的路径浏览三维地形。由于人的视点位置和角度的不同,需要根据人的视觉敏感区域的生理特征来进行处理:视觉敏感区域中的空间数据分辨率高,区域之外的空间数据分辨率逐渐降低;与视点距离近的地形空间数据分辨率高,反之则分辨率低,当用户在虚拟地理环境中比较靠近地面,能够观察到的细节更丰富,这样显示装置所能够表达的空间范围就相对缩小了,同时,用户的注意力也集中在观察较小空间范围内的地形细节上。同样,当用户在虚拟地形中比较远离地面,视场的空间范围扩大了,但是显示装置所能够表达的地形细节也相应减少,同时,用户的注意力也转移到观察较大空间范围上的地形概貌。
上述特点在实际应用中也就是要根据与视点距离的远近来加载不同精度级别的数据进行显示,使之在减少了绘制数据量的同时看起来比较平滑,不影响视觉精度。
在图8-3中,较小的块表示较高精度的栅格数据,较大的块表示较低精度的栅格数据,每个块的数据量是相同的。可以看出,距离视点较近的地方,使用较精细的层次进行显示,较远处使用较粗的层次进行显示,视野中看不到的地方则不需要显示。目前采用的算法(图8-4)如下:
图8-3 根据视点位置计算所需的细节层次
图8-4 根据视觉范围计算分块数据精度示意图
1)使用最低精度级别的分块数据与视觉范围求交,获取最粗精度的数据;
2)若该分块数据不能满足其所在视觉敏感区的显示精度要求,则用更高一级精度级别与视觉范围求交;
3)重复上一步骤直至所有分块数据满足其所在视觉敏感区的显示精度要求。
㈥ 几种渲染算法简介
通俗的说,一个物 体反射的光可以着亮其他物体,该效 果就是光 能传递效果。 直接光计算: 有 间接光计算: 有 运算导致的场景结果:全局照明结果,即场景中无论直接光照到还是 没照到的地方都是 亮的,并且明暗符合一定物理规律。 场景渲染效果评判: 非常真实 适合的对象: 单帧图像,如建筑、环艺专业的效果图,不适 合动画 代表软件: Lightscape, RAD, Radiance, Luminaire Scanline Render扫描线渲染法 ============== 西方计算机界的定义:构成一张光栅图像的像素的水平行 直接光计算: 有 间接光计算: 无 运算导致的场景结果:只有被直接光照到的地方才是亮的,场景中不 存在光传递运算概 念上的非直接光。想使直接 光照射以外的地方亮起来,只能靠认 为的方法 在场景中设置光源模拟非直接光效果。 场景渲染效果评判: 不易真实 适合对象: 低品质要求场景,小场景 代表软件: 3D Stutio Max Indirect Illuminate间接照明法 =============== 西方计算机界的定义:是光能传递算法的简化,与光能传递遵循的运 算法则相同,但运 算量要比光能传递少得多 直接光计算: 有 间接光计算: 有,不充分 运算导致的场景结果:全局照明结果。场景中无论直接光照到的地方 还是没照到的地方 都是亮的,别且明暗符合一 定物理规律。 场景渲染效果评判: 较真实 适合对象: 较快(不同软件的情况不甚相同)单帧与动画 均可,是质量与速 度均可兼顾的最佳选择 代表软件: Enlight, Luma, Mantal ray Raytracen光线跟踪法 ========== 西方计算机界的定义:是一种渲染技术,用于定义可见表面和产生真 实阴影,反射和折 射。 直接光计算: 有 间接光计算: 有,不完全 运算导致的场景结果:部分全局照明结果,因为只计算高光反射,所 以照明结果有限。 场景渲染评判: 真实(定向使用) 适合对象: 最适合阴影以及金属,玻璃等反射、折射材质 的渲染。基本不会 被单独使用。 代表软件: Raygun 该方法一般被作为使用其他渲染方法的 软件的辅助内嵌功能使用。
㈦ 图形布尔运算,即求两个图形的交、并、差的面积。算法应该怎样实现
我提供两个思路吧
思路一:
将两个图形转化成region,采用region的相应方法进行计算,比如intersect,union,xor等。
然后,调用region的getRegionScans,得到与区域近似的矩形集合
将集合赋给一个新的GraphicsPath对象
调用GraphicsPath的winden (能否凑效需要你去验证一下)
思路二:
第一步,自定义算法,对两个图形求交,获取交点
第二步,根据bool运算类型和图形相对位置关系,
求出“残余”的图形,赋值给新的GraphicsPath对象答案补充 第一个方法是我查了一些资料后得出的,貌似没有什么好办法。
第二个方法工作量大一些,必须自己写算法进行讨论,相对复杂。
㈧ 哪些三维渲染算法是永远无法用GPU运算的如题 谢谢了
没有,甚至使用适当的技术,GPU可以模拟CPU进行运算,显卡和处理器本质是一样的
㈨ 空间线段对求交算法
下面先介绍一种空间线段对求交算法:
图6.5 界线相交特性
三维地质建模方法及程序实现
空间两条线段的求交运算是三维地质建模中使用频率最高、算法最简单,同时也是最容易出现计算误差,并导致后续建模失败的数值运算之一。导致计算失败的主要原因是计算精度与浮点数问题。例如,有3条线段,两两之间的交点距离非常近但不重合,如果保持3个交点不变就会降低后续建模中曲面网格的质量;如果降低精度要求,将3个交点合并成一点,就会影响与其他线段的相交关系。另外,浮点数问题在线段平行判断、三点共线判断、四点共面判断都会遇到。在处理这类问题时,可以采用一个原则,即先精后粗,也就是说在线段对求交时尽量精确,等所有线段对求交结束后可以对距离很近的点进行合并处理。