图形学笔记 - 5. 光线追踪 - RayTracing

news2024/12/14 16:08:16

Whitted-Style Ray tracing

为什么要光线追踪

  • 光栅化不能很好地处理全局效果

    • 软阴影
    • 尤其是当光线反射不止一次的时候
      ![[Pasted image 20241213175934.png]]
  • 栅格化速度很快,但质量相对较低

  • 光线追踪是准确的,但速度很慢

    • 光栅化:实时,光线追踪:离线
    • ~10K CPU核心小时来渲染一帧

基本光线追踪算法

光线

关于光线的三个观点:

  • 光沿直线传播(虽然这是错误的)
  • 光线交叉时不会相互“碰撞” (尽管这仍然是错误的)
  • 光线从光源传播到眼睛(但物理在路径反转-互易下是不变的)。
    “And if you gaze long into an abyss, the abyss also gazes into you.” — Friedrich Wilhelm Nietzsche (translated)

视觉发射理论

光线追踪

Appel 1968 -光线追踪

  • 通过每个像素投射一条光线来生成图像
  • 通过向光源发送光线来检查阴影
    在这里插入图片描述
产生眼睛射线

针孔相机模型
在这里插入图片描述

阴影像素(仅限局部)

在这里插入图片描述

从观察点往成像平面的每个像素位置投射光线,再从投射光线与场景物体的交点向光源位置投射光线判断交点是否在阴影里。

递归(Whitted-Style)光线追踪

“An improved Illumination model for shaded display” T. Whitted, CACM 1980
Time:

  • VAX 11/780 (1979) 74m
  • PC (2006) 6s
  • GPU (2012) 1/30s
    在这里插入图片描述
    一个递归的Ray Casting 方法,在Ray Casting假设的基础上考虑光线进一步的反射与折射。在每一个交点出都考虑光源的阴影着色,最后将这些点的着色累加作为该像素位置的成像结果。
    在这里插入图片描述

光线-表面交点

光线方程
光线由它的原点和方向向量定义
在这里插入图片描述
r ( t ) = o + t d , t ≥ 0 r(t)=o+td,t\ge0 r(t)=o+td,t0

射线与球面相交

光线: r ( t ) = o + t d , t ≥ 0 \mathbf{r}(t)=\mathbf{o}+t\mathbf{d},t\ge0 r(t)=o+td,t0
球: p : ( p − c ) 2 − R 2 = 0 \mathbf{p}:(\mathbf{p}-\mathbf{c})^2-R^2=0 p:(pc)2R2=0
![[Pasted image 20241213200501.png]]

什么是交点?
交点p必须同时满足射线方程和球方程
求交点:
( o + t d − c ) 2 − R 2 = 0 (\mathbf{o}+t\mathbf{d}-\mathbf{c})^2-R^2=0 (o+tdc)2R2=0
a t 2 + b t + c = 0 at^2+bt+c=0 at2+bt+c=0
a = d ⋅ d a=\mathbf{d}\cdot\mathbf{d} a=dd
b = 2 ( o − c ) ⋅ d b=2(\mathbf{o}-\mathbf{c})\cdot \mathbf{d} b=2(oc)d
c = ( o − c ) ⋅ ( o − c ) − R 2 c=(\mathbf{o}-\mathbf{c})\cdot(\mathbf{o}-\mathbf{c})-R^2 c=(oc)(oc)R2
t = − b ± b 2 − 4 a c 2 a t = \frac{-b\pm \sqrt{b^2-4ac}}{2a} t=2ab±b24ac

与隐式曲面的射线相交

一般隐式表面: p : f ( p ) = 0 \mathbf{p}:f(\mathbf{p})=0 p:f(p)=0
求解: f ( o + t d ) = 0 f(\mathbf{o}+t\mathbf{d})=0 f(o+td)=0
求解正实数
在这里插入图片描述

与三角形网格的光线相交

为什么?

  • 渲染:可见性,阴影,照明
  • 几何:内/外测试
    如何计算?
    让我们来分析一下:
  • 简单的想法:让射线与每个三角形相交
  • 简单,但慢(加速?)
  • 注:可以有0、1个交集(忽略多个路口)
    三角形在平面上
  • 光线平面交点
  • 测试命中点是否在三角形内
    许多优化方法…
平面方程

平面由法向量和平面上的一个点定义
在这里插入图片描述

