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

光线追踪1 (Ray Tracing 1 - Whitted-Style Ray Tracing)

在这里插入图片描述
课程一共分为四个大的板块,目前已经学习了光栅化和几何,可以实现图1和2的效果,下面要来学习第三个大的板块,光线追踪。

为什么要使用光线追踪?

在学习光栅化时,我们在进行着色的过程中实现光照效果的时候可以发现,我们实现了环境光、漫反射、镜面反射,但是确没有做出阴影。因为光栅化考虑的只是一个局部的着色的过程,只是对那一个像素周围的区域进行着色,并没有考虑到全局进行着色,所以在实现物体表面的光照效果的时候,无法实现对应的阴影。

而光线追踪可以做到:

  • 实现软阴影

  • 能够很好的解决全局光照的问题
    在这里插入图片描述
    上面三个图都是需要通过光线追踪来进行实现,特别是最后一个间接光照。我们在用光栅化进行着色的时候,对于环境光直接按照一个常数进行处理,但是实际上环境光的出现并不是经过一次反射得到的,比如上图图3,光线经过窗子射入屋内,然后光线撞到地板上进行反射,反射到天花板上在进行一次反射,最后反射到桌上。要实现更好的光照效果,就不能像之前那样单纯的将环境光设置为一个常量,所以需要光线追踪来实现。
    在这里插入图片描述
    上图是绝地求生中的游戏截图,可以看到图片上的纹理非常粗糙,并且没有阴影,光照的效果也非常差。光栅化进行着色速度很快,但是质量确比较低,因为之前在学习光栅化的时候也可以发现,光栅化在很多地方都是进行一种近似的处理,比如插值,采样等过程,所以得到的效果并不好。
    在这里插入图片描述
    而上图就是光线追踪的应用效果了,可以看到实现的效果非常的好。光线追踪得到的效果更加精确,但是,其速度确非常的慢。

  • 光栅化更加适合实时(real-time)的渲染,比如在游戏领域,游戏需要较快的速度

  • 光线追踪更适合离线(offline)的渲染,比如在制作上图的这种动画电影,都是将程序写好之前花大量的时间运行出来,然后组成电影,比如上面这一张图的渲染,就需要消耗10k个CPU时间。虽然目前也开始在游戏中应用光线追踪技术,如战地5,古墓丽影暗影等、但是开启光线追踪的效果之后帧数下降明显,只有高级游戏显卡才能够较为流畅的游玩。

介绍了这么多,下面开始介绍具体的光线追踪算法

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

在介绍算法之前,关于光线有一些说明:

  • 我们认为光线是沿着直线传播的(虽然在物理上来看是错的)
  • 当几束光线交叉时,并不会产生碰撞(虽然在物理上看是错误的)
  • 光线是从光源传播到人眼的,但是在反转的情况下也是相同的,即从人眼传播到光源。正常来说,人眼能够看到物体,是因为有光线进入了人的眼中,但是这个逆过程我们可以认为,是人眼向物体发出了一种“感知光线”,然后才看到了物体,人眼发出“感知光线”的路径和光线的传播路径是相同的,即光路的可逆性。我们就是利用光路的可逆性,从人眼出发,对光线进行追踪。

光线的投射(Ray Casting)

在这里插入图片描述
平面是物体的投影平面,后面是实际的物体。光线的投射的过程:假设我们目前在往一个虚拟的世界看,我们是透过投影上面的投影的屏幕向虚拟世界中看,投影的平面被我们分成了由许多个像素组成。

  • 我们先从人眼放出“感知光线”,放出的光线透过投影平面上的一个像素投射到虚拟世界的物体上的某一点
  • 然后再从这一点向光源发出一条光线,检查该点是否在光照的范围内。

上面这一个过程就是利用光路的可逆性,正常是从光源到物体到人眼,而颠倒这个过程,就能够对光线进行追踪。

下面看一个具体的光线投射的例子
在这里插入图片描述
在这之前,有一些事情需要先声明一下:

  • 我们的人眼是看作一个针孔摄像机,而不考虑人眼本身的大小
  • 光源我们认为是一个点光源
  • 人眼发出的光线在碰到场景中的物体时,我们认为光线会发射完美的反射或者折射。
    在这里插入图片描述
  • 从人眼发出了一条光线(蓝,eye ray),透过屏幕上的像素(每一个像素都是如此),打到了场景内的球上,和球有一个交点(closest scene intersection point)
  • 可以看到在光线的延长线上还能够打到场景中的其他物体,但是我们只要最近的,这也就顺带解决了一个深度测试的问题。在前面光栅化进行深度测试时,需要维护一个深度缓存来记录每个像素所对应的最小深度,通过这种光线追踪的方式,找到最近的焦点就可以不用在记录深度了,怎么做后面再说。

