[计算机图形学]光线追踪的基本原理(前瞻预习/复习回顾)

news2024/10/6 0:28:01

一、光栅化的弊端

我们为什么要用光线追踪呢,在之前的篇章中,我们提到了,光栅化的方式很难表示一些全局的效果,如(1)软阴影,(2)Glossy的反射(类似镜子但又不像镜子那么光滑的材质,如打磨的铜镜和一些金属),也就是光线弹射了两次的情况,(3)间接光照(不是由光源直接照亮而是由光源弹射多次后的光线照亮)。这些都是光栅化很难解决的。

光栅化和光线追踪的比较:

光栅化经常应用于一些实时渲染,也就是每秒要刷新30帧以上的画面,如游戏中需要根据玩家操控而导致画面实时的变化,因为光栅化相对于光线追踪运算量较小,所以速度也比较快,容易达到实时的效果。

而光线追踪常常应用于离线渲染,如高质量的电影,提前花大量的时间去渲染电影,最后到影院播放。一帧往往要花10KCPU小时,速度很慢,但质量非常高,接近真实的光影。

二、Whitted-Style光线追踪的基本思想

1.基本假设

在这里我们先做几个假设,尽管它们不一定严格地符合物理学。 

1.光线是沿着直线传播的

2.光线与光线不会发生碰撞

3.光线是从光源被发出最后进入人的眼睛(光线可逆 )

2.基本思想

这里我们开始之前仍做几个假设:

1.相机是针孔摄像机 2.光源是点光源 3.发生的都是完美的反射/折射

光线追踪的第一步是从摄像机出发对着成像平面的一个像素发出一条光线,而穿过这个像素的光线会在场景中打到某个物体的某个位置,这个位置一定是离摄像机最近的,而这完美的解决了深度测试的问题,光线追踪使我们不需要深度缓存来测试深度。

第二步则从被光线打到的点和光源连线,这条线(上图中虚线)叫做Shadow Ray,如果这条线中间没有物体遮挡则该点就是被光源照亮的点,否则说明该点在阴影中,最后通过着色模型计算颜色后就可以把这个点的颜色写入到像素中。

这就是最最基本的光线追踪,在早期人们通过这种方法来实现和光栅化近似的效果,但是这仍然不够,因为这仍然只考虑了光线的一次弹射。

这就要说到Whitted-Style光线追踪了,而这种方法实际上是一种递归思想,它考虑了光线的一次以上的弹射。和上面的思路类似,只不过我们考虑之后的多次弹射,如上图的玻璃球,眼睛发出的光线经过玻璃球之后发生了两次折射和一次反射,而这些光线又打到了场景中其它位置的点。我们把这些弹射点都和光源连线得到更多的Shadow Ray,然后判断这些点的可见性进行着色,而眼睛发出光线穿过的像素的颜色就由这些弹射点的着色加起来决定。这里我们也对眼睛发出的光线做出了分类,第一次弹射之前的光线叫做primary ray,之后弹射的都叫做secondary ray

 递归光线追踪得到的结果

三、光线的求交算法

上面的基本思路我们已经讲完了,接下来说一说如何计算光线与物体求交,这显然是一个数学问题,所以我们先把光线以数学的形式定义出来,光线就是一条射线,有一个起点o,有一个方向d(单位向量),也就是上图点光源的表示可以表示为:r(t)=o+td,t始终是正的,也就是光线不能返回,也代表光线传播的距离。

1.最简单的情况

最简单的情况,计算光线与球相交,而球的三维定义也很简单,p也就是球上任何一个点,到原点c的距离始终相等。将光线带入球的方程求解即可。

求根公式可以很容易的求出t,而t需要满足物理上的实际意义,也就是t>0,其次t是实数,这也就要求Δ≥0,最后根据两个t的取值,判定光线与球的相交/相切/相离。 

2.光线与物体与隐式几何求交

介绍完了光线与球求交,我们也就可以推广到与一般的隐式表面求交。隐式表面都可以写成关于表面上点p的方程f(p)=0,而和之前的球一样,我们把光线带入方程,同样可以求出t。求出t仍然需要满足物理意义,大于0,是实数。解出的交点在哪呢?那就代回原光线方程,也就是o+td。

3.光线与显式几何求交(与空间中的三角形求交)