平面方程(若p满足,则p在平面上):
p : ( p − p ′ ) ⋅ N = 0 \mathbf{p}:(\mathbf{p}-\mathbf{p'})\cdot \mathbf{N}=0 p:(pp)N=0
a x + b y + c z + d = 0 ax+by+cz+d=0 ax+by+cz+d=0
带入射线求解:
( o + t d − p ′ ) ⋅ N = 0 (\mathbf{o}+t\mathbf{d}-\mathbf{p'})\cdot\mathbf{N}=0 (o+tdp)N=0
t = ( p ′ − o ) ⋅ N d ⋅ N t=\frac{(\mathbf{p}'-\mathbf{o})\cdot\mathbf{N}}{\mathbf{d}\cdot\mathbf{N}} t=dN(po)N
检测 t ≥ 0 t\ge0 t0

Möller Trumbore算法

能不能一步到位?计算交点并判断是否在三角形内
O + t D = ( 1 − b 1 − b 2 ) P 0 + b 1 P 1 + b 2 P 2 \mathbf{O}+t\mathbf{D}=(1-b_1-b_2)\mathbf{P}_0 + b_1\mathbf{P}_1+b_2\mathbf{P}_2 O+tD=(1b1b2)P0+b1P1+b2P2
等式左边式射线,右边是三角形
三个未知数。
[ t b 1 b 2 ] = 1 S 1 ⋅ E 1 [ S 2 ⋅ E 2 S 1 ⋅ S S 2 ⋅ D ] \begin{bmatrix} t\\ b_1\\ b_2 \end{bmatrix}=\frac{1}{\mathbf{S_1}\cdot{}\mathbf{E_1}}\begin{bmatrix} \mathbf{S_2}\cdot\mathbf{E_2}\\ \mathbf{S_1}\cdot\mathbf{S}\\ \mathbf{S_2}\cdot\mathbf{D} \end{bmatrix} tb1b2 =S1E11 S2E2S1SS2D
其中
E 1 = P 1 − P 0 \mathbf{E_1}=\mathbf{P}_1-\mathbf{P}_0 E1=P1P0
E 2 = P 2 − P 0 \mathbf{E_2}=\mathbf{P}_2-\mathbf{P}_0 E2=P2P0
S = O − P 0 \mathbf{S}=\mathbf{O}-\mathbf{P}_0 S=OP0
S 1 = D × E 2 \mathbf{S_1}=\mathbf{D}\times\mathbf{E}_2 S1=D×E2
S 2 = S × E 1 \mathbf{S_2}=\mathbf{S}\times\mathbf{E}_1 S2=S×E1
代价:1次除法,27次乘法,17次加法

光线表面求交加速

简单的光线-场景交集

  • 详尽地测试与每个三角形的射线相交
  • 找到最接近的命中点(即最小t)
    问题:
  • 朴素算法=#像素 * # 三角形 * # 弹射数
  • 非常慢
    为了通用性,我们在后面使用术语“对象”而不是“三角形”(但不一定是指整个对象)。
Bounding Volumes 包围体积

避免交叉的快速方法:用简单的体积绑定复杂的对象

  • 对象被完全包含在卷中
  • 如果没有碰到体积,就不会碰到物体
  • 所以先测试BVol,然后测试对象是否命中
    在这里插入图片描述
光线与盒子的交点

理解:盒子是3对平板的交点
具体地:
我们经常使用Axis-Aligned Bounding Box(AABB)轴对⻬包围盒
任意一条边都沿着x, y或z轴

射线与轴对齐框的交点

二维例子;3D也是一样!计算与平板的交点并取 t m i n / t m a x t_{min}/t_{max} tmin/tmax间隔的交点
在这里插入图片描述
我们怎么知道什么时候射线与盒子相交
Key ideas:

  • 光线只有在进入所有对平板时才能进入盒子
  • 射线离开盒子的时间和离开任何一对平板的时间一样长
    对于每一对,计算tmin和tmax(负数也可以)
    对于3D框, t e n t e r t_{enter} tenter = max ⁡ t m i n \max{t_{min}} maxtmin, t e x i t t_{exit} texit = min ⁡ t m a x \min{t_{max}} mintmax
    如果 t e n t e r < t e x i t t_{enter} < t_{exit} tenter<texit,我们知道射线在盒子里停留了一段时间(所以它们一定是相交的!)
    然而,射线不是一条直线
  • 应该检查t是否为负以保证物理正确性!
    如果 t e x i t < 0 t_{exit}<0 texit<0
  • 盒子在光线的“后面”——没有交集!
    如果 t e x i t ≥ 0 t_{exit}\ge0 texit0 t e n t e r < 0 t_{enter}<0 tenter<0
  • 射线的原点在框内,有交点
    总之,射线与AABB相交当且仅当:
  • t e n t e r < t e x i t 且 t e x i t ≥ 0 t_{enter}<t_{exit}且 t_{exit}\ge0 tenter<texittexit0
    为什么要轴对称?
    点与面的交点:
    t = ( p ′ − o ) ⋅ N d ⋅ N t=\frac{(\mathbf{p}'-\mathbf{o})\cdot\mathbf{N}}{\mathbf{d}\cdot\mathbf{N}} t=dN(po)N
    3个减法,6个乘法,1个除法
    垂直于x轴的平面:
    t = p x ′ − o x d x t=\frac{p_x'-o_x}{d_x} t=dxpxox
    一个减法一个除法

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

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

相关文章

Nginx之配置防盗链(Configuring Anti-hotlinking in Nginx)

运维小白入门——Nginx配置防盗 什么是防盗链&#xff1a; 防盗链技术主要用于防止未经授权的第三方或域名访问网站的静态资源。例如&#xff0c;一个网站可能拥有独特的图片素材&#xff0c;为了防止其他网站通过直接链接图片URL的方式访问这些图片&#xff0c;网站管理员会采…

51c大模型~合集89

我自己的原文哦~ https://blog.51cto.com/whaosoft/12815167 #OpenAI很会营销 而号称超强AI营销的灵感岛实测成效如何&#xff1f; OpenAI 是懂营销的&#xff0c;连续 12 天发布&#xff0c;每天一个新花样&#xff0c;如今刚过一半&#xff0c;热度依旧不减。 毫无疑问&…

深度学习的unfold操作

unfold&#xff08;展开&#xff09;是深度学习框架中常见的数据操作。与我们熟悉的卷积类似&#xff0c;unfold也是使用一个特定大小的窗口和步长自左至右、自上至下滑动&#xff0c;不同的是&#xff0c;卷积是滑动后与核求乘积&#xff08;所以取名为卷积&#xff09;&#…

Jetpack Compose赋能:以速破局,高效打造非凡应用

Android Compose 是谷歌推出的一种现代化 UI 框架&#xff0c;基于 Kotlin 编程语言&#xff0c;旨在简化和加速 Android 应用开发。它以声明式编程为核心&#xff0c;与传统的 View 系统相比&#xff0c;Compose 提供了更直观、更简洁的开发体验。以下是对 Android Compose 的…

Dual-Write Problem 双写问题(微服务)

原文链接https://www.confluent.io/blog/dual-write-problem/ 双写问题发生于当两个外部系统必须以原子的方式更新时。 问题 说有人到银行存了一笔钱&#xff0c;触发 DepositFunds 命令&#xff0c;DepositFunds 命令被发送到Account microservice。 Account microservice需…

桥接模式的理解和实践

桥接模式&#xff08;Bridge Pattern&#xff09;&#xff0c;又称桥梁模式&#xff0c;是一种结构型设计模式。它的核心思想是将抽象部分与实现部分分离&#xff0c;使它们可以独立地进行变化&#xff0c;从而提高系统的灵活性和可扩展性。本文将详细介绍桥接模式的概念、原理…

kubeadm安装K8s集群之高可用组件keepalived+nginx及kubeadm部署

系列文章目录 1.kubeadm安装K8s集群之基础环境配置 2.kubeadm安装K8s集群之高可用组件keepalivednginx及kubeadm部署 3.kubeadm安装K8s集群之master节点加入 4.kubeadm安装K8s集群之worker1节点加入 kubeadm安装K8s集群之高可用组件keepalivednginx及kubeadm部署 1.安装kubeadm…

Avalonia实战实例三:实现可输入框的ComboBox控件

文章目录 一、Avalonia中的ComboBox控件二、更改Template&#xff0c;并添加水印 接着上篇关闭按钮实现登录界面 实现一个可输入&#xff0c;可下拉的用户名输入框 一、Avalonia中的ComboBox控件 Avalonia中Fluent主题里ComboBox实现&#xff1a; <ControlTheme x:Key&q…

TMS320C55x DSP芯片结构和CPU外围电路

第2章 DSP芯片结构和CPU外围电路 文章目录 第2章 DSP芯片结构和CPU外围电路TMS320C55x处理器的特点TMS320c55x CPU单元指令缓冲(Instruction Buffer Unit) I单元程序流程(Program Flow Unit) P单元地址数据(Address-data Flow Unit) A单元数据计算(Data Computation Unit) D单元…

Oracle 与 达梦 数据库 对比

当尝试安装了达梦数据库后&#xff0c;发现达梦真的和Oracle数据库太像了&#xff0c;甚至很多语法都相同。 比如&#xff1a;Oracle登录数据库采用sqlplus&#xff0c;达梦采用disql。 比如查看数据视图&#xff1a;达梦和Oracle都有 v$instance、v$database、dba_users等&a…

数据结构之五:排序

void*类型的实现&#xff1a;排序&#xff08;void*类型&#xff09;-CSDN博客 一、插入排序 1、直接插入排序 思想&#xff1a;把待排序的数据逐个插入到一个已经排好序的有序序列中&#xff0c;直到所有的记录插入完为止&#xff0c;得到一个新的有序序列 。 单趟&#x…

JavaWeb:JavaScript

学习 资源1 学习资源 2 黑马javaweb 1、引入方式 内部脚本&#xff1a; <script>内容</script> 外部脚本&#xff1a; <script src"js/test.js"></script> 2、基础语法 注释&#xff1a;// /* */ 结尾分号可有可无 大括号表示代码块 …

MySQL其五,索引详解,逻辑架构,SQL优化等概念

目录 一、索引 1、索引的概念 2、索引的优缺点 3、添加索引的原则 4、索引的分类 5、索引如何使用 6、存储过程讲解 7、测试索引的效率 7、索引的数据结构 8、覆盖索引&#xff08;SQL优化的点&#xff09; 9、最佳左前缀法则&#xff08;SQL优化的点&#xff09; 二…

考研数学【线性代数基础box(数二)】

本文是对数学二线性代数基础进行总结&#xff0c;一些及极其简单的被省略了&#xff0c;代数的概念稀碎&#xff0c;不如高数关联性高&#xff0c;所以本文仅供参考&#xff0c;做题请从中筛选&#xff01; 本文为初稿&#xff0c;后面会根据刷题和自己的理解继续更新 第一章…

全面解析租赁小程序的功能与优势

内容概要 租赁小程序正在逐渐改变人与物之间的互动方式。通过这些小程序&#xff0c;用户不仅可以轻松找到所需的租赁商品&#xff0c;还能够享受无缝的操作体验。为了给大家一个清晰的了解&#xff0c;下面我们将重点介绍几个核心功能。 建议&#xff1a;在选择租赁小程序时&…

Linux DNS 协议概述

1. DNS 概述 互联网中&#xff0c;一台计算机与其他计算机通信时&#xff0c;通过 IP 地址唯一的标志自己。此时的 IP 地址就类似于我们日常生活中的电话号码。但是&#xff0c;这种纯数字的标识是比较难记忆的&#xff0c;而且数量也比较庞大。例如&#xff0c;每个 IPv4 地址…

Java使用ORM Bee自动生成Javabean.

Java使用ORM Bee自动生成Javabean. 配置数据库连接,添加了pom.xml依赖后,就可以写Java代码,自动生成Javabean了. 可参考:https://gitee.com/automvc/bee https://github.com/automvc/bee 还可以生成字段文件, 这样可以避免硬编码引用字段,速度也比反射快. package org.tea…

【MySQL中多表查询和函数】

目录 1.多表查询 1.1 外键 1.2 链接查询 2.MySQL函数 内置函数简介 数值函数 字符串函数 时间日期函数 条件判断操作 开窗函数 1.多表查询 本质&#xff1a;把多个表通过主外键关联关系链接&#xff08;join&#xff09;合并成一个大表&#xff0c;在去单表查询操作…

二维码数据集,使用yolov,voc,coco标注,3044张各种二维码原始图片(未图像增强)

二维码数据集&#xff0c;使用yolov&#xff0c;voc&#xff0c;coco标注&#xff0c;3044张各种二维码原始图片&#xff08;未图像增强&#xff09; 数据集分割 训练组70&#xff05; 2132图片 有效集20&#xff05; 607图片 测试集10&#xff05; 305图…

MySQL多表查询时有哪些连接方式?

大家好&#xff0c;我是锋哥。今天分享关于【MySQL多表查询时有哪些连接方式?】面试题。希望对大家有帮助&#xff1b; MySQL多表查询时有哪些连接方式? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在 MySQL 中进行多表查询时&#xff0c;常见的连接方式有以下…