11.光线追踪

news2024/11/29 16:40:40

1.为什么要引入光线追踪

光栅化阶段有些全局效果做的并不好,首先不太好做软阴影,然后是类镜面反射,表面很光滑但是又达不到镜面反射那么光滑,光线反射到这类物体上之后会经过好几次反射,其次是间接光照,光照从窗户中照射进来,会经历过很多次反射,这些在光栅化的时候都不好做

2.光栅化和光追的区别

① 光栅化:fast,但是质量不好

    光追: accurate(准确), but is very slow

②光栅化:real-time

    光追:offline

光线追踪是一个质量非常高的方法,是完完全全符合物理规律的,这也是我们必须学习它的一个重要原因

3.Basic Ray-Tracing Algorithm

3.1.定义光线

(1)沿直线传播

(2)光线与光线间不会碰撞

(3)光线肯定从光源发出,进入场景不断弹射,最后进入人眼

//光线追踪用了光线的一个性质-reversal - reciprocity 光线的可逆性:可以理解为,光从光源发出不断弹射,最后进入人眼,也可以eyes可以发出一些感知的光线,打到物体上,最后打到光源(逆过程)。

3.2.Ray Casting 光线投射

成像平面划为不同的pixel/格子,对于每一个pixel,从camera连一条线,穿过这个piexl,打出一根光线,一定会打到场景中的某个位置/或者和什么都不相交。

如果和某个物体相交,就是说沿着这个方向看,看到了哪儿,再与光源做连线(判断是否在shadow中),不在的话也就是光源可以看到这个点→就形成了一条有效的光路(光源→点→eyes)。接着就可以对这个点进行着色计算

这里假设人眼是一个针孔相机,也就是一个点,光源是一个点光源,场景中的物体,光线打到后会发生完美的反射/折射

3.3.Recursive (Whitted-Style) Ray Tracing

前面的场景中光线只弹射了一次,但实际上光线可以在场景中弹射多次,Recursive (Whitted-Style) Ray Tracing实现了这种情况,采用了递归的思想。

①在任意一点可以继续传播,只需要正确的计算折射,反射的方向,当然要考虑到光照能量的衰减

②着色也会影响,每个弹射点都会计算着色(连到光源),所有着色都加到pixel中

4.光线与表面交点的计算

4.1.定义光射线

o是光源的位置,d是光线射出的方向,t可以认为是时间

4.2.求光和球的交点

交点必然同时满足两个方程,联立方程组就可以解出

4.3.和隐式表面的交点

可以类比和球的交点,原理差不多

t需满足:①是实数 ② 是正的

4.4.和显式表面(一个重要的:三角形)的交点

通过光线与三角形求交,我们还可以判断光源在网格内还是外:从光源出发一条射线,如果能穿过网格两次,那么它一定在网格外,而如果只穿过一次,那就说明它在网格内,当然前提是网格是封闭的。(不是很懂)

4.4.1.一般求解算法

首先,三角形一定在一个平面内,因为三个点确定一个平面。于是人们想到了一种方法,先做光线与平面求交,得到交点之后再判断交点在不在三角形内。而点在三角形内的判断我们之前光栅化那篇已经讲过了。(通过叉乘计算)

平面通过平面法线和平面上一点可以确定,交点必定同时满足光线和平面的公式,联立方程解出来t之后判断是否在三角形内

4.4.2Möller Trumbore算法

Möller Trumbore算法是一种更为快速的计算光线与三角形求交的算法,它没有分为两个步骤,而是直接计算光线是否与三角形有交点。这个算法用到了重心坐标,也就是说把三角形面上的点用重心坐标表示然后和光线方程联立求解,而每个坐标恰好又是三个分量x,y,z,我们需要求解的也是三个未知量t,b1,b2,三个分量分别可以构建出一个方程,三个未知量三个方程组,我们用克莱姆法则很容易求解。而求解得出的t,同样需要大于0,那么如何判断求出的点是否在三角形内呢?我们前面讲重心坐标的时候讲到过,如果一个点在三角形内,那么它重心坐标下的三个分量都应该非负,也就是说b1,b2,1-b1-b2这三个量要≥0。

4.5.光线和表面求交的加速

4.5.1Bounding Volumes(包围盒/体积)

  • 包围盒:一个物体可以用简单的形状包围起来,保证这个物体一定在这个简单的形状中。
  • 一个重要逻辑:如果光线连包围盒都碰不到,就更不可能碰到物体。

4.5.2对于3D物体最常用的包围盒:长方体

长方体可以理解成三个不同的对面(pair of slabs)形成的交集

在实际情况中我们经常用到的是轴对齐包围盒,意思就是说这个包围盒的6个面都是和三维空间的坐标轴对齐的,它们分别和XOY,YOZ,XOZ平面平行。这样做的目的是方便后面的计算。

