Whitted光线追踪

2023-10-26

在这里插入图片描述
更详细的内容可以看知乎的这篇文章
在这里插入图片描述
这里简要的说了一下几何光学的规则。
在这里插入图片描述
这里引出了光线追踪:正向(从光源开始)和反向(从眼睛开始)。
在这里插入图片描述
在介绍光线追踪前,先来看一些比较简单的。
在这里插入图片描述
W h i t t e d Whitted Whitted光线追踪算法,结合了反向光线追踪和 r a y s   t o   l i g h t rays\ to\ light rays to light(看图会更清晰一点),而且需要递归计算。具体的算法: 1. 1. 1.对于每个像素,沿 V V V方向跟踪主光线到第一个可见表面。 2. 2. 2.对于每个交点,跟踪次光线: S h a d o w   r a y s Shadow\ rays Shadow rays,即从交点到光源的 L i L_i Li R e f l e c t e d   r a y Reflected\ ray Reflected ray反射光线,如图中的 R R R所示、 R e f r a c t e d   r a y Refracted\ ray Refracted ray(折射光线)或者 t r a n s m i t t e d   r a y transmitted\ ray transmitted ray(透射光线),如图中的 T T T所示。
在这里插入图片描述
结合图示会更加清楚。
在这里插入图片描述
现在让我们逐步构建光剑追踪器,首先是光线投射和局部照明。
在这里插入图片描述
直接照明,首先给出了射线的定义, I d i r e c t I_{direct} Idirect通过 B l i n n − P h o n g Blinn-Phong BlinnPhong模型计算。
在这里插入图片描述
跟踪中的着色,看见这个公式了吗,是不是和 B l i n n − P h o n g Blinn-Phong BlinnPhong模型中的有点像?
在这里插入图片描述
在这个基础上,我们做了两个修改: 1. 1. 1.距离衰减 A j d i s t A_j^{dist} Ajdist的最大值为 1 1 1 2. 2. 2.需要包含阴影衰减 A j s h a d o w A_j^{shadow} Ajshadow。这个公式就是光线追踪中的着色公式。
在这里插入图片描述
光线追踪伪代码。我们通过向每个像素投射光线来构建光线跟踪图像。 C O P COP COP c e n t e r   o f   p r o j e c t i o n center\ of\ projection center of projection(投影中心), d ˉ \bar{d} dˉ为投射光线的方向向量, s c e n e scene scene为场景,那么可以计算得到 ( t , N , m t r l ) (t,N,mtrl) (t,N,mtrl) t t t为交点距 P P P的距离; N ˉ \bar{N} Nˉ为交点处的法向量; m t r l mtrl mtrl m a t e r i a l material material,交点处的材质;那么也可以得到交点 Q Q Q的坐标;把 − d ˉ -\bar{d} dˉ作为视线(反向光线追踪),即可通过 s h a d e shade shade( P h o n g / B l i n n − P h o n g Phong/Blinn-Phong Phong/BlinnPhong)计算出交点处的颜色。
在这里插入图片描述
着色伪代码。首先处理物体本身的发光(与材质有关)以及全局环境光,然后开始逐一处理光源(多光源),先计算距离衰减 a t t e n atten atten Q Q Q L i g h t Light Light的方向,然后计算漫反射 d i f f u s e diffuse diffuse和镜面反射 s p e c u l a r specular specular,再把他们累加起来。
在这里插入图片描述
现在我们考虑阴影—通过投射阴影线来实现。
在这里插入图片描述

