精华内容
下载资源
问答
  • 2020-02-10 17:03:51

    1.求交

    光线追踪主要的计算量来源于大量的求交计算。设O代表射线起点,D方向 ,P为圆上的点,C为圆心,r半径。球的方程为:(P - C)(P - C) = r * r ,直线的参数方程: p(t) = O + tD。

    将直线方程代入后得D2t2+2(O-C)Dt+(O-C)2-r2=0,随后利用一元二次方程求根公式,判断有无解,有两个解时,选择>0且较小的t。

    求交的基本原理就是将射线的参数方程代入到圆的函数中,求t的值。

    1. 将P(t) = O + tD 代入圆方程,会得到 t 的一元二次方程。
    2. 先求出Vec op,op是用球心p的坐标减去射线的起点 (O - C)。
    3. b = op.dot(r.d)指代 ” D * (O - C) ”
    4. 求det,这里要注意我们求的b和原理中的b差了两倍,所以可以直接用
      double det = b * b - op.dot(op) + rad * rad;
      如果det<0说明无解,直接return 0;
      否则求根号的det;
    5. 最终的解有一个或两个,可能在 t = b - det,或者t = b + det中,选择t大于0并且两个中较小的t。

    2.绘制

    1. 用6个很大的球体当做平面(DIFF属性,只有漫反射),因为半径很大的话,你在近距离看起来,球面就很像一个平面。
      作者这样做应该是为了避免去写平面求交,平面类等函数。

    2. 用1个球表示光源,就是Lite,1个Mirr球(完全反射),1个Glass球(折射和反射都有)
      遍历所有的球,求交点

    3. 此光线射出去,在所有的球体中求交点。

    4. 求出距离camera最近的交点,这就是待会要绘制在屏幕上的主要的点。

    3.主函数说明

    1. camera的位置是在(50, 52, 295.6), 往z轴的负方向看。

    2. 遍历每个像素点,用随机采样的方式求得要射出的光线的方向d。

    4.光线追踪递归说明

    _Vector radiance:实现了光线跟踪处理流程,该函数中进行了递归调用。光线跟踪递归过程终止条件是光线与环境中任何物体均不相交,或交于纯漫射面、被跟踪光线返回的光亮度值对像素颜色的贡献很小、已递归到给定深度。该函数传入两个参数,一个是射线的引用,一个是递归的深度;
    设定好递归出口(depth的值),对每个球体与光线求交,并使得法向量与ray._direct呈钝角(法向量指向球体外。

    1. 判断是否相交,求交点,求表面法向

    2. 漫反射(DIFF)
      如果材质是漫反射,那么就随机生成一个方向进行漫反射。
      利用法线向量w与向量(0,1,0)或(1,0,0)进行叉乘运算得到向量u,随后w与u进行叉乘得到向量v,利用叉乘运算的方向得到了一组标准正交基w,u,v。利用随机函数drand48()得到两个随机数r1,r2,通过二者的运算得到3个坐标,进而得到在标准正交基w,u,v下的一个随机向量direct,即求得了一个随机的漫反射光线从而继续递归。

    3. 镜面反射(材质为SPEC)
      计算镜面反射的方向,然后继续递归
      由于漫反射和镜面反射都遵循反射规律,因此根据反射定律计算出反射光的方向,进而继续递归。

    4. 反射和折射(材质为REFR)
      玻璃材质,有一部分光进行反射,有一部分光进行折射。
      这里用到了轮盘赌方法。
      首先,计算出相对折射率,由公式n1sinn1 = n2 sinn2可以计算出折射角的正弦值,同时根据入射光线的方向,法线方向以及折射的角度可以计算出折射方向从而生成折射光线;根据菲涅尔近似等式,可计算出菲涅尔反射和折射所占的比例(Fr+Fe = 1),从而继续递归。
      Ray reflRay(x, r.d - n * 2 * n.dot(r.d)); // Ideal dielectric REFRACTION 由平行四边形的方法求得反射光的direction

    实验报告

    课程资料

    更多相关内容
  • OPENGL光线跟踪算法

    2014-12-29 19:51:04
    光纤跟踪算法的实现,基于C语言的一个程序,可以自己移动,非常好用
  • 光线跟踪算法技术

    2018-04-09 09:11:16
    光线跟踪算法技术》详细阐述了与光线跟踪问题相关的高效解决方案及相应的数据结构和算法,主要包括采样技术、投影视图、视见系统、景深、非线性投影、立体视觉、光照与材质、镜面反射、光泽反射、全局光照、透明度...
  • 光线跟踪算法技术 001

    2017-12-21 09:48:15
    (共三卷,只有第一卷收费)光线跟踪算法技术 [美]萨芬著 刘天慧译(清华大学出版社) 2011.zip.001
  • 光线跟踪算法技术 003

    2017-12-21 09:50:42
    (共三卷)光线跟踪算法技术 [美]萨芬著 刘天慧译(清华大学出版社) 2011.zip.003 好像必须选择至少2分,抱歉了
  • 光线跟踪算法技术 002

    2017-12-21 09:49:18
    (共三卷,只有第一卷收费)光线跟踪算法技术 [美]萨芬著 刘天慧译(清华大学出版社) 2011.zip.002
  • Ray Tracing From The Ground Up--Kevin Suffern--光线跟踪算法技术 [美]萨芬著 刘天慧译(清华大学出版社) 2011 英文原版
  • Ray Tracing From The Ground Up-光线跟踪算法技术-Kevin Suffern 英文原版-彩色高清PDF, 分卷2(共2分卷)
  • 光线跟踪算法在织物CAD的应用.pdf
  • 本代码是用OPENGL实现光线跟踪算法,从影响光照效果的因素着手,主要演示了静态多光源,材料属性,动态多光源三个方面,添加了球、面等元素
  • 光线跟踪算法技术 刘天慧翻译的 Ray Tracing
  • 算法充分利用了GPU的硬件光线跟踪核心,可有效提高全息图的计算速度。当组成三维模型的多边形数量为1.6万个,物点数量为4万个时,该光线跟踪全息图生成算法的计算速度约为基于GPU的点源全息图生成算法的11.5倍。
  • 光线追踪算法的c++实现,基于CPU单线程的算法,使用OpenGL辅助显示。可以定义材质的反射和折射特性,有球面和三角面两种基本类型。程序主要实现了光线的采样和传播,但目前的模型搜索采用简单的遍历,因此不适用大...
  • 光线跟踪算法技术 刘天慧翻译的 Ray Tracing
  • 光线跟踪算法描述—计算机图形学

    万次阅读 2017-05-04 15:10:35
    光线跟踪算法原理: 步骤一:从视点出发通过该像素中心向场景发出一条光线R,并求出R与场景物体的全部交点;获得离视点最近交点P;并依据局部光照明模型计算P处颜色值Ic (光线投射)。 步骤二:P处沿着R镜面...
    光线跟踪算法原理:
    步骤一: 从视点出发通过该像素中心向场景发出一条光线 R ,并求出 R 与场景中物体的全部交点;获得离视点最近交点 P ;并依据局部光照明模型计算 P 处颜色值 Ic ( 光线投射 )。
    步骤二: P 处沿着 R 镜面反射方向和透射方向各衍生一条光线  (注:若点P所在表面非镜面或不透明体,则无需衍生出相应光线)
    步骤三: 分别对衍生出的光线递归地执行前面步骤,计算来自镜面反射和透射方向上周围环境对点 P 光亮度的贡献 I s I t。
    步骤四: 依据 Whitted 光照明模型即可计算出点 P 处的光亮度,并将计算出的光亮度赋给该像素。
    最终,当所有屏幕像素都处理完毕时,即得到一幅真实感图形。

    (光线跟踪树示意图)
    光线跟踪递归过程终止条件
    1.  光线与环境中任何物体均不相交,或交于纯漫射面
    2.  被跟踪光线返回的光亮度值对像素颜色的贡献很小
    3.   已递归到给定深度
    光线跟踪算法的伪语言描述

    main ( )  //主函数

    {

      for(需要计算颜色的每一像素pixel) {

      确定通过视点V和像素pixel的光线R;

      depth =0;  // 递归深度

      ratio =1.0;  //当前光线的衰减系数,1.0表示无衰减

      // color是经计算后返回的颜色值

      RayTrace(R, ratio, depth, color); 

      置当前像素pixel的颜色为color;

      }

    } // 主函数main( )结束

    RayTrace(R, ratio, depth, color)//说明:光线跟踪子函数

    {

      if(ratio< THRESHOLD) {              //终止条件2

      color为黑色;

      return;

      }

      if(depth> MAXDEPTH){             //终止条件3

      color为黑色;

      return;

      }

      // to be continued

    光线R与场景中的所有物体求交。若存在交点,找出离R起始点最近的交点P

      if(交点不存在){                       //终止条件1

      color为黑色;

      return;

      }

      用局部光照明模型计算交点P处的颜色值,并将其存入local_color

      // to be continued

      if(交点P所在的表面为光滑镜面) {

      计算反射光线Rr;

      //递归调用!

      RayTrace(Rr, ks*ratio, depth+1,reflected_color);

      }

      if(交点P所在的表面为透明表面) {

      计算透射光线Rt;

          //递归调用!

      RayTrace(Rt,kt*ratio, depth+1,transmitted_color);

      }

      // to be continued

      依照Whitted模型合成最终的颜色值,即:

      color = local_color+ ks*reflected_color

                    kt*transmitted_color

      return;

    }  // 光线跟踪子函数RayTrace( )结束






    展开全文
  • 光线跟踪算法

    热门讨论 2012-04-28 19:35:42
    使用光线跟踪算法实现的简单真实感场景,包括面,球基本元素。
  • P53 这里好像QT哈哈

    P53

    这里好像QT 哈哈

    P59

    这里是不是弄成那种hitable_list会好一点 

    P70

    摩尔纹有点引发密恐了 

    P71

    原来这个是抖动采样 感觉这个比随机采样要好

    P72

    躺平 哈哈 

    展开全文
  • 基于空间剖分的快速光线跟踪算法,韩逸晨,杨克俭,为了提高光线跟踪速度,本文比较各种光线跟踪算法基础上对空间进行剖分,再对物体和包围盒进行求交计算,大大提高了光线与物体
  • Ray Tracing From The Ground Up-光线跟踪算法技术-Kevin Suffern英文原版-彩色高清PDF,分卷1(共2分卷)
  • 多个光线投射算法(ray casting)和光线跟踪算法(ray tracing)代码,四个ray casting代码(分别基于opengl、GPU),一个ray tracing代码(MFC),都是基础代码
  • 利用光线跟踪算法的室内场景仿真,宋力兵,陈炳发,本文将光线跟踪技术用于室内场景仿真, 根据场景实体的特点,利用场景描述语言(SDL)描述几何对象及光源,进行场景造型,为了�
  • 本代码是用OPENGL实现光线跟踪算法,从影响光照效果的因素着手,主要演示了静态多光源,材料属性,动态多光源三个方面。
  • 光线追踪 该项目是计算机图形大学课程分配的一部分。 要运行,首先编译: cd src/ javac Main.java 然后运行 java Main 。
  • RayTracking 光线跟踪算法

    千次阅读 2018-04-13 16:43:14
    基本光线追踪算法中,只追踪有限数目的光线。这是一个采样过程(sampling process)。 采样有很多种方法: a、均匀采样 举例:根据给定的区间绘制数学函数。 将区间划分为许多小的宽度一致的小区间,小区间的中点...

    转自 http://www.cnblogs.com/daniagger/archive/2012/05/28/2521318.html   详细请看这位师兄的博客 


    1. Irradiance(辐照度)

    total amount of energy received per unit area of a surface

     

    2. Illuminance(照明度)

    essentially same as irradiance,the difference is that illuminance measures the amount of visible light energy in photometric terms

     

    3. Radiance(辐射)

    measure of energy that is reflected by the surface

     

    4. Luminance(亮度)

    measure of photometrically weighted light energy that leaves the surface

     

    5. Luminous intensity

    amount of light energy that is emitted by the surface in a given direction


    实际上叫反向光线追踪(backward raytracing),因为计算是从camera开始发射光线,而不是从光源发射光线。

    反向光线追踪步骤:

    1、camera的胶片被分成离散的网格(即像素点),我们的目标是确定每一个像素点的颜色值。

    2、对于每一个像素,从camera位置追踪一条光线,指向该像素点

    3、对于这束光线,判断其是否和场景中的物体相交。如果相交,则转到步骤4;否则,将背景色填充到当前像素中去,回到步骤2,继续处理下一个像素。

    4、如果光线和物体相交,计算物体表面交点的颜色值。该点的颜色值即为该像素的颜色值。

    a、首先检查每个光源在该交点的贡献值。追踪一条新光线去光源,用来确定交点是被全部照亮、部分照亮还是没有被照亮,同时确定了阴影。

    b、如果物体表面具有反射性质,计算初始光线的反射光线,然后追踪这条反射光线,转到步骤3。

    c、如果物体表面具有折射性质,计算初始光线的折射光线,然后追踪这条折射光线,转到步骤3。

    d、最终,根据表面性质(反射率、折射率),和不同类型光线计算得出的颜色值,来确定交点的颜色值,即当前像素点的颜色值。

    5、回到步骤2,继续下一个像素点。重复这个过程直到像素点都遍历完成。


    [Raytracing]四种主要类型的追踪光线

    1、主光线(Primary rays)

    从camera发出的光线。

    2、阴影光线(Shadow/Light rays)

    从交点发出的光线,指向光源。如果这条光线在指向光源之前不相交于任何物体,则这个光源对该交点有贡献值;否则,该交点位于该光源的阴影处。

    3、反射光线(Reflection rays)

    如果物体表面具有反射性质,则部分光将会被反射出去,继续在场景中前进。根据Snell定律,一条新的光线将会从交点发出。

    4、折射光线(Refracted rays)

    当物体表面具有折射性质并且部分透明,部分光线将会进入物体继续传播。根据Snell定律,一条新的光线将会从交点发出进入物体。

    [Raytracing]光线追踪的问题和解决方案

    问题

    1、性能

    算法的递归性质和大数目的追踪光线,渲染过程可能持续数小时。80-90%的渲染时间花费在计算光线和物体交点上。

     

    2、走样

     

    3、尖锐的阴影

    基本的光线追踪算法只能得到尖锐的阴影(因为模拟的是点光源)。

     

    4、局部光照和着色

    算法只追踪少数目的光线,只有四种类型的光线被考虑在内,物体之间的漫反射光没有被考虑在内,即算法并不包括全局光照。

     

    解决方案

    1、性能

    a、使用更多或者更好的硬件

    b、大规模并行计算

    每一个光线都相互独立。

    将图像分割,分配在多核上或者分布式网络上;或者分配在多个线程上。

    c、限制交点检测的数目

    使用包围盒的层次关系。快速判断光线是否和一组物体相交。物体被分组在封闭的包围盒中。利用空间细分技术:octree,BSP,grid.

    d、优化交点检测

    e、限制追踪光线的数目

    确定最大的递归层数。

    根据光线对当前像素点贡献值大小来限制递归深度。一个阈值用来确定后续光线由于对像素点贡献太小而不会被追踪。

     

     

    2、走样

    使用超采样(super sampling)、抗锯齿(antialiasing)、jittering

    a、追踪额外的主光线并取平均值

    即超采样,相对于每一个像素点取一条光线,你可以取特定数目的光线。每一个像素被分为亚像素,对每一个亚像素发射一条光线。当所有的亚像素点都处理完毕,对亚像素点的颜色值取平均值,并将其赋值给该像素点。这种方法大大增加了渲染时间。

    b、自适应抗锯齿

    在颜色剧烈变化的地方使用追踪的主光线,颜色变化不大的地方使用最少的主光线。

    c、随机抗锯齿

    随机取样代替常规取样。

     

    3、尖锐的阴影

    原因:使用点光源、每个交点仅仅对应一条阴影光线。

    a、区域光(area light)

    使用一系列点光源来模拟区域光源。对于每一个交点,需要和点光源数目一样多的追踪光线。

    b、Monte Carlo光线追踪法

    使用随机超采样,光源建模成球形光源,阴影光线指向代表光源的球上面的点。阴影光线颜色的平均值决定该交点最终的颜色值。


    4、全局光照

    依旧可以使用Monte Carlo法。使用Radiosity算法。

    [Raytracing]代码框架

    该伪代码总结了光线追踪算法。


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    Function Raytrace(Scene World)
    {
         for (each pixel of the image)
         {
              Calculate the ray corresponding to the pixel
                 (projection);
              Pixel color=trace(ray,0);
         }
    }
     
    color trace(Ray myRay,interger recurs_level)
    {
          if (myRay intersects an object Obj)
          {
              Calculate normal N at point of intersection Pi;
              Calculate surface color SC at point of intersection Pi;
              Final_Color=Shade(Obj,myRay,N,SC,Pi,recurs_level);
          }
          else
          {
              Calculate background color BkgC;
              Final_Color=BkgC;
          }
          return  Final_Color;
    }
     
    color Shade(Object obj,Ray myRay,Normal N,Surface_Color SC,
    Point Pi,integer recurslevel)
    {
          recurslevel++;
          if (recurslevel>MAX_RECURSION_LEVEL)
              return  0;
          
          for (each light source)
          {
              Calculate light ray(Pi points to light source);
              if (light ray doesn't intersect an object)
              {
                  add light contribution to color based
                   on the angle between light ray and myRay;
              }
          }
          calculate reflect ray;
          refl_color=trace(refl_ray,recurslevel);
          calculate refract ray;
          refr_color=trace(refr_ray,recurslevel);
          
          return  average(color,refl_color,refr_color);
    }

    [Raytracing]扩展光线追踪

    1、随机采样

    在基本光线追踪算法中,只追踪有限数目的光线。这是一个采样过程(sampling process)。

    采样有很多种方法:

    a、均匀采样

    举例:根据给定的区间绘制数学函数。

    将区间划分为许多小的宽度一致的小区间,在小区间的中点处计算函数的值,最终将这些点平滑连接出来。

    QQ截图20120528084540

    在小区间数目很少的情况下,均匀采样可能会得到错误的结果。

    b、随机采样

    使用随机间隔宽度代替统一间隔宽度。

    QQ截图20120528084945

    可以使用随机采样绘制平滑的阴影;绘制模糊的反射和折射;考虑景深;考虑运动模糊。

     

    2、路径追踪

    路径追踪算法考虑了全局光照问题。之前的光线追踪只考虑了四种类型的光线,没有哪一条光线考虑了物体之间的作用。

    通过追踪交点周围所有路径的光线来计算间接光照,为了避免无限渲染次数,所有的可能光线路径使用随机采样。这种方法的光线分布通常是半球形,中心点是交点。

    渲染有天空光的户外场景中,路径追踪算法非常有效率。因为这种场景下光变化的频率不大,也就是说,采样的函数值变化不大,小规模的采样依然可以得到很好的效果。

    QQ截图20120528090503

    双向(Bidirectional)路径追踪额外追踪了发自光源的光线,减少了路径追踪的采样次数。

     

    3、光子映射(photon mapping)

    两通道算法,考虑了全局光照和物体之间的反射,实现了caustics effect。

    Pass 1-创建photon map

    光线(光子)从光源开始追踪,光子携带从光源散发的一部分能量。

    当光子在场景中传播时,可能被反射、穿透、吸收。

    当光子击中漫反射表面时,使用map存储射进的能量。

    photon map以k-d tree数据结构实现。

    Pass 2-渲染阶段

    使用光线追踪算法。在交点处,使用存储在map中的信息去估计光照度。

    展开全文
  • 使用CUDAGPU上加速3D数字差分分析仪光线跟踪算法
  • GPU光线跟踪算法加速结构研究.pdf
  • Urbanmacro单元下的加速光线跟踪算法
  • miniRT:光线跟踪算法的简单实现

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,993
精华内容 2,397
关键字:

在光线跟踪算法中