在这里插入图片描述

  • 之后我们需要考虑这个交点会不会被光源照射,于是从交点和光源连一条线,如果沿着这条光线中间没有任何物体阻挡,那么这个交点就可以被光线照射到 。
  • 黑色的线为法线
  • 有了法线、入射方向、出射方向就可计算着色,并且写入像素的值。像素变成灰色的了。

通过这种方法能够获得和光栅化近似相同的结果。在这里光线只弹射了一次,后面就介绍光线弹射多次的方法。

Recursive (Whitted-Style) Ray Tracing

在这里插入图片描述
Whitted光线追踪的着色效果就如上图。两个球分别实现了折射和反射,阴影的程度也不相同,在这个方法中就计算了光线的多次弹射,能够实现一个很不错的效果。

算法的具体说明如下:
在这里插入图片描述
还是之前的场景:

  • 人眼射出一个“感知光线”,eye ray,透过一个像素打到了场景内的物体上,在物体表面上有一个交点。
    在这里插入图片描述
  • 打到物体的表面之后,光线发生了反射,射出了一条Reflected ray,打到了另一个物体上,并且也有一个交点。
    在这里插入图片描述
  • 光线的能量分成了两股,一股进行反射,而另外一股进行了折射,上图中折射进行了两次:
    • 打到球下表面的光线折射进入球内,发出一个Refracted Ray,从内部打到上表面的一个点上
    • 光线在上表面的这个点上再次进行了折射,发出了一个Refracted Ray,打到了长方体表面上的一个点上。
      在这里插入图片描述
  • 将这四个点都和光源进行连线,判断这四个点是否在光照范围内。
  • 分别计算这4个点的着色
  • 将四个点的着色相加,就得到了一开始“感知光线”透过的像素的着色效果。
    在这里插入图片描述
    人眼发出的第一道感知光线我们称为primary ray,后面折射和反射的光线都称为secondary rays,四个点和光源的连线称为shadow rays。按照上面的过程,最终就能够得到下面的效果:
    在这里插入图片描述

求光线与面的交点(Ray - Surface Intersection )

在了解了上面Whitted风格的光线追踪之后,要实现这个算法我们还需要知道如何求光线和面的交点。

定义一条光线

在这里插入图片描述
从上个图可以看出,要定义一条光线,只需要知道光线的出发点(点光源)和光线射出的方向向量即可,所以光线的代数定义如下:
在这里插入图片描述
上面的表示的是,在时间t时,光线的所到达的位置。t = 0时,光线还未出发,此时的光线是一个点,t = 1时,光线从原点出发,经过单位时间到达了o + d的位置,o和o + d两个点的连线,就是此时的光线。

光线和球面的交点(Ray Intersection with Sphere)

在这里插入图片描述
第一个公式为光线的公式,第二个公式则是球面的隐式表示公式。在数学中求一条线和一个面的交点时,只要令两式想等,求得的解就是线和面的交点。所以光线和球面的交点的求法也是将两个等式相等求解,经过化简,就可以得到下面的式子:
在这里插入图片描述
求出t,就可以得到交点,其中o , c , R 已知。然后再将该式子展开,使用求根公式,即可得到解。
在这里插入图片描述
二次方程的根有三种情况,分别是0、1、2个根,不同的根的数量对应的交点情况如下:
在这里插入图片描述

光线和隐式曲面求交点(Ray Intersection With Implicit Surface)

前面在介绍隐式曲面时已经说过,隐式曲面是使用一个等式来表示
在这里插入图片描述
求光线和隐式表示的曲面的交点的方法和上面类似,直接代入求解即可。
在这里插入图片描述
比如下面这些曲面求交点,直接带入即可。
在这里插入图片描述

求光线和三角形网格的交点(Ray Intersection With Triangle Mesh)

隐式表达的曲面通过上面的方法就可以求解,那么显示表达曲面该怎么办?就是通过求光线和三角形的交点。