带阴影的着色。与之前的大体相同,多了求阴影衰减 s h a d o w A t t e n shadowAtten shadowAtten的过程。
在这里插入图片描述
这张图说明了如何计算阴影衰减。它可以简单到仅仅判断光线是否可以到达光源,这里以点光源为例, g e t D i r e c t i o n ( P ) getDirection(P) getDirection(P)可以得到 P P P到光源的方向向量 d ˉ \bar{d} dˉ,把它当作一条射线并与场景计算交点,从而得到交点到 P P P的距离 t t t,此时我们再计算光源到 P P P的距离 t l i g h t t_{light} tlight,如果 t < t l i g h t t<t_{light} t<tlight,说明被阻挡了,此时应返回 ( 0 , 0 , 0 ) (0,0,0) (0,0,0)(黑色),否则应返回 ( 1 , 1 , 1 ) (1,1,1) (1,1,1)。对于方向光源,我们可以认为 t l i g h t t_{light} tlight为无穷大。
在这里插入图片描述
加上反射光。
在这里插入图片描述
I ( P , d ˉ ) I(P,\bar{d}) I(P,dˉ)是沿射线看的强度,那么有 I ( P , d ˉ ) = I d i r e c t + I r e f l e c t e d I(P,\bar{d})=I_{direct}+I_{reflected} I(P,dˉ)=Idirect+Ireflected I d i r e c t I_{direct} Idirect是由 B l i n n − P h o n g Blinn-Phong BlinnPhong模型计算出来的(带阴影衰减), I r e f l e c t e d I_{reflected} Ireflected等于 K r ∗ I ( Q , R ˉ ) K_r*I(Q,\bar{R}) KrI(Q,Rˉ) K r K_r Kr为反射系数, Q Q Q为交点, R ˉ \bar{R} Rˉ为反射光,显然这是一个递归过程—递归计算反射光的强度。一般我们会令 K r = K s K_r=K_s Kr=Ks,即反射系数和镜面反射系数相等。
在这里插入图片描述
依据反射定律有 θ i = θ r θ_i=θ_r θi=θr R ˉ 、 d ˉ 、 N ˉ \bar{R}、\bar{d}、\bar{N} RˉdˉNˉ三者共面。
在这里插入图片描述
更新一下光线追踪的伪代码。
在这里插入图片描述
终止递归的条件: 1. 1. 1.当递归深度大于最大限制时; 2. ∏ i = 1 d K r i < T h r e s h 2.\prod_{i=1}^{d}K_{ri}<Thresh 2.i=1dKri<Thresh时,也就是说经过几次反射后,系数太小了,这点贡献可以忽略掉。
在这里插入图片描述
加上折射光。
在这里插入图片描述
T T T是折射光, K t K_t Kt是折射系数,一般我们令 K s = K r K_s=K_r Ks=Kr,且 K t = 1 − K s K_t=1-K_s Kt=1Ks,如果物体不透明的话应该令 K t = ( 0 , 0 , 0 ) K_t=(0,0,0) Kt=(0,0,0)
在这里插入图片描述
折射定律。 n i 、 n t n_i、n_t nint为折射率,由于 d ˉ 、 N ˉ \bar{d}、\bar{N} dˉNˉ已知,所以 s i n θ i sinθ_i sinθi的值很容易得到,那么有 s i n θ t = n i ∗ s i n θ i / n t sinθ_t=n_i*sinθ_i/n_t sinθt=nisinθi/nt
在这里插入图片描述
上面是 T ˉ \bar{T} Tˉ的推导过程,由于我们并不关心 T ˉ \bar{T} Tˉ的长度,所以可以对结果进一步化简,使得 T ˉ = ( n c o s θ i − c o s θ t ) N ˉ − n V ˉ \bar{T}=(ncosθ_i-cosθ_t)\bar{N}-n\bar{V} Tˉ=(ncosθicosθt)NˉnVˉ
在这里插入图片描述
但是在计算折射光时,一定要考虑全内反射的情况。我们知道 s i n θ t = n i ∗ s i n θ i / n t sinθ_t=n_i*sinθ_i/n_t sinθt=nisinθi/nt,当 θ t = 90 ° θ_t=90° θt=90°时, θ i θ_i θi达到了临界角 θ c θ_c θc,如果 θ i > θ c θ_i>θ_c θi>θc,就会发生全反射现象,此时没有折射光。
在这里插入图片描述
现在可以进一步完善我们的光线追踪伪代码了。由于计算折射光线时要考虑折射率 n i 、 n t n_i、n_t nint,所以需要判断射线是正在进入物体还是传出物体,计算 N ˉ ∗ V ˉ \bar{N}*\bar{V} NˉVˉ并与 0 0 0进行比较即可知道。
在这里插入图片描述
再次回顾一下阴影衰减。我们之前只是简单的判断了一下交点到光源之间是否有障碍物,有就返回 ( 0 , 0 , 0 ) (0,0,0) (0,0,0)(黑色),否则就返回 ( 1 , 1 , 1 ) (1,1,1) (1,1,1)。但是如果路径上有透明对象怎么办?正确的办法是把这些透明对象的 k t k_t kt依次累成起来作为结果(由于一个物体可以被进入、穿出,所以可能会多次累乘一个物体的 k t k_t kt)。这种模型简单的认为颜色只会在物体的表面,就像透明玻璃表面上的颜色涂层一样。
在这里插入图片描述
但是还有另外一种模型是认为玻璃的内部也有颜色的,在此不多赘述。
在这里插入图片描述
如图所示,当我们从物体内部穿出时,法向量其实是垂直于平面朝外的,所以在计算着色、反射、折射前需要先对法向量取反。而且在对物体内部的点进行着色时,环境光应该再乘上 k t k_t kt,因为它必须穿过物体表面才能达到物体内部。
在这里插入图片描述
误差控制。因为计算往往涉及到浮点数,可能会有误差,所以一般会引入一个极小数进行误差控制。
在这里插入图片描述
球体、三角求交可以看我这篇博客。这里再讲一下坐标系的一些问题。
在这里插入图片描述
从上图可以看出,求交前先将光线转换成物体的局部坐标,如果有交点,再把交点处的法向量转换为全局坐标。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Whitted光线追踪 的相关文章

