光线追踪

渲染时间花费较多,适用于影视类的离线渲染。

光线的特点

  • 光线沿直线传播
  • 光线与光线之间不会发生碰撞
  • 光线一定是从光源出发,最后进入人的眼睛
  • 光路是可逆的

样例

前提:眼睛和光源都假设为点没有大小

eye ray: 眼睛过image plane的一个像素做射线,最终取射线与物体相交的最近的点。

(巧妙的解决了深度测试的问题,取最近的点,也就是比这个点远的点直接舍弃,也就不会有后续的shadow ray了)

shadow ray: 相交的点与光源连接的射线,如果光源到这个点的路径中有其他的点,则说明该点处于阴影中。

如果点可见则用着色模型将该点的颜色计算出来,再写入该像素点。

Whitted-Style Ray Tracing

适用于光线弹射很多次的情况

前提:反射是完美反射,有反射和折射

内容:

primary ray: 同eye ray相同

secondary rays: primary ray射到最近点会发生反射和折射,并且会有能量损失,这个过程中形成的一些光线。

shadow rays: 将某一个像素的对应的最近点的反射和折射产生的最近点与点光源连接起来。

判断这些点是否可见,如果可见,则对该点进行着色计算,并且将这些得到的值,都加入到最终该像素的颜色中。

实现

光线的定义:

光线有一个起始点,有一个方向

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

起始坐标为o,d是单位方向向量,因为光线是一条射线,所以t的范围是大于0的

t是时间,也就是光线r从o出发,沿着d方向,t时间内走了多远

球的定义:

球上的点p,到圆心的距离都等于半径R

交点的计算:

光线与圆的交点的计算:

交点:一个点又在光线上又在圆上,也就是同时满足两个表达式

一个点在光线上表示为o+td,这个点又在圆上,带入圆的表达式,得到以下表达式

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

展开表达式,通过计算将t表示出来,得到t的表达式

根据不同的情况,t有不同的值,t的值大于0

  1. 如果没有交点,则根号项为负,
  2. 如果有且一个交点,则t只有一个值
  3. 如果有两个交点,则t取较小值

类推:光线与其他隐式图形的交点的计算

隐式图形:有等式表示的图形,判断表面上有哪些点不容易,但是判断某个点是否在表面上比较容易。

显式图形:直接给出,或者参数映射得到的图形,判断表面上有哪些点比较容易,但是判断某个点是否在表面上不容易。

将光线上的某点带入表达式中,最后计算出变量t即可

t满足的条件: 是实数,不是虚数;大于0

光线与其他显式图形的交点的计算

遍历所有三角形,让光线与三角形求交点,最终得到光线与图形的交点情况

光线与三角形面求交点
利用光线与三角形所在平面求交点来计算

由于三角形是一个平面图形,那么三角形一定处于某个平面上,光线与三角形求交,可以转化为光线与平面求交,得到交点,再判断得到的交点是否在三角形的内部,如果在则光线与三角形有交点,否则与三角形没有交点

平面的表示

一个法线和一个平面内的点可以确定一个平面

如果点p在平面上,那么pp0向量与法线的点积是0,也就是90度。

最终会表示为右边的三元一次方程

交点计算

将光线上的点,带入平面的表示方程,最终求得t,并且判断t的范围。

Moller Trumbore Algorithm

计算光线与三角形交点的一个快速方法

交点可以表示为左边的表达式,因为三角形内的某个点可以用重心坐标表示出来,所以交点可以表示为右边的式子,两边的式子相等

最终表达式如下,将t解出即可,t是实数非负,b1和b2也非负

利用包围盒来加速计算

包围盒(Bounding Volumes):一个物体可以用一个简单的形状包围起来,使得物体完全在包围盒里。

空间中的包围盒常用立方体,AABB表示包围盒的三组对立平行平面平行于xyz轴。

使用AABB是因为,如果光线和某个平面求交点的话比较麻烦,需要更多的计算,如果使用平行于xyz轴的平面,则计算时候可以使用某个分量的距离来直接计算t,例如平面垂直于x轴,则px-ox表示平面与光线起点的距离,dx表示时间dt内光线的x方向的变化量,两者相除得到时间t,相当于路程除以速度得到时间的效果。

光线与包围盒的交点

矩形示例:

光线与立方体的一组对立平面分别求交点,得到第一组tmin和tmax,光线与立方体的另外一组对立平面分别求交点,得到第二组tmin和tmax,最终我们可以得到光线穿过矩形的时间是较大的tmin和较小的tmax

包围盒示例:

包围盒有三组的平行对立面,

光线进入包围盒:光线进入三个平面

光线离开包围盒:光线离开一个平面

对包围盒的三组平行对立面都分别求tmin和tmax

所以光线进入包围盒的时间应该是最大的tmin,离开的时间应该是最小的tmax,如果tin<=tout说明光线进入过包围盒,也就是光线与包围盒有交点。

在tin<=tout的情况下考虑时间的正负:

  • 如果tout小于0,说明包围盒在光线的背面,也就是光线与包围盒不可能有交点
  • 如果tout大于等于0,但是tin小于0,说明光线的起点在包围盒内,说明光线与包围盒绝对有交点

