转自 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、均匀采样

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

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

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

b、随机采样

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

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

2、路径追踪

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

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

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

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

3、光子映射(photon mapping)

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

Pass 1-创建photon map

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

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

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

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

Pass 2-渲染阶段

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

RayTracking 光线跟踪算法相关推荐

  1. 计算机图形学之光线跟踪算法的研究与实现2017年我的优秀毕业论文

    计算机图形学之光线跟踪算法的研究与实现2017年我的优秀毕业论文 版权所有使用者请联系我 刘创 QQ:903188593 2.2.2 Phong光照模型 事实上对于漫反射的物体表面,使用Lambert ...

  2. 光线投射与光线跟踪算法归纳

    目录 前言 三维可视化与体绘制 Ray Tracing vs. Ray Casting 体绘制的加速技术 基于CUDA实现Ray-Casting 后话 参考文献 1.       前言 在读了大牛们的 ...

  3. 全局光照---光线跟踪方法

    为什么80%的码农都做不了架构师?>>>    光线跟踪方法 基本光线跟踪算法 光线与对象表面的求交计算 光线-球面求交 光线-多面体求交 减少对象求交计算量 空间分割方法 模拟照相 ...

  4. java 算法比较,java几种面消隐算法的比较

    达内java培训:本文就 目前现有面消隐算法进行 了分类,对每类算法特 点进行 了总结.从每种 算法本 身的特点 .消隐空间.排序效率和对场景的限制这几方面 .重点分析比较 了几种常用的面消隐算法. ...

  5. 15.真实感图形——光照与明暗+光线跟踪+纹理映射+辐射度方法+阴影

    ♥,.*,.♥,.*,.♥,.*,.♥,.*♥,.*,.♥,.*,.♥,.*,.♥,.*,.♥,.*,.♥,.*,.♥,.*,.♥♥,.*,.♥,.*,.♥,.*,.♥,.*♥,.*,.♥,.*,.♥ ...

  6. 课堂笔记_ 光线跟踪加速

    光线跟踪算法的不足: 光线跟踪算法的时间和空间复杂度很高: 大量的时间被消耗在可见性判断和求交测试这些几何运算上. 光线跟踪加速 采用空间数据结构: –层次包围体(Hierarchical Bound ...

  7. 计算机树表查找算法的适用场景,利用基于R-树连续最近邻查询算法来渲染雨滴,形成了逼真的下雨天场景图...

    摘要:自动驾驶领域最近的发展表明,这些车辆在不久的将来会出现在每个城市的街道上,而这些城市不会容忍交通事故的发生.为了保证安全需求,自动驾驶汽车和被使用的软件必须在尽可能多的条件下进行详尽的测试.通常 ...

  8. 课堂笔记_ 光线跟踪原理

    Turner Whitted于1980年首次提出一个包含光反射和折射效果的模型:Whitted模型,并第一次给出光线跟踪算法的示例,是计算机图形学历史上的里程碑.发表于Communications o ...

  9. 学界 | 清华AMiner团队发布53页计算机图形学研究报告

    来源:AI科技评论 摘要:清华 AMiner 团队近日发布新一期研究报告--<计算机图形学研究报告>,报告全文共 53 页,从概念.技术.人才.会议.应用及相应趋势详细介绍了计算机图形学的 ...

最新文章

  1. 如何通过HTML标记或JS代码实现跳转返回页面顶部
  2. 提交客户端证书_MQTT X v1.3.3 正式发布 - 跨平台 MQTT 5.0 桌面测试客户端
  3. VQEG(视频质量专家组)
  4. Map+Model+ModelMap介绍
  5. MapReduce-流量统计求和-Reducer和JobMain代码编写
  6. Nexus for linux安装
  7. 唯一的hashCodes不足以避免冲突
  8. UITableViewCell在非Nib及Cell重用下设置CellStyle
  9. 转 关于window10安装jdk,配置环境变量,javac不是内部或外部命令,也不是可运行的程序 或批处理文件的细节问题。...
  10. android 切换字体崩溃,androidx - 在Android 10 / Android Q上使用捆绑的ttf字体时崩溃 - 堆栈内存溢出...
  11. java月历_Java 日历
  12. Https原理及实践
  13. 综合项目 旅游网 【4.旅游线路名称查询-参数传递】
  14. Web开发者和设计师必须要知道的 iOS 8 十个变化
  15. 人工湖对环境温度的调节问题
  16. ubuntu下安装navicat
  17. 文件异常与文本文件处理
  18. 第一次的医美体验,决定了客户的回头率
  19. 递归查询树形结构数据
  20. 奖项 | 2019亚洲区块链50强榜单中国区名单公布!

热门文章

  1. 2019.03.01 bzoj2555: SubString(sam+lct)
  2. 尼克的任务 dp 洛谷1280
  3. Linux常用压缩与解压缩命令
  4. (转载)动态SLAM系统:VDO-SLAM!
  5. codeforces round 416 div2补题
  6. python私有属性怎么定义_Python中私有属性的定义方式
  7. 油品调和计算软件_燕山石化汽油在线调和系统完成升级改造
  8. java的重点是什么_你知道初学者学习Java的重点是什么吗?
  9. mysql更新索引不影响业务_mysql索引更新要多久
  10. 汉字转换成html,汉字与16进制、汉字与Html转义符的转换