GAMES101 笔记 Lecture13 光线追踪1

news2024/11/15 21:34:02

目录

      • 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(基础的光线追踪算法)

关于光线的三个想法:

  1. 光线是沿直线传播的
  2. 光线和光线不会发生碰撞
  3. 光线从光源发射出来后经过传播后到达眼睛。

Ray Casting(光线的投射)

  1. 从相机出发,生成一张图片通过投射每个像素。
  2. 将物体每个点连接一条光线到光源,通过计算能量来进行着色。

在这里插入图片描述

Generating Eye Rays(生成Eye Rays)

针孔相机模型:

  1. 从摄像机发出一条光线,打到场景中最近的物体上的某个点上。
  2. 将该点与光源进行连线,这跟光线称作shadow ray
  3. 如果这条光线没有被其它物体挡着,我们就认为这个点对光源可见。
  4. 有了法线,入射方向和出射方向,我们就可以算出这一点的着色(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,0t<

Ray Intersection With Sphere(光线和球体求交)

球体方程:

在这里插入图片描述

其中, p p p是球面上的点, c c c是球心, R R R是半径。

交点一定同时满足光线的射线方程和球体方程。

可以通过求解方程得到交点:

在这里插入图片描述
通过二次函数求根公式,得到解:

在这里插入图片描述

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

联立光线射线方程和曲面的隐式方程求解即可,注意解需要满足是实数并且是正数。

在这里插入图片描述

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

需求:

  1. 渲染:可视性、阴影、光照
  2. 几何:内部/外部测试,如果一个点在物体内部,那么令该点向四周发射光线,交点数一定是奇数。

如何求交呢?

可以将光线与三角网格中的每个三角形分别求交,最后取 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 texit0tenter<0
    光源在包围盒的内部。
Why Axis-Aligned?

选择轴对齐的包围盒,可以使得求交点更简单。

参考资料

GAMES101 Lecture13

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

盘点:查快递教程

在“寄快递”成为常态的当下&#xff0c;如何快速进行物流信息查询&#xff0c;是收寄人所关心的问题。在回答这个问题之前&#xff0c;首先我们要知道&#xff0c;物流信息查询&#xff0c;有哪些方法&#xff1f; 1、官网单号查询 知道物流公司和单号的情况下&#xff0c;直…

管理类联考——写作——论说文——实战篇——标题篇

角度3——4种材料类型、4个立意对象、5种写作态度 经过审题立意后&#xff0c;我们要根据我们的立意&#xff0c;确定一个主题&#xff0c;这个主题必须通过文章的标题直接表达出来。 标题的基本要求 主题清晰&#xff0c;态度明确 第一&#xff0c;阅卷人看到一篇论说文的标…

【动态规划part13】| 300.最长递增子序列、674.最长连续递增序列、718.最长重复数组

目录 &#x1f388;LeetCode 300.最长递增子序列 &#x1f388;LeetCode 674. 最长连续递增序列 &#x1f388;LeetCode 718. 最长重复子数组 &#x1f388;LeetCode 300.最长递增子序列 链接&#xff1a;300.最长递增子序列 给你一个整数数组 nums &#xff0c;找到其…

camund——2、cancelActivityInstance()与多实例下getActiveActivityIds()获取不到当前任务的节点。

在多实例&#xff08;会签或者并行网关&#xff09;时如果使用以下代码来进行驳回时&#xff0c;使用 **List activeActivityIds runtimeService.getActiveActivityIds(instanceId);**来获取当前活动的节点会出现获取不到情况。 runtimeService.createProcessInstanceModific…

基于Linux操作系统中的MySQL用户权限管理(三十二)

用户权限管理 目录 一、概述 二、用户权限类型 1、ALL PRIVILEGES 2、CREATE 3、DROP 4、SELECT 5、INSERT 6、UPDATE 7、DELETE 8、INDEX 9、ALTER 10、CREATE VIEW和CREATE ROUTINE 11、SHUTDOWN 12、GRANT OPTION 三、用户赋权 四、权限删除 五、用户删除 …

RTThread实际开发问题统计

文章目录 开启DMA rx中断&#xff0c;数据帧总是接收不全就产生中断&#xff1f;PB3/PB4等和JTAG复用的管脚不能使用&#xff1f;uart使用DMA传输&#xff0c;调用close再open之后就接收不到数据了&#xff1f; 开启DMA rx中断&#xff0c;数据帧总是接收不全就产生中断&#x…

C语言指针应该这么学?

数组名的意义&#xff1a; 1. sizeof(数组名)&#xff0c;这里的数组名表示整个数组&#xff0c;计算的是整个数组的大小。 2. &数组名&#xff0c;这里的数组名表示整个数组&#xff0c;取出的是整个数组的地址。 3. 除此之外所有的数组名都表示首元素的地址。 根据以上数…

[CrackMe]Cruehead.1.exe的逆向及注册机编写

1. 逆向分析过程 作者弄了很多个对话框来迷惑破解者, 然后真正有用的对话框只有这个 这个窗口过程函数处理的是父窗口 其他的不关心, 只关心WM_COMMAND消息 里面有3个分支, 其中最重要的是按下register按钮的那个 整个逻辑非常清晰, 其算法是把name的每个字符转成大写字母…

测试测试用例设计常见面试题

测试|测试用例设计常见面试题 文章目录 测试|测试用例设计常见面试题1.怎么模拟弱网&#xff08;测试技巧&#xff09;2.怎么测试接口&#xff08;测试技巧&#xff09;3.怎么对冒泡排序测试&#xff08;代码类&#xff09;4.怎么对linux的zip命令进行测试&#xff08;软件类&a…

Spring Boot项目的创建

hi 大家好,又见面了,今天继续讲解Spring Boot 文章目录 &#x1f436;1.什么是Spring Boot?&#x1f436;2.Spring Boot的优势&#x1f436;3.Spring Boot项目创建&#x1f33c;3.1使用ieda创建&#x1f95d;3.1.1下载插件Spring Boot Helper&#x1f95d;3.1.2创建项目 &…

基于ThreadPoolExecutor实现动态线程池

项目上&#xff0c;我们是根据业务的使用频率&#xff0c;基于ThreadPoolExecutor自定义一个线程池&#xff0c;线程池的核心线程数、最大线程数、阻塞队列的容量都是估计的设置的&#xff0c;但是不知道线程资源的真正使用情况。 1.ThreadPoolExecutor配置参数动态修改 先来…

Linux Day04

目录 一、文件压缩与解压命令 1.1 tar cvf 文件名 ---打包命令生成.tar 1.2 tar xvf 文件名 ----解开包 生成文件 1.3 gzip .tar 压缩 生成.tar.gz压缩包 1.4 gzip -d .tar.gz 解压成包 1.5 直接把压缩包解压成文件 tar zxf .tar.gz 二、Linux 系统上 C 程序的…

Python实现自动登录和下单脚本,代码嘚魅力~

目录标题 前言环境使用:代码实现思路配置浏览器驱动代码实现尾语 前言 嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! 学python对selenium应该不陌生吧 Selenium 是最广泛使用的开源 Web UI&#xff08;用户界面&#xff09;自动化测试套件之一。 Selenium 支持的语言包括C#…

Winget简单介绍

为什么明明Windows的UI更为便捷&#xff0c;但是还是那么多人用的linux&#xff0c;或者mac 主要还是linux和mac的命令行更好用。 虽然windows中也出现了choco这种东西&#xff0c;但是非官方的总觉得不是很令人信服。 这边挂一下官方文档&#xff0c;然后在开始自己的简单实…

深入理解Vue响应式系统:数据绑定探索

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

某某大学某学院后台Phar反序列化GetShell

觉得这个洞还算有点意思&#xff0c;可以记录一下 首先在另一个二级学院进行目录扫描时发现源码www.rar&#xff0c;并且通过一些页面测试推测这两个二级学院应该是使用了同一套CMS 分析源码&#xff0c;发现使用的是ThinkPHP 5.1.34 LTS框架 通过APP、Public得到后台访问路径…

开放自动化软件的硬件平台

自动化行业的产品主要以嵌入式系统为主&#xff0c;历来对产品硬件的可靠性和性能都提出很高的要求。最典型的产品要数PLC。PLC 要求满足体积小&#xff0c;实时性&#xff0c;可靠性&#xff0c;可扩展性强&#xff0c;环境要求高等特点。它们通常采用工业级高性能嵌入式SoC 实…

无涯教程-jQuery - Selectable选择函数

选择能力功能可与JqueryUI中的交互一起使用。此功能可在任何DOM元素上启用选择能力功能。用光标绘制一个框以选择项目。按住Ctrl键可进行多个不相邻的选择。 Select able - 语法 $( "#selectable" ).selectable(); Select able - 示例 以下是一个简单的示例&…

反弹shell确认是否是docker容器

反弹shell确认是否是docker容器 方法一 如果根目录中存在.dockerwenv文件&#xff0c;证明是doker容器 ls /.dockerenv方法二 出现以下类似内容&#xff0c;证明是在doker容器内 cat /proc/1/cgroup

回归预测 | MATLAB实现GRNN广义回归神经网络多输入单输出回归预测(多指标,多图)

回归预测 | MATLAB实现GRNN广义回归神经网络多输入单输出回归预测(多指标,多图) 目录 回归预测 | MATLAB实现GRNN广义回归神经网络多输入单输出回归预测(多指标,多图)效果一览基本介绍程序设计参考资料效果一览 基本介绍 MATLAB实现GRNN广义回归神经网络多输入单输出回归…