接下来讲如何计算光线与显式表面求交,那么最重要的显式表面是什么呢?当然是三角形网格了。而和三角形网格求交绕不开的话题就是如何计算光线与三角形求交而通过光线与三角形求交,我们还可以判断光源在网格内还是外:从光源出发一条射线,如果能穿过网格两次,那么它一定在网格外,而如果只穿过一次,那就说明它在网格内,当然前提是网格是封闭的。

(1)一般求解算法

那么如何计算光线和三角形网格的求交呢?最简单的情况,把每个三角形都和光线判断一次有没有交点,求出很多个交点,取t最小的。但是问题是一个网格往往有上万个三角形,而我们的屏幕现在又基本都是1920x1080的分辨率,如此庞大的计算量会导致非常慢,那么在这其中人们发明了一些加速结构,能加速这里的计算,这里我们放到下一篇加速结构中介绍。

而现在我们暂时不考虑加速,就用这种穷举法来做,一根光线和一个三角形要么有1个交点,要么有0个交点(不考虑平行情况)。

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

我们同样先把平面用数学形式表示出来(光线的表示仍然为o+td),而平面可以用一个平面的法线和平面上的一个点唯一确定出来。也就是说平面上任意一点p'到p这个向量与定义的法线N都垂直,也就是点积为0。而显然,如果是平面外一点与p'的连线,它不与法线N垂直。而如果将这些量都以坐标代入,就会得到ax+by+cz+d=0,也就是一个平面的方程。

有了上面的准备,我们就可以计算光线与平面的求交了,同样的代入方程,即该点既在光线上又在平面上。同样的,我们可以解出t,同样的确保t≥0,且t为实数。

(2)Möller Trumbore算法

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

四、总结

本篇我们介绍了光线追踪的基本思想,和光线求交算法,那么我们在场景中真的要一个一个三角形的判断是否与光线有没有交点吗?显然不是的,人们发明了许多加速结构来加速这个过程,如AABB包围盒,以及均匀的不均匀的划分的空间网格等等我们在下篇介绍。

参考:

Lecture 13 Ray Tracing 1_哔哩哔哩_bilibili

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

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

相关文章

【GIT】git push后github没看到pull requests解决

当你在Github上push代码后,如果在远程仓库中没有看到pull request请求,那么有以下几种可能的原因: 未创建pull request 如果在本地使用git push命令将修改推送到Github上,但还没有在Github上创建pull request请求,则不…

FreeRTOS 队列(一)

文章目录 一、队列简介1. 数据存储2. 多任务访问3. 出队阻塞4. 入队阻塞5. 队列操作过程图示 二、队列结构体三、队列创建1. 函数原型(1)函数 xQueueCreate()(2)函数 xQueueCreateStatic()(3)函数 xQueueGe…

Golang每日一练(leetDay0045)

目录 133. 克隆图 Clone Graph 🌟🌟 134. 加油站 Gas Station 🌟🌟 135. 分发糖果 Candy 🌟🌟🌟 🌟 每日一练刷题专栏 🌟 Golang每日一练 专栏 Python每日一练 …

【PR 基础】设置上下黑白边的两种方法

方法1 点击 文件-》新建-》旧版标题 点击确定 点击矩形工具 利用矩形工具框选出上下黑白边 款选完成后点击关闭 将刚创建的字幕拖入轨道 可以修改其持续时长与视频时长保持一致 如果想要修改字幕可以双击来修改 比如可以将颜色改为黑色 方法2 点击号,再选择安全边…

如何在表格里面使用VSTACK、HSTACK等函数

如何在表格里面使用VSTACK、HSTACK等函数 书接前文 ONLYOFFICE 桌面编辑器 v7.3 新功能介绍 里面介绍了最新版本的表格里面,添加的公式将帮助您更高效地进行数据计算:TEXTBEFORE、TEXTAFTER、TEXTSPLIT、VSTACK、HSTACK、TOROW、TOCOL、WRAPROWS、WRA…

IPSEC VPN

1.数据认证的介绍、作用、实现的技术手段 数据认证是指通过一系列验证过程检查数据的完整性、真实性、可靠性和准确性,以确保这些数据来自于已知或可信的来源。数据认证的目的是保护数据免受篡改、冒充或欺骗等威胁,确保数据的安全性和可信度。实现数据…

Windows 彻底卸载联软流氓软件(亲测可用)

文章目录 1、前言2、卸载步骤(1)打开服务,将所有Uni开头的服务都禁用,某些服务禁用后可能还是会自启,不过不影响(2)进入安全模式,电脑重启(3)重启后桌面显示了…