通过求光线和三角形的交点,能够判断这个交点处是否在阴影内,是否可见、等等。并且还能够判断给定的一个点是在物体内还是在物体外面。比如有一个物体,有一个点,从这个点发出一条光线,光线是一条射线,如果点在物体内,那么光线和物体的交点一定是奇数个,如果在外,则是偶数个。

说那么多,那么该如何计算光线和三角形的交点?

  • 最简单的一个思想,让每一个三角形都和光线求交点
  • 问题:但这种做法会导致速度非常慢,于是就需要对其进行加速(后面再说)。

计算光线和三角形的交点

我们都知道三角形是处在一个平面上的,于是要求光线和三角形是否有交点,则可以按照如下的方法:

  • 先求出光线和三角形所在平面的交点
  • 判断这个交点是否在三角形内部

平面等式(Plane Equation)

在这里插入图片描述
要确定一个平面,需要该平面的法向量和平面上的任意一点

  • 一个法向量能够确定一系列平行的平面
  • 再加上一个点,就可以定义到一个准确的平面

平面的等式如下:
在这里插入图片描述
p代表该平面上的任意一点,p‘代表平面上已知的一点,N代表法向量。平面方程的一般表示形式为:
在这里插入图片描述

计算光线和平面的交点

有了光线和平面的等式,直接将光线等式带入求解即可。
在这里插入图片描述

加速光线和平面求交点的计算(Accelerating Ray - Surface Intersection)

前面让每个三角形都和每一个光线进行交点的计算,那么复杂度 = 像素的个数 * 三角形网格的个数(在前面介绍光线追踪时,我们提到过,人眼从发出的光线会穿过每一个像素)。这种方法虽然有效,但是速度太慢,所以要对其进行改进,减少计算量,加快运行速度。

我们使用的方法是包围体(Bounding Volumes)。

包围体(Bounding Volumes)

前面在光栅化的部分,我们学过一个包围盒,这里的包围体的思想与前面类似。

包围体的思想是:

  • 使用一个立体的盒子,将物体完整的包围起来。
  • 当光线入射的时候,先判断光线是否和包围体有交点,如果和包围体没有交点,那么光线和包围体内部的物体一定没有交点,就可以不用再对这个内部物体上的每个三角形求交点;如果光线和包围体有交点,则下一步:
  • 求光线和内部物体的每一个三角形的交点。包围体的效果如下:
    在这里插入图片描述

轴对齐包围盒(Axis-Aligned Bounding Box, 缩写AABB)

我们一般使用轴对齐包围盒,轴对齐包围盒就是由三对相互垂直的平面所围成的一个立体空间。,如下图所示,只展示出了其中一对盒子。
在这里插入图片描述

求光线和轴对齐包围盒的交点(Ray Intersection with Axis-Aligned Box)

以2D的情况为例,3D的情况类似。在上面提到过,AABB是由三对相互垂直的平面所围成的,那么在2D的情况下,AABB就是由两对相互垂直的面所围成。
在这里插入图片描述
上图表示求光线和包围盒交点的过程:

  • 求出光线在x = x0 和 x = x1上的交点,分别用t(min)和t(max)表示,代表光线最早和最晚通过在x方向上的对面,如图1
  • 求出光线在y = y0 和 y = y1上的交点,分别用t(min)和t(max)表示,代表光线最早和最晚通过在x方向上的对面,如图2
  • 求上面求出的两个光线进入时间和离开时间的交集,如图3

如何判断光线是否通过包围盒

核心思想:

  • 当光线和每一对平面都有交点时,光线才会进入包围盒。

  • 当光线离开任一对平面时,光线也就离开了包围盒。

  • 对于每一对平面,我们都要计算出t(min)和t(max),分别代表了光线的进入和离开的时间,t可以是负数。

  • 对于每一个3D的包围盒,我们要对上一步算出的时间区间进行求交集。
    在这里插入图片描述

  • 如果t(enter) < t(exit)时,我们就知道,光线曾有一段时间是在盒子内部,也就是说光线和包围盒有交点。

有一些特殊情况:

  • 如果t(exit) < 0,则代表物体在点光源的背后
  • 如果t(exit) >= 0 而 t(enter) < 0,则代表这个光源就在物体的内部

总而言之,如果光线和包围盒有交点,则应该满足:

  • t(enter) < t(exit) && t(exit) > = 0

为什么使用轴对齐包围盒?

