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

一、光栅化的弊端

我们为什么要用光线追踪呢,在之前的篇章中,我们提到了,光栅化的方式很难表示一些全局的效果,如(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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

zabbix配置钉钉机器人告警

1.在钉钉上创建一个钉钉群组 2.在群组中添加一个机器人 3.配置zabbix server调用钉钉接口的代码(使用python) 查看是否有python环境 python --version 找到zabbix 的AlertScriptsPath目录路径 cat /etc/zabbix/zabbix_server.conf|grep AlertScriptsPath 将调用钉钉接口的py…

Java——二叉搜索树的后序遍历序列

题目链接 牛客在线oj题——二叉搜索树的后序遍历序列 题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回 true ,否则返回 false 。假设输入的数组的任意两个数字都互不相同。 数据范围: 节点数量 0≤n≤1000 …

无人机各个类型介绍

为了执行,无人机可能由类似的元件制成,但无论是它们的能力,还是由什么组成的,它们都在某种程度上有所不同。大多数无人机都是为了执行特定任务而制造的,因此以特定的方式建造,以适应它们将要使用的环境。 …

如何实现24小时客户服务

许多企业都有着这样的愿望:在不增加客服人员的同时能实现24小时客户服务。 那么有没有什么方法可以实现这一想法呢?在想解决方案之前我们可以先来谈谈客服的作用。 客服的作用主要为以下2点: 帮助用户更快地了解产品(减轻产品的…

OpenAI最新官方ChatGPT聊天插件接口《插件身份验证》全网最详细中英文实用指南和教程,助你零基础快速轻松掌握全新技术(三)(附源码)

Plugin authentication 插件身份验证 前言Plugin authentication 插件身份验证No authentication 无认证Service level 服务级别User level 用户级别OAuth其它资料下载 前言 “如果你不能信任插件,那么你就不能信任整个应用程序。”正因为如此,ChatGPT始…

第 三 章 UML 类图

文章目录 前言一、依赖关系(虚线箭头)二、泛化关系:继承(实线空心箭头)三、实现关系(虚线空心箭头)四、关联关系(一对一为实线箭头,一对多为实线)五、聚合关系…

KeePass搭建一个私人密码库

本文转载于我的博客KeePass搭建一个私人密码库 前言 {% note info no-icon %} 既然有人想看那我就不咕了嘻嘻 {% endnote %} 不知道在哪部电影里看到过这样一句话:根据社会工程学,正常人人脑是不会记住超过3种以上完全不同的复杂密码 所以你只要泄露一个…

Blender插件Lazy Viewport

目录 1.Lazy Viewport插件1.1 解压Lazy Viewport插件1.2 blender偏好设置1.3 打开插件1.4 安装插件1.5 勾选插件Lazy Viewport1.6 安装插件前1.7 安装插件后 1.Lazy Viewport插件 Blender 的一个简单插件,用于将标准 G、R、S 热键映射到视图工具,因此您…

一起学 WebGL:三角形加上渐变色

大家好,我是前端西瓜哥。之前教大家绘制一个红色的三角形,这次我们来画个有渐变的三角形。 本文为系列文章,请先阅读如何绘制红色三角形的文章: 《一起学 WebGL:绘制三角形》 原来的写法,颜色是在片元着色器…

分布式数据库架构路线大揭秘

文章目录 分布式数据库是如何演进的?数据库与分布式中间件有什么区别?如何处理分布式事务,提供外部一致性?如何处理分布式SQL?如何实现分布式一致性? 数据库更适合金融政企的未来 这些年大家都在谈分布式数…

成功上岸字节35K,技术4面+HR面,耗时20天,真是不容易

这次字节的面试,给我的感触很深,意识到基础的重要性。一共经历了五轮面试:技术4面+HR面。 下面看正文 本人自动专业毕业,压抑了五个多月,终于鼓起勇气,去字节面试,下面是我的面试过…

不知道今天吃什么?今天吃什么 API 告诉你

引言 在现代社会,由于生活节奏加快和繁忙的工作日程,越来越多的人感到选择今天吃什么餐点是一项繁琐且令人困扰的任务。为了解决这个问题,许多人会求助于在线菜谱和美食博客等渠道,但是这些选项通常是繁琐和耗时的。 幸运的是&a…

相参积累

原理 在探测远距离目标时,由于目标回波信号比较微弱,信号幅度很小,从而导致接收信号的信噪比(SNR)过低,以至于信号处理算法检测不到目标,从而发生漏检。 在脉冲体制雷达中,雷达系统…

公网远程访问局域网SQL Server数据库【无公网IP内网穿透】

目录 1.前言 2.本地安装和设置SQL Server 2.1 SQL Server下载 2.2 SQL Server本地连接测试 2.3 Cpolar内网穿透的下载和安装 2.3 Cpolar内网穿透的注册 3.本地网页发布 3.1 Cpolar云端设置 3.2 Cpolar本地设置 4.公网访问测试 5.结语 转发自CSDN远程穿透的文章&…

HoloLens2场景理解,识别平面信息

因为可用的资料比较少,就记录下吧,大家也可以少走弯路,节省时间。 场景理解,通俗的讲,可以识别空间当中的墙面、地板、天花板、平台等. 场景理解(Scene Understanding)是指 HoloLens2 通过深度传感器、摄像头和计算机视觉算法等技术,能够对…

微信小程序对接在线客服系统,对接小程序订阅消息模板,小程序订阅方法以及后端发送订阅模板消息的方法...

微信小程序想要对接独立在线客服系统,除了使用小程序消息推送接口外,还可以使用webview嵌入的形式嵌入聊天链接。 但是,使用webview嵌入的形式,当用户离开页面以后,就收不到客服回复的消息了 所以,我们需要…

Nginx快速上手~

注:本文针对官网的快速入门教程进行一个中文的解释,以帮助英文阅读能力较差的学习者快速上手 参考官网连接Beginners Guide (nginx.org) Centos下的安装 sudo yum install yum-utils # 创建文件 vim /etc/yum.repos.d/nginx.repo # 输入以下内容 ####…

IDEA插件-MavenHapler

1.安装Maven Helper Maven Helper 是 IntelliJ IDEA 中的一个插件,可以帮助您管理 Maven 依赖项。它可以帮助您更容易地删除不再需要的依赖项,查看依赖项的冲突,以及执行其他有关 Maven 依赖项的操作。 打开 IDEA 设置页面: 在插…

信息安全-reNgine-Web应用渗透测试的自动化网络侦察框架

目录 reNgine介绍 工具运行机制 安装部署 安装rengine 安装python依赖包 合并Django前端静态文件 安装Postgresql 创建reNgine账号 启动reNgine 启动reNgine成功 启动reNgine后在浏览器访问:http://localhost:8000/ 这时会发现前端静态资源加载失败&…

个人杂笔记

docker里面的-p暴露端口是确确实实写了才会映射到主机 docker run -d --hostname my-rabbit --name my-rabbit -e RABBITMQ_DEFAULT_USERroot -e RABBITMQ_DEFAULT_PASS250772730 -p 8080:8080 -p 15672:15672 -p 5672:5672 rabbitmq:3-managementpip安装提示warning 可能原因…