怎么将照片KB调小?压缩照片kb的几个方法

将照片KB调小的意思是将照片文件的大小缩小,使其占据更小的存储空间。在一些特定场景下,如网页设计、邮件发送、上传文件等,限制了文件大小,因此需要将照片压缩到规定大小以内。通常情况下,压缩后的照片质量会相应降低…

18.Java泛型

目录 1. Java基本介绍 2. JDK下载安装及其环境配置 3. 一个简单的java程序 4. Eclipse基本使用、数据类型、运算符 5. 控制语句(if、switch、for、while、foreach) 6. Java数组 7. Java字符串对象(String|StringBuffer|StringBuilder|StringJoiner…

关闭默认共享服务

目录 1.从网络上关闭共享协议2.禁用共享服务3.关闭防火墙共享端口4.脚本自启动删除默认共享5.修改注册表彻底屏蔽共享 共5种方法,推荐前三种搭配。 1.从网络上关闭共享协议 打开网络和共享中心->本地连接->属性把" Microsoft 网络的文件和打印机共享&qu…

Word如何插入图片?最全方法总结(2023新版)

案例:Word如何插入图片 【我最近在写毕业论文,需要在Word文档里添加一些图片,想问问大家Word如何插入图片呀?感谢回答!】 Microsoft Word是一个广泛使用的文字处理软件,在使用中如果插入图片可以很好的丰…

优思学院|精益生产和六西格玛如何把控质量?

精益生产是一种流程改善方法,旨在最大程度地减少浪费和提高效率。在实施精益生产时,质量控制是一个重要的因素,因为不合格的产品会导致延误和浪费。优思学院在本文将探讨精益生产和六西格玛管理理论如何控制质量,以及解决产品质量…

poi-tl简介与文本/表格和图片渲染

一、poi-tl简介 下面简介来自官方文档。 官方文档:http://deepoove.com/poi-tl/#_why_poi_tl 1、简介 poi-tl(poi template language)是Word模板引擎,使用Word模板和数据创建很棒的Word文档。 poi-tl是一个基于Apache POI的Word模…

【Python】【进阶篇】5、Django Admin后台管理系统

目录 5、Django Admin后台管理系统1. 后台管理系统的重要性2. 了解Django后台管理功能 5、Django Admin后台管理系统 Django 的后台管理系统是非常出色的,新建项目以后,Django 就为我们设置好了后台管理系统的各种功能,本节我们将一起认识它…

SQLServer:Win/Linux环境安装及一键部署脚本

1. Win安装SQLServer CSDN已有完整安装流程,亲测可用。----》Windows安装SQLServer流程 2. Linux安装 SQLServer 2.1 设置镜像 curl https://packages.microsoft.com/config/rhel/7/mssql-server-2017.repo > /etc/yum.repos.d/mssql-server.repo 2.2 通过y…

Adobe国际认证证书有用吗?

Adobe国际认证又称为Adobe认证(英文:Adobe Certified Professional)是Adobe公司CEO签发的权威国际认证体系,旨在为用户提供Adobe软件的专业认证。 该体系基于Adobe核心技术及岗位实际应用操作能力的测评体系得到国际ISTE协会的认可,并在全球 148 各国家推广&#x…

心理预期太大,容易失望

心理预期太大,是做事的障碍 心理预期与标准有关:亚马逊创始人谈标准 趣讲大白话:对事要有合理的心理预期 【趣讲信息科技144期】 **************************** 亚马逊创始人贝索斯在《长期主义》中 对高标准的四大要素: 1.可以通…

Node实现CSDN博客导出(后续)

前言 在2021年我实现了一个Node导出博客的功能:爬取接口及博客页面并导出为md文件格式。中途有许多迭代及优化以及解决了一些关键问题,写篇文章做个记录和review 博客更新功能 在原有的导出功能上增加了博客更新的功能,避免了每次都全部导…

Java7

Java7 (一)、集合体系(二)、Collection(三)、Collection的遍历方式3.1迭代器3.2增强for遍历3.3 Lambda表达式遍历 (四)、List(五)、数据结构5.1 栈5.2 队列5.…

C learning_8

猜数字游戏 猜数字游戏: 1.电脑会随机产生一个数 2.猜数字 a>猜大了,提醒猜大了,继续猜 b>猜小了,提醒猜小了,继续猜 c>猜对了,恭喜你,猜对了,游戏结束 3.玩完之后可以继续…