随机推荐

  • 弹性云服务器(ECS)结合 Docker 容器

    介绍 容器 Container 是一种轻量级的虚拟化技术 所谓的轻量级虚拟化 就是使用了一种操作系 统虚拟化技术 这种技术允许一个操作系统上用户空间被分割成几个独立的单元在内核中运行 彼此互不干扰 这样一个独立的空间 就被称之为一个容器 本
  • HTTP传输协议原理

    目录 1 简介 1 1 简单的HTTP协议 1 2 主要特点 1 3 HTTP请求响应模型 2 工作原理与过程 2 1 工作原理 2 2 用户访问网站的过程 2 3 HTTP协议栈中各层数据流 3 请求 1 请求方法 2 请求的网址 3 请
  • scala ide + helloworld

    http blog csdn net asongoficeandfire article details 21490101 简介 在上一篇文章中 我们阐述了Coursera使用Scala的理由 以及Scala的优缺点 说多不如少练 我们今天
  • 一文讲透缓存方案及常见问题——初篇

    Hello 大家好 今天跟大家聊的一个话题就是 缓存 目前 面向C端的服务架构中 除开管理后台等访问量很少 实时性要求较高的服务可不使用缓存外 缓存已成为高性能分布式系统里不可或缺的一环 本文不打算过多涉及具体的缓存组件如Memcached
  • Python读取文件并修改文件内容后保存为新文件

    下面是例子是读取一个文件内容 并且改变其中满足正则的行 进行内容追加 use command reWriteFile py oldFileName txt newFileName txt import re import sys param
  • 计算机内存比外存容量大吗,内存容量一般比外存容量大吗

    大家好 我是时间财富网智能客服时间君 上述问题将由我为大家进行解答 内存容量一般比外存容量大 计算机的内存容量通常是指随机存储器 RAM 的容量 是内存条的关键性参数 内存容量以MB作为单位 可以简写为M 内存的容量一般都是2的整次方倍 比
  • qt qmake 生成的makefile介绍

    参考 概述 跟我一起写Makefile 1 0 文档 NMAKE参考之五 Makefile中的命令 nmake在指定目录下生成 XanaduT的博客 CSDN博客 NMAKE Reference Microsoft Learn 目录 序 m
  • ARM基础--指令集汇编常用指令

    目录 简单的ARM程序 ARM指令集的分类 ARM数据处理指令 ARM跳转指令 ARM的Load Srore指令 ARM的状态寄存器传送指令 ARM软中断指令 ARM伪指令 ARM混合编程 简单的ARM程序 text 表示当前为代码段 gl
  • 拯救者笔记本ubuntu亮度调节

    终端 nvidia settings 点击 DP 2 点击右侧 Color Correction 调节 Brightness即可
  • centos7 arm内核配置yum源

    yum配置文件替换 一 cd到目录 etc yum repos d 创建 替换下面三个文件 1 CentOS Base repo CentOS Base repo The mirror system uses the connecting
  • Java中常用API和标准类的使用与优化

    目录 一 API和Java API简介 二 Object类的重要性 三 Objects工具类的使用 四 标准类的设计与使用 五 String类的特点和常用方法 六 API查找文档及其方法和技巧 一 API和Java API简介 API是Ap
  • 鸿蒙系统应用开发初体验(一)

    上学时期就对操作系统非常有兴趣 甚至还想自己动手尝试尝试 曾买来一堆关于操作系统的书籍肯 这不 翻出来几年前的博客 动手写简单的嵌入式操作系统https blog csdn net yyz 1987 article details 9901
  • VirtualBox虚拟机安装CentOS7.6后无法ssh远程连接虚拟机

    问题如题所述 安装完 一般都是使用ip addr查看虚拟机IP后通过远程工具来尝试连接 虚拟机IP 然后会发现通过此IP无法连接 解决办法 修改VirtualBox的网络配置 1 查看VirtualBox对应网卡的IP地址 对应的IP为19
  • 【数组】点菜题目描述小木呆去食堂吃中饭,食堂提供的菜比较丰富有n(0<n<=1000)种,各种菜都有一个价格ci(ci>0并且都是整数),但他口袋里只剩下m元钱,他计划买两个不同的菜,请问他有多少

    数组 点菜 题目描述 小木呆去食堂吃中饭 食堂提供的菜比较丰富有n 0
  • MySql修改表名的两种方法

    一 rename rename table 旧表名 to 新表名 rename table mysu to new su 二 alter alter table 旧表名 rename as 新表名 alter table mysu rena
  • Python Crypto.Cipher加密包

    The Crypto Cipher package contains algorithms for protecting the confidentiality of data Crypto Cipher包含保护机密数据的加密算法 Inst
  • copy()及copy.deepcopy()

    在说浅拷贝和深拷贝之前先咱们先看看这张图片 A 1 2 3 4 5 6 B A B 0 S print B print A 可以看到只是修改了B中的值但A中的值也随之改变 可以直接推断出A B的存储位置都在同一个地方 现在上浅拷贝 浅拷贝和
  • pnpm install 安装依赖失败

    在使用 pnpm install pnpm i 遇到了一个报错 在使用 EPERM operation not permitted unlink E pnpm store v3 files 9e 经过咨询和查询 得到解决方案是 键盘 win
  • python-pptx处理替换文本

    python中使用python ppt库操作ppt来替换文本内容 包括图片在前方的 from pptx import Presentation from pptx enum shapes import MSO SHAPE TYPE def
  • Whitted光线追踪

    更详细的内容可以看知乎的这篇文章 这里简要的说了一下几何光学的规则 这里引出了光线追踪 正向 从光源开始 和反向 从眼睛开始 在介绍光线追踪前 先来看一些比较简单的 W h i t t e d