4.5.3二维情况举例

用光线o+td先和包围盒的与y轴平行的x0和x1面求交,我们可以得到光线进入到达x0的时间tmin,从x1出去的时间tmax,同样的我们对y0,y1两个面做同样的运算也可以得到两个t值,那么光线在包围盒中的是那一段呢?显然我们对左,中两幅图求交就是最右面的图,也就是光线进入包围盒和出去包围盒的时间。为什么会这样呢?我们说,轴对齐包围盒本身就是坐标轴的面求交得到的一个空间,那么光线在这片空间中的时间自然也就是进出各个面的光线时间求交。

4.5.4三维空间的情况

就是多了一个面的进出时间计算,当光线进入了所有的面,就说明光线进入了盒子,而光线离开任意一个面,就说明光线离开了盒子。所以光线进入盒子的时间就是光线进入三个面时间中的最大值,而光线离开盒子的时间就是光线离开三个面时间中的最小值。而如果求出的进入盒子时间<离开盒子时间,也就说明光线在盒子里面待了一段时间,也就是和包围盒有交点

总结:
负的情况:t离开<0 →Box在光背后

光线起点在Box内 :t离开≥0 & t进入 <0 

iff(当且仅当)t离开 < t进入 && t离开≥0 时,有交点

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

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

相关文章

File has been changed outside the editor, reload?

编译keil工程&#xff0c;一直提示&#xff1a;该文件在编译器之外被修改&#xff0c;是否重新加载。 解决办法&#xff1a; 关闭.map后缀的文件即可&#xff0c;然后重新build/rebulid可以发现不会重新弹出该错误。

数据集成和人工智能驱动的见解

数字时代使数据成为人们关注的焦点&#xff0c;将其从单纯的二进制序列转变为有价值的组织资产。随着企业越来越多地转向数据驱动战略&#xff0c;数据管理的复杂性也随之增加。当前的任务不仅仅是存储甚至收集数据&#xff0c;而是将其转化为可操作的情报。本博客旨在剖析寻求…

【漏洞复现】华脉智联指挥调度平台命令执行漏洞

Nx01 产品简介 深圳市华脉智联科技有限公司&#xff0c;融合通信系统将公网集群系统、专网宽带集群系统、不同制式、不同频段的短波/超短波对讲、模拟/数字集群系统、办公电话系统、广播系统、集群单兵视频、视频监控系统、视频会议系统等融为一体&#xff0c;集成了专业的有线…

Weblogic-wls-wsat-unserialize_CVE-2017-10271

文章目录 Weblogic < 10.3.6 wls-wsat XMLDecoder 反序列化漏洞1. 漏洞描述2. 漏洞复现2.1 环境启动2.2 漏洞扫描2.3 漏洞验证 3. 修复建议 Weblogic < 10.3.6 ‘wls-wsat’ XMLDecoder 反序列化漏洞 1. 漏洞描述 说明内容漏洞编号CVE-2017-10271漏洞名称Weblogic <…

【牛牛送书 | 第三期】《一本书讲透Java线程:原理与实践》带你深入JAVA多线程

目录 摘要&#xff1a; 多线程对于Java的意义 为什么Java工程师必须掌握多线程 Java多线程使用方式 如何学好Java多线程 参与方式&#x1f947; 摘要&#xff1a; 互联网的每一个角落&#xff0c;无论是大型电商平台的秒杀活动&#xff0c;社交平台的实时消息推送&#x…

10--面向对象OOP--05

1、代码块 如果成员变量想要初始化的值不是一个硬编码的常量值&#xff0c;而是需要通过复杂的计算或读取文件、或读取运行环境信息等方式才能获取的一些值&#xff0c;该怎么办呢&#xff1f;此时&#xff0c;可以考虑代码块&#xff08;或初始化块&#xff09;。 代码块(或…

JVM 分析GC日志

GC日志参数 -verbose:gc 输出gc日志信息&#xff0c;默认输出到标准输出 -XX:PrintGC 输出GC日志。类似&#xff1a;-verbose:gc -XX:PrintGCDetails 在发生垃圾回收时打印内存回收详细的日志&#xff0c;并在进程退出时输出当前内存各区域分配情况 -XX:PrintGCTimeStam…

【力扣】141和142环形链表

141.环形链表 法一&#xff1a;快慢指针 思路&#xff1a; 用两个指针slow,fast,后者能比前者多走一步路&#xff0c;那判断是不是有环&#xff0c;只需要判断是否会相遇。 就是有一个能比乌龟跑2倍快的兔子&#xff0c;两小只都在有环的路上跑&#xff0c;那是不是肯定会相…

【基于NLP的微博情感分析:从数据爬取到情感洞察】