使用轴对齐包围盒求交点非常简单。只要当光线的某一分量等于某一个特定值的时候,就说明光线和这个轴对齐的平面有交点了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/49847.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

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

光线追踪2 - 加速结构&#xff08;Ray Tracing 2 - Acceleration&#xff09; 对AABB结构优化来加速光线追踪的速度 均匀网格&#xff08;Uniform grids&#xff09;空间划分&#xff08;Spatial partitions&#xff09; 均匀空间划分&#xff08;Uniform Spatial Partition…

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

光线追踪3 - 辐射度量学、渲染方程和全局光照 内容&#xff1a; 辐射度量学光线传输&#xff08;Light transport&#xff09; 反射方程&#xff08;The reflection equation&#xff09;渲染方程&#xff08;The rendering equation&#xff09; 全局光照&#xff08;Global…

GAMES101-现代计算机图形学入门-闫令琪 - lecture8 着色2(Shading 2) - 课后笔记

着色2&#xff08;Shading 2&#xff09; Blinn - Phong 光照模型包括 &#xff1a; 漫反射、镜面反射、环境光。上一节讲了漫反射&#xff0c;下面讲一下镜面反射和环境光。 镜面反射&#xff08;Specular reflection&#xff09; 镜面反射&#xff1a;当物体的表面很光滑的…

GAMES101-现代计算机图形学入门-闫令琪 - lecture11 几何3(Geometry 3) - 课后笔记

几何2 - 曲线和曲面&#xff08;Geometry 2 - Curves and Surface&#xff09; 上一节提到&#xff0c;要表现一些复杂的几何模型有两种方法&#xff1a; 隐式几何显式几何 本节课讲的为显式几何 显式几何&#xff08;Explicit Representations&#xff09; 显式几何有两种…

GAMES101-现代计算机图形学入门-闫令琪 - lecture4 观测变换(viewing transformation) - 课后笔记

观测变换&#xff08;Viewing transformation&#xff09; 视图 / 相机变换&#xff08;View / Camera transformation&#xff09;投影变换&#xff08;Projection transformation&#xff09; 正交投影&#xff08;Orthographic projection&#xff09;透视投影&#xff08;…

GAMES101-现代计算机图形学入门-闫令琪 - lecture9 着色3(Shading 3) - 课后笔记

着色3&#xff08;Shading 3&#xff09; 重心坐标纹理查询纹理应用 插值 - 重心坐标 &#xff08;Barycentric Coordinates&#xff09; 为什么要插值&#xff1f; 能够获得三角形三个固定顶点的属性&#xff0c;但是不知道三角形内部的属性希望三角形内部属性能有一个平滑…

GAMES101-现代计算机图形学入门-闫令琪 - lecture6 光栅化2(抗锯齿) - 课后笔记

光栅化2&#xff08;抗锯齿&#xff09;&#xff08;Rasterization 2 - Antialiasing&#xff09; 抗锯齿的内容包括&#xff1a; 采样理论&#xff08;Sampling theory&#xff09;抗锯齿的实践应用&#xff08;Antialiasing in practice&#xff09; 接着上节 我们采样是…

GAMES101-现代计算机图形学入门-闫令琪 - lecture5 光栅化(三角形的离散化) - 课后笔记

光栅化&#xff08;三角形的离散化&#xff09;&#xff08;Rasterization1 (Triangles)&#xff09; 接着上面的透视投影开始&#xff1a; 如何确定一个近平面的 l(left) , r(right) , b(bottom) , t(top)四个面&#xff1f;通常使用竖直可视角度&#xff08;vertical field…

GAMES101-现代计算机图形学入门-闫令琪 - lecture3 变换(transformation) - 课后笔记

变换 为什么要变换&#xff1f; 变换有两种&#xff0c;一种 model 和 view 变换&#xff0c;其中model变换中包括缩放&#xff0c; 而view则主要是讲3D投影到2D的画面上 二维变换 要找到一个变换&#xff0c;实际上就是寻找变换后得坐标(x‘,y’)和变换之前的坐标&#xf…

GAMES101-现代计算机图形学入门-闫令琪 - lecture7 着色(Shading) - 课后笔记

着色&#xff08;Shading&#xff09; 可视性 / 遮挡 Z - 缓冲 &#xff08;Z - buffering&#xff0c;深度缓冲&#xff09; 着色 光照 和 着色 &#xff08;illunmination & Shading&#xff09; 画家算法&#xff08;Painter s Algorithm&#xff09; 先注明一下&am…

