光线跟踪算法
1. optix 光线跟踪可以放到unity里面么
Unity5在图形仿真和光照特效方面做了重大改变。自从3.0版本开始,Unity的光照效果一直局限于烘焙好的光照贴图。但后续的时间里,我们在全局光照领域有了很大的提升与改进,现在,是时候将其中部分美好的特性从Unity的沙盒中开放出来了。其中之一的新图形特性就是基于新的和极大改善的光照流程基础上的全局实时光照。这也是本文的重点。
什么是全局光照?
GI算法是基于光传输的物理特性的一种模拟。他是一种模拟光在3D场景中各表面之间的传输的有效方式,他会极大的改善你游戏的仿真度。不仅如此,他还可以传达一种意境,如果巧妙的使用,可以有效得改善你的游戏体验。GI算法不仅考虑光源的直射光,而且还考虑场景中其他材质表面的反射光。传统上,在游戏中,由于实时性的约束,间接光照的模拟因性能消耗过大而被弃置一旁。
这些都是源于下面这个浅显的方程:
这个很简单。从某一观察点看到的光是从场景中物体表面点入射的光(Le)与从观察点上方的半球入射的光的叠加。Li描述的是从半球上某一角度w’ 入射的光。反射项p描述的是光线如何反射到观察点,这项的取值依赖于入射角w’和观察者的角度w。
细心的读者可能已经发现L(x,w)在方程的两边,而且有一个还在在积分式中。如果不是这种情形,我们也许已经计算出全局光照的结果。由于物理规律是不太可能去修改的,研究协会提出了一套解决方案。
其中最流行(最古老的)的是光线跟踪算法。这个算法从根本上改善了GI算法,在算法最困难的部分使用了一些比较耗时的技巧。光线跟踪在电影或者电视的CGI上使用了很多。尽管该领域涌现了大量的研究成果,但是一张图像的渲染还是要花费数秒的时间(哪怕使用非常先进的GPU)。
光线跟踪通常使用的是屏幕空间,所以,一张图像每一帧都需要重新渲染。这意味着,他完全支持完全动态的场景:灯光、材料、几何形状自由变换的动画。这也是一个缺点,因为每当摄像机移动的时候,一张新的图片需要被渲染,而这张新图像的收敛融合需要花费数秒钟的时间。这也导致他无法适用于游戏场景。
一张没有完全收敛融合的图像会有很多噪点,而且他是时间不相干的,所以,图像在完全收敛融合之前会有严重的闪烁。可以使用滤波来降低这种影响,但是不能彻底消除。下面是一些在不同收敛融合程度的图像。
2. 求光线跟踪算法技术 pdf
本书详细阐述了与光线跟踪问题相关的高效解决方案及相应的数据结构和算法,主要包括采样技术、投影视图、视见系统、景深、非线性投影、立体视觉、光照与材质、镜面反射、光泽反射、全局光照、透明度、阴影、环境遮挡、区域光照、光线与对象间的相交计算、对象变换、栅格技术以及纹理映射技术等内容。此外,本书还提供了相应的算法、代码以及伪代码,以帮助读者进一步理解计算方案的实现过程。
3. 光追和没光追差别大吗
光追和没光追差别大。
该游戏就加入了光线追踪效果,悬浮的奖励道具在墙上的投影就是通过光学追踪计算出来的,使得光源的真实感大大提高。
光源追踪技术也远非完美。计算出正确的反射和折射角度也不代表就能达到完全真实的视觉效果,因为光有颜色,不同颜色的光还会叠加等等,这些额外的计算也需要很好地算法和大量的计算。
光学追踪技术在3D游戏中的应用尚属初级阶段,DirectX 10为这种技术的发挥提供了良好的基础,再加上新一代高性能显卡的推出,相信在不久的将来就会有更真实的光影效果呈现在您眼前。
流行来源
光线跟踪的流行来源于它比其它渲染方法如扫描线渲染或者光线投射更加能够现实地模拟光线,象反射和阴影这样一些对于其它的算法来说都很难实现的效果,却是光线跟踪算法的一种自然结果。
光线跟踪易于实现并且视觉效果很好,所以它通常是图形编程中首次尝试的领域。
光线跟踪的一个最大的缺点就是性能,扫描线算法以及其它算法利用了数据的一致性从而在像素之间共享计算,但是光线跟踪通常是将每条光线当作独立的光线,每次都要重新计算。
4. 高效光线跟踪的算法有那些
浅析3D Max中的高级灯光技术
摘要:3D Max在3D制作软件中渲染功能一直比较薄弱,使其只甘居Maya等3D制作软件之下。为弥补这一缺陷,在5.0版中3D Max增加了高级灯光技术,拥有光能传递、光线追踪器两个全局照明系统,在渲染功能上有了非常显着的改善。本文主要介绍新的光能传递算法。
关键词:渲染 全局照明 光能传递
3D MAX 的渲染功能一直比较薄弱,其效果远不如其他软件(例如Maya)那样逼真,这在很大程度上是因为3D MAX默认的灯光技术不够先进。
在3D MAX中经常使用“光线追踪(Ray-Trace)”材质,与之相联系的就是光线追踪渲染算法。这种算法假设发出很多条光线,光线遇到物体时,被遮挡、反射或者折射,通过跟踪这些光线,就可以得到场景的渲染效果。但是这种方法有一个严重的缺点,就是不能反映现实生活中光的很多特性。例如,在现实生活中,灯光照射到物体后,每个物体都会发射一部分光线,形成环境光,从而导致没有被灯光直射的物体也能被照明,而不是完全出于黑暗状态。又如,把一个红色物体靠近白色的墙壁,那么墙壁靠近物体的地方会显出也带有红色。还有很多诸如此类的灯光效果,使用光线追踪算法都不能产生。
为了解决这些问题,人们发明了更先进的算法来计算灯光的效果,这就是“光能传递(Radiosity)”算法。这种算法把光作为光量子看待(实际上更符合现代物理学),通过计算光量子的能量分布获得渲染结果。这种方法能够获得最逼真的照明效果,因此,通常将光能传递算法和光线追踪算法结合起来,以获得最佳的效果。3D MAX5.0新增的高级光照功能则包含了两个不同的系统:光能传递(radiosity)和光线追踪器(light tracer)。它所得到的结果非常接近对真实事物的再现。
光线追踪器比较通用,也容易使用,使用它不需要理解许多技术概念,任何模型和灯的类型都适用。光能传递相对较复杂,需要为这种处理方式专门准备模型和场景。灯必须是光度控制灯,材质也必须仔细设计。但光能传递在物理上是精确的,对于建筑模型的精确设计是必须的,这一点非常重要,尤其当建模的目的是进行光照分析时。另外,光线追踪器的结果与视点无关,而光能传递不是这样的。光线追踪器在每一帧都计算光照。光能传递只会计算一次,除非场景中的物体移动了或灯发生了变化,或者是从另一个不同的视点渲染场景时。基本原则是光线追踪器更适用于有大量光照的室外场景、角色动画和在空旷的场景中渲染物体。光能传递更适合于使用了聚光灯的室内场景和建筑渲染。
使用光线追踪器进行室内光照仿真时,为避免平坦表面上的噪波,可能需要相当高质量的设定和很长的渲染时间。光能传递则可以用更短的时间提供更好的效果。另一方面,光能传递用于有许多多边形的角色模型时,需要额外的细化步骤、过滤,甚至是Regathering(重新聚合)。而光线追踪器适用默认的设置一次渲染就可以得到更好的效果。
传统的渲染引擎值考虑直接光照
不考虑反射光,然而,反射光是
一个场景的重要组成部分。 对相同的场景使用全局光照渲染,
上图使用了光能传递(radiosity)
就可以得到一种真实的结果。
光能传递是在一个场景中重现从物体表面反射的自然光线,实现更加真实和物理上精确的照明结果。如图所示。光能传递基于几何学计算光从物体表面的反射。几何面(三角形)成为光能传递进行计算的最小单位。大的表面可能需要被细分为小的三角形面以获得更精确的结果。场景中三角形面的数目很重要。如果数目不够结果会不精确,但如果太多时间又会太长。光能传递提供一种将大的三角形面自动细分的方法,同时也可以控制每个物体的细分和细化程度。光能传递依赖于材质和表面属性以获得物理上精确的结果。在场景中进行建模时必须牢记这一点。要使用光度控制灯,而且模型的几何结构应尽可能准确。
1.单位
要获得精确的结果,场景中作图单位是一个基础。如果单位是“英寸”,一个100×200×96单位的房间可以被一个相当于60瓦灯泡的光度控制灯正确照明,但如果单位是“米”,相同场景会变得非常暗。
2.光能传递的解决方案
光能传递是一个独立于渲染的处理过程,一旦解决方案被计算出来,结果被保存在几何体自己内部。对几何体或光照作改变将使原解决方案无效。解决方案是为整个场景全局计算的,这意味着它与视点无关。一旦计算出来,就可以从任何方向观察场景。当摄像机在一个固定场景中移动时,这将会节省时间。如果对几何体或灯作了动画,每一帧都必须计算光能传递。渲染菜单中的选项允许定义如何处理光能传递过程。
。
5. 光线追踪算法中的光线是怎么描述的
光线跟踪思路:从视点出发,通过图像平面上每个像素中心向场景发出一条光线,光线的起点为视点,方向为像素中心和视点连线单位向量.光线与离视点最近的场景物体表面交点有三种可能:当前交点所在的物体表面为理想漫射面,跟踪结束. 当前交点所在的物体表面为理想镜面,光线沿其镜面发射方向继续跟踪. 当前交点所在的物体表面为规则透射面,光线沿其规则透射方向继续跟踪. 伪代码: void TraceRay(const Vec3& start,const Vec3& direction,int depth,Color& color) { Vec3 intersectionPoint,reflectedDirection,transmittedDirection; Color localColor,reflectedColor,transmittedColor; if (depth >= MAX_DEPTH) { color = Black; //#000 } else { Ray ray(start,direction); //取start起点,方向direction为跟踪射线; if ( !scene->HasIntersection(ray) ) color = BackgroundColor; else { 计算理起始点start最近的交点intersectionPoint, 记录相交物体intersectionObject, // #1 Shade(intersectionObject,intersectionPoint,localColor); // #2 if ( intersectionPoint所在面为镜面 ) { 计算跟踪光想S在intersectionPoint处的反射光线方向reflectedDirection, TraceRay(intersectionPoint,reflectedDirection,depth+1,reflectedColor); } // #3 if ( intersectionPoint所在的表面为透明面 ) { 计算跟踪光线S在intersectionPoint处的规则透射光线方向transmittedDirection, TraceRay(intersectionPoint,transmittedDirection,depth+1,transmittedColor); } // #summarize color = localColor + Ks * reflectedColor + Kt * transmittedColor; }// else } //else } // 局部光照模型计算交点intersectionPoint处的局部光亮度localColor void Shade(const Object& intersectionObj,const Vec3& intersectionPoint,Color& localColor) { 确定intersectionObj在intersectionPoint处的单位法向量N, 漫反射系数Kd, 镜面反射系数Ks, 环境反射系数Ka; localColor = Ka * Ia; //Ia为环境光亮度 for ( 每一个点光源PointLight ) { 计算入射光线单位向量L和虚拟镜面法向单位向量H, // 由Phong模型计算光源PointLight在intersectionPoint处的漫反射和镜面反射光亮度 localColor += ( Ipointlight * ( Kd * (N.dot(L)) + Ks * (N.dot(H))^n ) ); } }
6. 光线跟踪算法中包含了哪些光照效果
光线跟踪算法性质是比光线投射,缺点是需要假设光线在观察点处终止
7. 光线跟踪算法的例子
为了说明光线跟踪所用的基本原理,我们来看计算一个光线与球体交点的例子。用 I 表示球面上的点,C 表示球心,r 表示半径,那么球面的公式为 . 如果定义一条线的起点即光线起点是 S,方向是 d,那么线上的每个点都可以表示为
其中 t 是定义线上与起点距离的常数,为了简化起见,通常 d 定义为单位矢量。那么,在这种情况下已知 S、d、C 以及 r,于是代入 I 得到:
简化 ,那么
那么二次方程的解是
这只是直线光线与球体交点的所用的数学公式,当然对于通用的光线跟踪来说是远远不够的,但是它至少表示了这个算法如何使用的一个实例。
8. 写出光线跟踪算法的基本过程.在光线跟踪的递归程序中,递归终止条件有哪几种
先来理解下概念:递归过程一般通过函数或子过程来实现。递归方法:在函数或子过程的内部,直接或者间接地调用自己的算法。 充分必要条件是:问题具有某种可借用的类同自身的子问题描述的性质;某一有限步的子问题(也称本原问题)有直接的解存在。 ...
9. 帮忙用openGL实现一个光线跟踪
http://www.opengl.org/news/comments/implementing_ray_tracing_on_a_gpu_using_the_opengl_shading_language/
GPU的程序,自己看吧!