GAMES101 笔记 Lecture13 光线追踪1
目录
- Why Ray Tracing?(为什么需要光线追踪?)
- Basic Ray Tracing Algorithm(基础的光线追踪算法)
- Ray Casting(光线的投射)
- Generating Eye Rays(生成Eye Rays)
- Recursive(Whitted-Styled) Ray Tracing
- Ray-Surface Intersection(光线和平面的交点)
- Ray Rquation(射线方程)
- Ray Intersection With Sphere(光线和球体求交)
- Ray Intersection With Implicit Surface(光线和隐式曲面求交)
- Ray Intersection With Triangle Mesh(光线和三角网格求交)
- Ray Intersection With Triangle(光线与三角形求交)
- Moller Trumble Algorithm
- Accelerating Ray-Surface Intersection(加速光线和曲面求交)
- Bounding Volumes(包围盒)
- Ray Intersection With Axis-Aligned Box(光线与AABB求交)
- Why Axis-Aligned?
- 参考资料
Why Ray Tracing?(为什么需要光线追踪?)
- 光栅化不能很好地表示全局的效果
- 软阴影
- 光线反弹超过一次(间接光照)
- 光栅化很快,但是质量不高
- 光线追踪是一种准确的方法,但是非常慢
- 光栅化:实时;光线追踪:离线

Basic Ray Tracing Algorithm(基础的光线追踪算法)
关于光线的三个想法:
- 光线是沿直线传播的
- 光线和光线不会发生碰撞
- 光线从光源发射出来后经过传播后到达眼睛。
Ray Casting(光线的投射)
- 从相机出发,生成一张图片通过投射每个像素。
- 将物体每个点连接一条光线到光源,通过计算能量来进行着色。

Generating Eye Rays(生成Eye Rays)
针孔相机模型:
- 从摄像机发出一条光线,打到场景中最近的物体上的某个点上。
- 将该点与光源进行连线,这跟光线称作shadow ray
- 如果这条光线没有被其它物体挡着,我们就认为这个点对光源可见。
- 有了法线,入射方向和出射方向,我们就可以算出这一点的着色(Blinn Phong模型),然后写入像素。

Recursive(Whitted-Styled) Ray Tracing
与上面的模型不同,Whitted光线追踪模型中,一个光线在打到一个物体后可以继续传播,我们只需要知道它的折射方向和反射方向的参数。

在光线传播中遇到的每个点,都和光线连一条光线判断是否能被光源照亮。
如何光源可以照亮某个点,我们就把这个点的着色算出加到像素的最终着色值上去。

Ray-Surface Intersection(光线和平面的交点)
Ray Rquation(射线方程)
一条光线由起点和传播方向就可以定义。
射线方程:
r ( t ) = o + t d , 0 ≤ t < ∞ r(t) = o + td , 0 \leq t \lt \infty r(t)=o+td,0≤t<∞
Ray Intersection With Sphere(光线和球体求交)
球体方程:

其中, p p p是球面上的点, c c c是球心, R R R是半径。
交点一定同时满足光线的射线方程和球体方程。
可以通过求解方程得到交点:

通过二次函数求根公式,得到解:

Ray Intersection With Implicit Surface(光线和隐式曲面求交)
联立光线射线方程和曲面的隐式方程求解即可,注意解需要满足是实数并且是正数。

Ray Intersection With Triangle Mesh(光线和三角网格求交)
需求:
- 渲染:可视性、阴影、光照
- 几何:内部/外部测试,如果一个点在物体内部,那么令该点向四周发射光线,交点数一定是奇数。
如何求交呢?
可以将光线与三角网格中的每个三角形分别求交,最后取 t t t最小的值即可。
十分简单,但是效率非常低。
Ray Intersection With Triangle(光线与三角形求交)
三角形是一个平面,可以首先将光线与该平面求交,然后判断交点是否在三角形内部。
平面方程:
我们可以定义成法线 N N N和一个平面经过的某个点 p ′ p' p′的组合。
平面方程定义如下:

联立光线和平面的方程,求解得到交点:

Moller Trumble Algorithm
这个算法可以一步到位地算出光线是否与三角形求交,主要利用的知识是三角形的重心坐标。

