阴影,光线追踪基本原理

  • 1.阴影贴图(Shadow Mapping)
    • 1.1产生步骤
    • 1.2存在问题
  • 2.光线追踪( Ray Tracing)
    • 2.1为什么需要光线追踪?
    • 2.2基础光线追踪算法(Basic Ray-Tracing Algorithm)
    • 2.3Whitted风格的光线追踪(Whitted-Style Ray Tracing)
    • 2.4计算光线和物体表面的交点
      • 2.4.1光线的表示
      • 2.4.2光线和隐式曲面的交点
      • 2.4.3计算光线和显式曲面的交点

1.阴影贴图(Shadow Mapping)

图形学中阴影的产生原理:对于一个点来说,如果它位于阴影中,则说明摄像机能看到这个点,但是光源无法看到这个点;如果位于阴影外,则说明摄像机能看到这个点,同时光源也能看到这个点。
注:

  • Shadow Mapping 只能处理点光源的阴影;
  • 产生的为硬阴影(没有平滑过渡);

1.1产生步骤

Step1:从光源出处看向物体,进行一次透视投影,只记录下投影后光能看到的点的深度信息(Z-Buffer)

Step2:从真正的相机视角去对当前场景进行透视投影,将相机看到的所有点,全部通重新投影到光源相机上,又会得到一副深度图

Step3:将Step2中生成的深度图像与Step1中生成的深度图像进行比较,看上面记录的点的深度是否一致(一致则说明点光源能看到该点,即该点不在阴影中,可见;反之在阴影中,不可见)


如上图所示,从摄像机投影回光源,进行比较,如橘色线上的点,这点能被光照照射到,就不处于阴影中,可见;而红线上的点就被判定处于阴影中,不可见。

1.2存在问题

1)计算结果均为浮点数,不宜比较是否相等,一般通过让两个浮点数做差,结果小于某个极小的数就认为这两个浮点数相等;
2)由于要求的是点光源,而点光源不存在大小,产生的为硬阴影,不符合实际中的阴影,真实的如下图的第二张图所示,称为软阴影
3)阴影贴图也是贴图的一种,阴影贴图的分辨率和实际渲染的分辨率如果不匹配,即纹理分辨率过大或过小引起的问题,如锯齿和摩尔纹。

2.光线追踪( Ray Tracing)

2.1为什么需要光线追踪?

1)光栅化并不能很好的处理全局影响,如下图所示的几种反射:

2)虽然光栅化处理很快,但质量较低,如下图所示:

3)由于光线追踪生成速度非常缓慢,一般用于制作动画视频时使用,而光栅化一般使用于实时场景渲染:

2.2基础光线追踪算法(Basic Ray-Tracing Algorithm)

三个思想基础:

  • 光总是沿直线传播的
  • 光线与光线之间不会发生碰撞
  • 光线的可逆性,即光线到达眼睛后,眼睛发出的光同样能返回光源

基础光线追踪的过程
Step1:从摄像机看向物体,类似发出光线(eye ray),首先穿过图像平面(image plane,透视投影中的近平面),直到最初接触到某个物体的表面;

如果一条光线可以穿过多个物体,仍只需记录第一个被照射到的物体,后面的物体默认为被遮挡上了,处于阴影中,眼睛看不到,如上图虚线所示

Step2:将相交点与光源连接,判断是否处于阴影中,若不处于,则在image plane对应的网格位置记录该点的颜色信息等,不断重复操作直到用眼睛发出的光线遍历完image plane中的所有像素点

然而,这样做得到的结果与Blinn-Phong光照模型得到的结果一样,缺少现实物体的反射和折射功能,所以引入Whitted风格的光线追踪。

2.3Whitted风格的光线追踪(Whitted-Style Ray Tracing)

Whitted-Style Ray Tracing很不错的解决了折射和反射相关的投影到视觉图上的效果:

实现过程
Step1:和上述的基础光线追踪的Step1步骤一样,只是有多添加了光线的反射和折射
注:当光线打到光滑的物体表面时,会同时发生折射和反射

Step2:将上述四个点分别与光源连接,然后在像素块中按一定的权重比例记录下颜色信息(如直射光线60%,折射反射光线占40%等)

2.4计算光线和物体表面的交点

2.4.1光线的表示

光线就是一条射线,一个向量,由起点,方向和时间构成:

2.4.2光线和隐式曲面的交点

以光线和球的交点为例:
求光线和球的交点实质上就是求同时满足光线方程和球方程的点:

方程求解:

由方程解 t t t的数量来判断有几个相交点(0个,1个,2个),若为2个,则取离光线最近的交点。

由此可以推广应用到所有隐式曲面的交点:
表面交点P都可以由物体方程等于0来表示( f ( p ) = 0 f(p)=0 f(p)=0),然后让光线方程和P点方程联立,解方程即可。

2.4.3计算光线和显式曲面的交点


如上图所示,为光线与显式曲面的交点,可以看出,其交点其实就是与三角形面的交点,因此转化问题为计算光线与三角面的交点

首先先做该三角形所在平面,平面由法向量和平面上的一点定义:

联立光线方程和点P方程,解方程;求得t之后,代入光线方程,就能得到交点了:

得到了交点之后,就能进一步判断该点是否在三角形内了。
由于判断点是否在三角形内较为麻烦,所以引出新的直接求交点方法
Möller Trumbore 算法
求解交点位置之后,也顺带判断了该点是否在三角形内部
如上图所示,引用之前所学知识(如何判断平面内一点和三角形的关系),即 a P 0 + b P 1 + c P 2 = P aP_0+bP_1+cP_2=P aP0​+bP1​+cP2​=P(其中a+b+c=1; P 0 , P 1 , P 2 P_0,P_1,P_2 P0​,P1​,P2​是三角形的三个顶点;如果该点P位于三角形内部,那么a,b,c均为非负数),因此可以得到图中上方公式。可以将where下的方程代入左侧方程中,解这三个方程即可计算出(t,b1,b2)。