全网最详细中英文ChatGPT-GPT-4示例文档-场景问题智能生成从0到1快速入门——官网推荐的48种最佳应用场景(附python/node.js/curl命令源代码,小白也能学)

从0到1快速入门场景问题智能生成应用场景 Introduce 简介setting 设置Prompt 提示Sample response 回复样本API request 接口请求python接口请求示例node.js接口请求示例curl命令示例json格式示例 其它资料下载 ChatGPT是目前最先进的AI聊天机器人&#xff0c;它能够理解图片和…

记一次alertmanager发送邮件失败的处理过程

文章目录 0 说明环境说明阅读说明 1 先验证smtp信息是否正确2 配置alertmanager配置文件并触发告警3 解决 smtp.plainAuth failed: wrong host name4 解决 dial tcp 127.0.0.1:5001: connect: connection refused5 解决 配置文件不对应的问题6 解决configmap跟挂载文件名不对应…

使用telnet客户端发送假冒邮件出现由某某代发怎么解决

使用telnet客户端发送假冒邮件出现由某某代发怎么解决 步骤如下&#xff0c;打码的是邮箱地址 想知道为什么我的有"由某某代发"&#xff0c;而别人的没有&#xff0c;都是通过同样的操作在自己的电脑上操作的

奇葩经历之一_Hotmail邮箱无法查看和发送任何邮件

起因——“似乎有其他人使用你的帐户&#xff01;” 因为IP活动异常&#xff0c;微软通知你账号有风险&#xff1a; 自动处理——“别慌&#xff0c;我们停用你的账户&#xff0c;这样就安全了&#xff01;” 没有任何通知和提示就直接关闭邮箱功能&#xff0c;从这以后&…

记录项目里面用到的几个给国外邮箱发邮件的代码

一些说明&#xff1a; 这几个都可以正常发邮件&#xff0c;但是免费的每天都会有限制&#xff0c;发多了就会黑名单。。。 最终选择了exchange付费的版本&#xff0c;每天可以发1万条邮件&#xff0c;也不是很贵&#xff0c;基础的32一个月的就可以了 import javax.mail.inte…

JavaMail邮件发送不成功的那些坑人情况及分析说明(巨坑跳出专用姿势)

https://blog.csdn.net/xyw591238/article/details/69530950 前言 JavaMail的使用本身并不难&#xff0c;网上有不少案例&#xff0c;简单易懂&#xff0c;而且有详细的中文注解。但是由于JavaMail的机制设置不够完善&#xff0c;特别是异常出错时的参考信息太少&#xff0c;给…

Python通过发邮件通知自己电脑被入侵

我对IT技术有着狂热的追求&#xff0c;虽然现在很渣&#xff0c;但是我有颗钻研的心&#xff0c;例外我还比较喜欢看小说&#xff0c;相信看过最强黑客的人对里面的黑客的技术佩服得无以复加&#xff0c;黑客一般对自己的电脑数据都比较在意&#xff0c;一般都会设置些密码等并…

如何在线伪造邮箱发件人,用任意邮箱发送邮件

今天邮箱收到一封自己域名发过来的邮件&#xff0c;但是询问当事人说并没有发送相关邮件&#xff0c;于是去百度了下&#xff0c;看是否可以伪造发件人&#xff0c;于是找到一个网站 http://tool.chacuo.net/mailanonymous&#xff0c;这个网站可以用任意的邮箱地址发邮件&…

单播通信、主播通信和广播通信

单播 简介 单播&#xff08;unicast&#xff09;是指封包在计算机网络的传输中&#xff0c;目的地址为单一目标的一种传输方式。每次只有两个实体相互通信&#xff0c;发送端和接收端都是唯一确定的。它是现今网络应用最为广泛&#xff0c;通常所使用的网络协议或服务大多采用…

Qt 之图形(转换)

作者&#xff1a; 一去、二三里 个人微信号&#xff1a; iwaleon 微信公众号&#xff1a; 高效程序员 QTransform 用于指定坐标系的 2D 转换 - 平移、缩放、扭曲&#xff08;剪切&#xff09;、旋转或投影坐标系。绘制图形时&#xff0c;通常会使用。 QTransform 与 QMatrix 不…