Accelerating Ray-Surface Intersection(加速光线和曲面求交)
Bounding Volumes(包围盒)
包围盒是一个非常快速的方法来避免求交:将一个复杂的物体用一个简单的包围盒包围起来。
- 物体被完全包围在包围盒中。
- 如果光线连包围盒都不相交,那么一定不和物体求交。
- 所以,首先判断是否与包围盒相交,然后再判断是否和物体相交。
包围盒是三个不同的对立面形成的交集:

Ray Intersection With Axis-Aligned Box(光线与AABB求交)
考虑二维情况,三维同理。
分别考虑每一对面,计算出在最近和最远的交点。
t m i n t_{min} tmin取最大值得到 t e n t e r t_{enter} tenter, t m a x t_{max} tmax取最小值得到 t e x i t t_{exit} texit。
关键思想:
只有当光线全部进入所有对立面的时候,才是真正进入包围盒。
只要光线出任意一个对立面时,光线就穿出包围盒了。
如果 t e n t e r < t e x i t t_{enter} < t_{exit} tenter<texit,光线就和包围盒有交点。

考虑两种特殊情况:
- 如果 t e x i t < 0 t_{exit} < 0 texit<0:
包围盒在光源的后面。 - 如果 t e x i t ≥ 0 , t e n t e r < 0 t_{exit} \geq 0, t_{enter} \lt 0 texit≥0,tenter<0:
光源在包围盒的内部。
Why Axis-Aligned?
选择轴对齐的包围盒,可以使得求交点更简单。
参考资料
GAMES101 Lecture13
相关文章:
GAMES101 笔记 Lecture13 光线追踪1
目录 Why Ray Tracing?(为什么需要光线追踪?)Basic Ray Tracing Algorithm(基础的光线追踪算法)Ray Casting(光线的投射)Generating Eye Rays(生成Eye Rays) Recursive(Whitted-Styled) Ray Tracing Ray-Surface Intersection(光线和平面的交点)Ray Rquation(射线方…...
【多模态】21、BARON | 通过引入大量 regions 来提升模型开放词汇目标检测能力
文章目录 一、背景二、方法2.1 主要过程2.2 Forming Bag of Regions2.3 Representing Bag of Regions2.4 Aligning bag of regions 三、效果 论文:Aligning Bag of Regions for Open-Vocabulary Object Detection 代码:https://github.com/wusize/ovdet…...
2023“Java 基础 - 中级 - 高级”面试集结,已奉上我的膝盖
Java 基础(对象线程字符接口变量异常方法) 面向对象和面向过程的区别? Java 语言有哪些特点? 关于 JVM JDK 和 JRE 最详细通俗的解答 Oracle JDK 和 OpenJDK 的对比 Java 和 C的区别? 什么是 Java 程序的主类&…...
开源项目-erp企业资源管理系统(毕设)
哈喽,大家好,今天给大家带来一个开源项目-erp企业资源管理系统,项目通过ssh+oracle技术实现。 系统主要有基础数据,人事管理,采购管理,销售管理,库存管理,权限管理模块 登录 主页 基础数据 基础数据有商品类型,商品,供应商,客户,仓库管理功能...
Leetcode刷题---C语言实现初阶数据结构---单链表
1 删除链表中等于给定值 val 的所有节点 删除链表中等于给定值 val 的所有节点 给你一个链表的头节点head和一个整数val,请你删除链表中所有满足Node.valval的节点,并返回新的头节点 输入:head [1,2,6,3,4,5,6], val 6 输出:[…...
opencv hand openpose
使用opencv c 来调用caffemodel 使用opencv 得dnn 模块调用 caffemodel得程序,图片自己输入就行,不做过多得解释,看代码清单。 定义手指关节点 const int POSE_PAIRS[20][2] { {0,1}, {1,2}, {2,3}, {3,4}, // thumb {0,5}, {5,6}, {6,7}…...
flutter fl_chart 柱状图 柱条数量较多 实现左右滑动 固定y轴
一、引入插件 pub.dev:fl_chart package - All Versions 根据项目版本,安装可适配的 fl_chart 版本 二、官网柱状图示例 github参数配置:(x轴、y轴、边框、柱条数据、tooltip等) https://github.com/imaNNeo/fl_c…...
CAN学习笔记1:计算机网络
计算机网络 1 概述 计算机网络就是把多种形式的计算机用通信线路连接起来,并使其能够互相进行交换的系统。实际上,计算机网络包括了计算机、各种硬件、各种软件、组成网络的体系结构、网络传输介质和网络通信计数。因此,计算机网络是计算机…...
NAND flash的坏块
NAND flash的坏块 1.为什么会出现坏块 由于NAND Flash的工艺不能保证NAND的Memory Array(由NAND cell组成的阵列)在其生命周期中保持性能的可靠(电荷可能由于其他异常原因没有被锁起来。因此,在NAND的生产中及使用过程中会产生坏…...
代码随想录算法训练营第二十五天 | 读PDF复习环节3
读PDF复习环节3 本博客的内容只是做一个大概的记录,整个PDF看下来,内容上是不如代码随想录网站上的文章全面的,并且PDF中有些地方的描述,是很让我疑惑的,在困扰我很久后,无意间发现,其网站上的讲…...
18.Netty源码之ByteBuf 详解
highlight: arduino-light ByteBuf 是 Netty 的数据容器,所有网络通信中字节流的传输都是通过 ByteBuf 完成的。 然而 JDK NIO 包中已经提供了类似的 ByteBuffer 类,为什么 Netty 还要去重复造轮子呢?本节课我会详细地讲解 ByteBuf。 JDK NIO…...
#P0999. [NOIP2008普及组] 排座椅
题目描述 上课的时候总会有一些同学和前后左右的人交头接耳,这是令小学班主任十分头疼的一件事情。不过,班主任小雪发现了一些有趣的现象,当同学们的座次确定下来之后,只有有限的 DD 对同学上课时会交头接耳。 同学们在教室中坐…...
Sentinel 容灾中心的使用
Sentinel 容灾中心的使用 往期文章 Nacos环境搭建Nacos注册中心的使用Nacos配置中心的使用 熔断/限流结果 Jar 生产者 spring-cloud-alibaba:2021.0.4.0 spring-boot:2.6.8 spring-cloud-loadbalancer:3.1.3 sentinel:2021.0…...
深度学习中简易FC和CNN搭建
TensorFlow是由谷歌开发的PyTorch是由Facebook人工智能研究院(Facebook AI Research)开发的 Torch和cuda版本的对应,手动安装较好 全连接FC(Batch*Num) 搭建建议网络: from torch import nnclass Mnist_NN(nn.Module):def __i…...
【多模态】20、OVR-CNN | 使用 caption 来实现开放词汇目标检测
文章目录 一、背景二、方法2.1 学习 视觉-语义 空间2.2 学习开放词汇目标检测 三、效果 论文:Open-Vocabulary Object Detection Using Captions 代码:https://github.com/alirezazareian/ovr-cnn 出处:CVPR2021 Oral 一、背景 目标检测数…...
网络编程 IO多路复用 [select版] (TCP网络聊天室)
//head.h 头文件 //TcpGrpSer.c 服务器端 //TcpGrpUsr.c 客户端 select函数 功能:阻塞函数,让内核去监测集合中的文件描述符是否准备就绪,若准备就绪则解除阻塞。 原型: #include <sys/select.…...
数学建模学习(7):单目标和多目标规划
优化问题描述 优化 优化算法是指在满足一定条件下,在众多方案中或者参数中最优方案,或者参数值,以使得某个或者多个功能指标达到最优,或使得系统的某些性能指标达到最大值或者最小值 线性规划 线性规划是指目标函数和约束都是线性的情况 [x,fval]linprog(f,A,b,Aeq,Beq,LB,U…...
Element UI如何自定义样式
简介 Element UI是一套非常完善的前端组件库,但是如何个性化定制其中的组件样式呢?今天我们就来聊一聊这个 举例 就拿最常见的按钮el-button来举例,一般来说默认是蓝底白字。效果图如下 可是我们想个性化定制,让他成为粉底红字应…...
protobuf入门实践2
如何在proto中定义一个rpc服务? syntax "proto3"; //声明protobuf的版本package fixbug; //声明了代码所在的包 (对于C来说就是namespace)//下面的选项,表示生成service服务类和rpc方法描述, 默认是不生成的 option cc_generi…...
adb shell使用总结
文章目录 日志记录系统概览adb 使用方式 adb命令日志过滤按照告警等级进行过滤按照tag进行过滤根据告警等级和tag进行联合过滤屏蔽系统和其他App干扰,仅仅关注App自身日志 查看“当前页面”Activity文件传输截屏和录屏安装、卸载App启动activity其他 日志记录系统概…...
DNMSI2C轻量级声级计驱动库:IEC标准SPL数据采集
1. 项目概述DNMSI2C 是一款专为 DNMS Teensy 声音传感器模块设计的轻量级 IC 驱动库,面向嵌入式音频监测场景提供标准化、低开销的声压级(SPL)数据采集能力。该库不依赖浮点运算或动态内存分配,完全适配资源受限的微控制器平台&am…...
GLM-4.1V-9B-Base实战教程:跨境电商A+页面图像卖点自动提炼
GLM-4.1V-9B-Base实战教程:跨境电商A页面图像卖点自动提炼 1. 为什么需要自动提炼图像卖点 跨境电商卖家每天需要处理大量商品图片,传统人工标注方式存在三个痛点: 效率低下:一个运营人员每天最多处理50-100张图片成本高昂&…...
量子计算入门捷径:在快马平台用qorder实现第一个纠缠态实验
量子计算听起来很高深,但有了合适的工具和平台,入门其实比想象中简单。最近我在InsCode(快马)平台上尝试用qorder框架做了第一个量子纠缠实验,发现整个过程就像搭积木一样直观。下面分享我的学习笔记,希望能帮到同样想入门的朋友。…...
实战应用:基于快马平台从零到一构建功能完备的openclaw101风格项目平台
今天想和大家分享一个实战经验:如何从零开始构建一个功能完备的开源项目托管平台。类似openclaw101这样的网站,其实用现代开发工具和云平台可以快速实现。下面我就把整个搭建过程拆解成几个关键环节,希望能给想做类似项目的朋友一些参考。 项…...
如何彻底解决消息撤回难题?RevokeMsgPatcher带来的革新方案
如何彻底解决消息撤回难题?RevokeMsgPatcher带来的革新方案 【免费下载链接】RevokeMsgPatcher :trollface: A hex editor for WeChat/QQ/TIM - PC版微信/QQ/TIM防撤回补丁(我已经看到了,撤回也没用了) 项目地址: https://gitco…...
2026年知网AIGC检测卡在20%降不下去怎么办?这3招解决
直接说方案,不绕弯子。知网AIGC检测不通过、降AIGC率、降AI这个问题,核心是找准降不下去的原因,再用对工具。 我花了一个月测出来的结论:用嘎嘎降AI(www.aigcleaner.com) 全文上传,基本能解决大…...
SEO和SEM对于中小企业的意义是什么_SEO 和 SEM 的报告指标有哪些
SEO和SEM对于中小企业的意义是什么 在当今的数字化时代,中小企业如何在竞争激烈的市场中脱颖而出,已成为每一个企业家关注的焦点。搜索引擎优化(SEO)和搜索引擎营销(SEM)作为两种重要的数字营销手段&#…...
音乐留学路上,这些坑我替你踩过了|纯干货分享
写给正在准备或即将踏上音乐留学之路的你嘿,准备音乐留学的你。我知道你现在可能既兴奋又焦虑,手里攥着梦想,却不知道下一步该往哪走。别慌,作为过来人,我想跟你聊点实在的。"音乐留学不是终点,而是你…...
如何3步掌握Home Assistant SSH Web终端:从零到精通的管理指南 ✨
如何3步掌握Home Assistant SSH Web终端:从零到精通的管理指南 ✨ 【免费下载链接】app-ssh Advanced SSH & Web Terminal - Home Assistant Community Apps 项目地址: https://gitcode.com/gh_mirrors/ad/app-ssh 在智能家居系统的日常维护中࿰…...
面相对象高级(static)
##静态(static)1.static修饰成员变量:类变量:有static修饰,属于类,在计算机里只有一份,会被类的全部对象共享因为属于类,需要通过类名就可以调用:类名.静态变量##### 实际…...