基于NLP的微博情感分析&#xff1a;从数据爬取到情感洞察 背景数据集技术选型功能实现创新点 今天我将分享一个基于NLP的微博情感分析项目&#xff0c;通过Python技术、NLP模型和Flask框架&#xff0c;对微博数据进行清洗、分词、可视化&#xff0c;并利用NLP和贝叶斯进行情感分…

【51单片机系列】独立按键介绍

本文是关于独立按键的介绍及使用。首先介绍了按键&#xff0c;包括什么是按键及使用按键时如何实现软件消抖。然后使用proteus仿真实现独立按键控制LED指示灯的操作。 之前的LED、蜂鸣器、数码管中IO口都是作为输出使用&#xff0c;这里通过独立按键实验介绍IO口作为输入的使用…

web,Apache简述

一.HTTP请求访问的完整过程 1.建立连接 2.接收请求 3.处理请求 4.访问资源 服务器获取请求报文中请求的资源web服务器&#xff0c;即存放了web资源的服务器&#xff0c;负责向请求者提供对方请求的静态资源&#xff0c;或动态运行后生成的资源 静态资源&#xff1a;不需要…

如何使用bash写脚本

本章主要介绍如何使用bash写脚本。 了解通配符了解变量了解返回值和数值运算数值的对比判断语句循环语句 grep的用法是“grep 关键字 file”&#xff0c;意思是从file中过滤出含有关键字的行。 例如&#xff0c;grep root /var/log/messages&#xff0c;意思是从/var/log/me…

C++笔记之C语言中的换行符和转义符

C笔记之C语言中的换行符和转义符 文章目录 C笔记之C语言中的换行符和转义符 在C语言中&#xff0c;换行符和转义符用于在字符串和字符常量中表示特殊字符。下面是关于换行符和转义符的解释&#xff1a; 换行符&#xff08;Newline character&#xff09;&#xff1a; 在C语言中…

前端知识(十三)——JavaScript监听按键,禁止F12,禁止右键,禁止保存网页【Ctrl+s】等操作

禁止右键 document.oncontextmenu new Function("event.returnValuefalse;") //禁用右键禁止按键 // 监听按键 document.onkeydown function () {// f12if (window.event && window.event.keyCode 123) {alert("F12被禁用");event.keyCode 0…

MySQL Server 层和引擎层是如何交互的

Server 层、引擎层、BufferPool、磁盘间的关系 大体来说&#xff0c; MySQL可以分为Server层和存储引擎层两部分。 1&#xff09;Server 层&#xff1a;Server 层包括连接器、查询缓存、分析器、优化器、执行器等&#xff0c;涵盖MySQL的大多数核心服务功能&#xff0c;以及所…

FaceBook推出新的翻译模型Seamless!可实现跨语言交流的无缝衔接!

FaceBook **&#xff08;中文名&#xff1a;脸书&#xff09;**近期发布了一个新的翻译模型 Seamless Communication&#xff0c;可实现跨语言实时"无缝"交流。 该模型可以保留跨语言的表达方式和复杂性&#xff08;翻译时保留语音中的停顿和语速&#xff0c;以及声…

12.9_黑马数据结构与算法笔记Java

目录 057 多路递归 e03 杨辉三角2 thinking&#xff1a;二维数组的动态初始化&#xff1f; 057 多路递归 e03 杨辉三角3 058 链表 e01 反转单向链表1 058 链表 e01 反转单向链表2 058 链表 e01 反转单向链表3 递归 058 链表 e01 反转单向链表4 为什么是returnn1呢&…

递归的两个特点、典型案例----汉诺塔问题

一、递归的两个特点 1、要自己调用自己 2、递归函数里要有结束条件。 二、汉诺塔问题 有三根柱子&#xff0c;现在在一根柱子上&#xff0c;从下往上&#xff0c;按照大小顺序摞着很多盘子。现在要把这些盘子全部放到另一根柱子上&#xff0c;且盘子依然按照从大到小顺序摞着…

触手可及的便携CD播放器,随时享受音乐乐趣,山灵EC Mini上手

如今做发烧级实体CD播放器的国产品牌越来越少了了&#xff0c;最近我尝试了一款山灵的便携式CD播放器&#xff0c;感觉它做得很有味道。在CD机领域&#xff0c;山灵技术积累的不错&#xff0c;像是这款EC Mini&#xff0c;不论设计还是体验都很出色&#xff0c;既能够满足实体C…

基于Java SSM框架实现电影售票系统项目【项目源码+论文说明】计算机毕业设计

基于java的SSM框架实现电影售票系统演示 摘要 21世纪的今天&#xff0c;随着社会的不断发展与进步&#xff0c;人们对于信息科学化的认识&#xff0c;已由低层次向高层次发展&#xff0c;由原来的感性认识向理性认识提高&#xff0c;管理工作的重要性已逐渐被人们所认识&#…