那是这上述所说的计算交点的方法都是非常耗时的,为了能够更快的提高计算交点的速度,我们引入包围盒(Bounding Volumes)概念。

计算机图形学笔记十一:Ray Tracing1(阴影,光线追踪基本原理)相关推荐

  1. 计算机图形学笔记(一)渲染管线概述

    计算机图形学笔记(一)渲染管线概述 写在前面:因为之前有学习过图形学,博文是对过去知识的拾遗和对学习过程中的总结记录,所以在内容组织上可能不符合逻辑,某些比较熟悉的内容不会体现或简述:在整理资料的时候 ...

  2. 计算机图形学笔记(观测变换、模型变换、视图变换、投影变换、视口变换)

    计算机图形学笔记(观测变换.模型变换.视图变换.投影变换.视口变换) 目录 计算机图形学笔记(观测变换.模型变换.视图变换.投影变换.视口变换) 一.简介 1.模型变换(Model transform ...

  3. GAMES101-现代计算机图形学入门-闫令琪 - lecture13 光线追踪1(Ray Tracing 1 - Whitted-Style Ray Tracing) - 课后笔记

    光线追踪1 (Ray Tracing 1 - Whitted-Style Ray Tracing) 课程一共分为四个大的板块,目前已经学习了光栅化和几何,可以实现图1和2的效果,下面要来学习第三个大的 ...

  4. 计算机图形学GAMES101(十二)光线追踪(基本原理)

    我们是怎么解决阴影问题? 当对物体着色的时候,只考虑了像素点自己,没有考虑物体遮挡.所以着色不能解决阴影.那么怎么解决阴影问题呢? 阴影映射(Shadow mapping) 可以使用阴影映射来渲染阴影 ...

  5. 计算机图形学 实验三 相机、阴影、光照

    文章目录 实验3.1 相机定位 一. 实验目的 二. 理论背景 1.各个坐标系 世界坐标系 相机坐标系 模型视图矩阵 ndc坐标系 2. 齐次坐标 3. OpenGL观察变换 三. 实验内容 Look ...

  6. 计算机图形学笔记 (第一周)

    1.计算机图形学:研究通过计算机将物体表示为图形并显示的一门学科. 表示: 将物体表示为图形:造型/建模 显示:将表示后的图形显示出来: 渲染/绘制 2.文字/文本:图形/图像:  图形本质也是一种语 ...

  7. GAMES101-现代计算机图形学入门-闫令琪 - lecture15 光线追踪3 - 辐射度量学、渲染方程(Ray Tracing 3) - 课后笔记

    光线追踪3 - 辐射度量学.渲染方程和全局光照 内容: 辐射度量学 光线传输(Light transport) 反射方程(The reflection equation) 渲染方程(The rende ...

  8. GAMES101-现代计算机图形学入门-闫令琪 - lecture14 光线追踪2 - 加速结构(Ray Tracing 2 - Acceleration) - 课后笔记

    光线追踪2 - 加速结构(Ray Tracing 2 - Acceleration) 对AABB结构优化来加速光线追踪的速度 均匀网格(Uniform grids) 空间划分(Spatial part ...

  9. 计算机图形学笔记十三:Ray Tracing3(辐射度量学,渲染方程)

    辐射度量学,渲染方程 1.辐射度量学(Basic Radiometry) 1.1基本属性 1.2辐射强度(Radiant Intensity) 1.3辐射照度(Irradiance) 1.4辐射亮度( ...

最新文章

  1. 数据库 大数据访问及分区分块优化方案
  2. 计算机的学生该怎么做?
  3. 新手搭建阿里云FTP服务器
  4. 03-25实验一、命令解释程序的编写
  5. 20155222 2016-2017-2 《Java程序设计》第10周学习总结
  6. apache shiro jar包_只需要6个步骤,springboot集成shiro,并完成登录
  7. 爱说说技术原理:与TXT交互及MDataTable对Json的功能扩展(二)
  8. java 方块_哈工大java实验 移动小方块
  9. 读书 | 数字化转型的道与术(上)
  10. R文件报错:cannot resolve symbol ‘R’
  11. 设备文件BSP及嵌入式驱动开发笔记
  12. Hough检测直线原理及c++代码
  13. mac虚拟机哪个好用 mac双系统和虚拟机哪个好
  14. “变态”的JavaScript——JavaScript的发明人--布兰登·艾奇(Brendan Eich)
  15. 如何在亿级数据中判断一个元素是否存在?
  16. C#利用JScript自动计算字符串公式方法
  17. python如何模拟微信扫码登录_python 微信扫码登录故障解决
  18. ccf公共钥匙盒python_CCF/CSP 公共钥匙盒
  19. hbase倒序查询_Hbase 查询Scan速度优化
  20. 将picpick汉化及矩形截屏

热门文章

  1. 超多水分(没写错),教你三步点赞100000+
  2. 在AI宇宙中流浪的他们,在一张海报中收获了“懂得”
  3. Htmlunit获取页面cookie的用法
  4. access数据库使用水晶报表(PUSH)推模式实现多数据源含子报表的订单打印
  5. MSTAR-DIB,IBitmap,IDisplay,IDispCanvas,IFont,IImage等
  6. 如何重新排列pdf的顺序?
  7. 不要再担心旅游景点英语翻译问题啦
  8. 记一次台式机安装centos7的问题
  9. pytorch-学习笔记-Sequential函数
  10. sql 累计占比_制作有累积和占比的销售统计表