最终,如果光线与包围盒有交点,需要满足tin<=tout并且tout>=0

GAMES101 13节 光线追踪 笔记相关推荐

  1. 《CCNA学习指南:Cisco网络设备互连(ICND1)(第4版)》——1.13节生产网络模拟问题1-1...

    本节书摘来自异步社区<CCNA学习指南:Cisco网络设备互连(ICND1)(第4版)>一书中的第1章,第1.13节生产网络模拟问题1-1,作者[美]Anthony Sequeira,更多 ...

  2. 《移动App测试的22条军规》—App测试综合案例分析23.13节测试微信App的流量和电量消耗...

    本节书摘来自异步社区<移动App测试的22条军规>一书中的App测试综合案例分析,第23.13节测试微信App的流量和电量消耗,作者黄勇,更多章节内容可以访问云栖社区"异步社区& ...

  3. 《Android游戏开发详解》——第2章,第2.13节调用对象的行为

    本节书摘来自异步社区<Android游戏开发详解>一书中的第2章,第2.13节调用对象的行为,作者 [美]Jonathan S. Harbour,更多章节内容可以访问云栖社区"异 ...

  4. 第13节 eclipse简介

    第13节 eclipse简介 什么是Eclipse Eclipse 是一个开放源代码的.基于Java的可扩展开发平台.就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境.幸运的是,E ...

  5. HTML5 权威指南第 10 章 文档分节 学习笔记

    HTML5 权威指南第 10 章 文档分节 学习笔记 第 8 章 标记文字 内容从从文字出发,专注如何将单体内容正确的呈现出来:第 9 章 组织内容 内容从段落出发,专注如何将单体内容合理的放在段落中 ...

  6. PW4203降压型1-3节锂电池充电芯片

    PW4203是一款4.5V-22V输入,最大2A充电,支持1-3节锂电池串联的同步降压锂离子电池充电器芯片,适用于便携式应用.可通过芯片VSET引脚选择1节充电或2节串联充电3节串联充电.PW4203 ...

  7. 原厂PW4203降压型1-3节锂电池充电芯片

    PW4203是一款4.5V-22V输入,最大2A充电,支持1-3节锂电池串联的同步降压锂离子电池充电器芯片,适用于便携式应用.可通过芯片VSET引脚选择1节充电或2节串联充电3节串联充电.PW4203 ...

  8. 是非人生 — 一个菜鸟程序员的5年职场路 第13节

    是非人生 - 一个菜鸟程序员的5年职场路第13节作者: 花8 天涯IT: http://cache.tianya.cn/publicforum/content/itinfo/1/77229.shtml ...

  9. 《Adobe Illustrator CS6中文版经典教程(彩色版)》—第0课0.13节使用绘图模式

    本节书摘来自异步社区<Adobe Illustrator CS6中文版经典教程(彩色版)>一书中的第0课0.13节使用绘图模式,作者[美]Adobe公司,更多章节内容可以访问云栖社区&qu ...

  10. 《Unity 3.x游戏开发实例》——2.13节适合上千款游戏的机制

    本节书摘来自异步社区<Unity 3.x游戏开发实例>一书中的第2章,第2.13节适合上千款游戏的机制,作者 [加]Ryan Henson Creighton,更多章节内容可以访问云栖社区 ...

最新文章

  1. vmware ESXI6.7 设置 Nvidia 显卡直通
  2. HDLBits 系列(20)移位寄存器(逻辑移位、算术移位、循环移位)
  3. bash shell 学习记录
  4. 手把手教你,Java如何实现二维码?【附源码】
  5. Python3的bytes/str之别
  6. 前端学习(1673):前端系列实战课程之最终封装
  7. linhaifeng fullstack
  8. html文件内容搜索,html读出文本文件内容
  9. 【推荐实践】图片主题模型在推荐系统的应用实践
  10. 不好,两群AI打起来了!“幕后主使”是上海交大~
  11. 发那科机器人圆弧指令怎么用_发那科机器人的指令如何编辑
  12. 网页测速 php,2020年8月更新 站长必备/测速工具网站推荐
  13. 洛谷P【P5708】三角形面积java写法
  14. 高动态范围(High-Dynamic Range,简称HDR)
  15. win10桌面计算机图标隐藏,win10系统隐藏桌面单个图标的恢复方法
  16. namecheap注册域名优惠码
  17. 原生JavaScript实现连缀调用
  18. 积目服务器维护,搭建经济高效的制作网络服务器群试验平台
  19. Flex for .NET platform
  20. 【文献翻译】构建网络安全知识库的框架-A Framework to Construct Knowledge Base for Cyber Security

热门文章

  1. 二手书电商闲鱼、转转们的花样淘金和眼前僵局
  2. 【linux】运维之LAMP
  3. Eclipse同屏显示两个代码编辑窗口
  4. 对大一c语言学习的感想
  5. DAOS整体设计分析 (二)
  6. 数据分析需要学习的技能有哪些?
  7. dedecms如何在首页调用会员信息(会员头像和名字等)
  8. 上海公积金网上提取全流程(图文版)在职公积金,离职公积金都可以提取
  9. VMWare 虚拟机网络共享给宿主机
  10. switch integer java_switch case 支持的 6 种数据类型!