精华内容
下载资源
问答
  • 光线追踪】各种光线追踪原理详解
    2022-03-15 16:00:49

    详细理清各种光线追踪原理


    前言

    全文采用通俗语言,不罗列数学知识和专业知识,仅分享自己的心得。

    本文为什么说是“各种光线追踪”的原理呢?是因为我当时初识光线追踪的时候,从很多博客或者国内外论文上,都会看到光线追踪原理的介绍,但是经常会存在或多或少的差别,对于刚接触光线追踪渲染的人来说很容易被搞懵。经过研究生阶段我一直在接触学习光线追踪,所以对光线追踪不敢说有很深入的认识,但是也有一点小小的心得,因此想将光线追踪的原理分门别类地说清楚。


    关于光线追踪原理的说明

    光线追踪的实现原理,不是像我们平时课程学习时遇到TCP三次握手的原理那样有固定的样子,而是有点类似我们学习快速排序算法时那样有多种实现,快速排序算有很多种方法实现,核心都离不开找基准数然后遍历数组交换元素这一条(如果你不清楚TCP三次握手和快速排序是什么,可以完全不需要理会,仅仅只是帮助思考的比喻)。

    开始正题,对于光线追踪,请首先放下你之前对其印象中的原理,看看下一段内容重新去认识光线追踪这个词(如果你有深入学习光线追踪并且自己已经有系统的认识,也可以参考下我的内容,如果有错漏还请提供您的宝贵意见)。

    光线追踪: 是一个框架,是一个统称,没有统一的实现原理,根据不同的使用场景可以有各种具体的实现原理。但是万变不离其宗,都离不开“通过模拟光线的现实传播行为来追踪光线进行渲染”这一个核心,只要根据这个核心来实现的渲染方法,都可以归到光线追踪下,都可以说是光线追踪渲染方法。因此你在不同地方看到的光线追踪原理会有差异就是这个原因。


    关于光线追踪的分类

    光线追踪主要分为以下几种具体的实现原理,建议通过英文全称来区分:

    光线投射(Ray Casting):严格意义上这种不算光线追踪,但也是不得不提到的。

    经典光线追踪(Classic Ray Tracing或者Classical Ray Tracing):也会直接被简称 “光线追踪(Ray Tracing)” 这应该是我们直接百度时看到最多的那种。这种是基础、传统、古早一点的光线追踪。

    递归式光线追踪(Recursive Ray Tracing或者Whitted-style Ray Tracing):也叫做Whitted光线追踪,指同一个东西,忘了的话容易以为是两种不同的光线追踪。这种目前更偏向主流的光线追踪,可以说当我们谈论到光线追踪时,实际上就是在谈论这种递归式光线追踪。

    路径追踪(Path Tracing):你有接触的话,可能会见过一种说法是 “路径追踪=光线追踪+蒙特卡洛” ,其实远不止如此简单,这种方式我也是接触最少的一种,因为它的实时性约等于无,关于光线追踪的实时性这点后面我会详细介绍。在渲染画面效果上(或者玩游戏爱说的光影效果),路径追踪是以上几种光线追踪中最强的。

    以上几种就是光线追踪这个框架下最主要的分类,不把光线投射算在内的话,就是一共三类。下文将用通俗语言详细介绍这几类光线追踪的原理和我自己的心得理解。


    关于光线追踪的核心

    上文提到各种光线追踪“都离不开“通过模拟光线的现实传播行为来追踪光线进行渲染”这一个核心”。那怎么去解释这个核心呢?

    我们人眼能看到外面的世界,能看到物体,看到颜色,看到光,是因为我们的眼睛接收了光,来自光源直射的光,来自物体发射的光。而那部分没有进入到我们眼睛的光,或者说没有被我们眼睛接收的光,那错过就错过了,为我们人眼成像提供不了任何帮助。光线追踪就是基于以上阐述提出的一个想法,通过追踪进入我们人眼的那些光线,看看这些光线从光源到我们人眼的途中发生了什么传播行为,例如经过哪几次反射,甚至折射,计算这些光线对我们眼睛成像的贡献(例如这些光线有多亮,是什么颜色的)。而以上过程的核心就是光线是怎么传播的

    那这个核心从算法实现上怎么去完成呢?

    光路是可逆的,一条光线从光源发射进入我们的眼睛,这条光路反过来看就是从我们的眼睛发射到碰撞光源,虽然光路逆转了,但是路子是一样的,所以这条光路对我们成像而言没有受到变动影响。从算法上看,如果将眼睛作为光线的发射点的话,那意味着我们追踪的所有光线都是上面说的“能进入我们人眼的”那部分提供成像贡献的光线,从而不需要考虑那大部分没有进入我们人眼的光线,因此对算法而言可以避免更大的计算量。因此光线追踪都是指从我们人眼发射光线,追踪这些光线寻找光源的过程。

    而我们人眼在计算机三维空间中可以视作一个坐标点,我们的视网膜可以看作是分辨率800x600的一个网,比喻我们看到的内容由800x600个像素点组成,我们在代码中用缓存来保存起来,例如使用二维数组,另外我们也要记录这个网的三维空间位置。我们将人眼坐标点作为起点,将这个网的其中一个像素的坐标点作为方向,连接起来的一个三维向量就视作一条光线,这条光线进入到场景中便可以说是发射光线,这条光线的贡献值最终计算为它一开始所经过像素点的颜色值,颜色值存入像素缓存区中,当缓存中所有像素点都处理结束,意味着成像结束。可以发现,计算机中实现光线追踪,就是一个三维几何计算的过程,处理的都是三维向量的计算。


    光线追踪分类

    光线投射(Ray Casting)

    有的文章会说光线投射是早期的光线追踪技术,属于光线追踪的一种,或者也有说光线追踪是由光线投射发展而来。我没有刻意去追本溯源,但是在我看来,两者有很大的相似性,也有很明显的区别。先介绍光线投射是怎样的:

    先说光线投射用来做什么的,光线投射已经应用了很多年,也有很成熟的实现方法,最主要的用处在“体渲染”(volume rendering)上,体渲染也叫体积渲染,我们常听说的科学可视化中,利用CT图像进行三维重建的这项任务,就是借助体渲染完成的,渲染效果如下图所示:

    (配图)

    光线投射的做法:从人眼(或者摄像机)穿过分辨率网中的像素点,发射光线进入三维场景中,这条光线将一直延伸到给定的终点,光线中途会穿透一切东西,所以光路是直的。然后对这条光路以固定步长来逐个选取采样点,看看采样点有没有穿过体数据,有的话就根据对周围的体数据采样结果来计算贡献值(例如该采样点处的颜色和透明度等,通过插值计算),接着将所有采样点的贡献值汇总叠加在一起作为这条光路的结果值,也就是对应像素的颜色值。每个像素都这么处理完就意味着渲染完毕。

    上面的过程中,只有最初时投射出光线进入场景,而没有光线在场景中反射,也就是更像我们做X光那样只有光线的直线穿透,没有模拟光线的物理传播行为,因此严格地也说不上是光线追踪渲染。

    经典光线追踪(Classic Ray Tracing)

    前文也说过,我们直接百度搜索光线追踪的话,最经常见到的介绍或者原理图,就是这种光线追踪,而经典光线追踪和递归光线追踪这两种也是最容易让刚学习的人搞乱原理,所以要搞清楚光线追踪,很重要的一点就是要清晰地分清楚这两种。

    先说经典光线追踪会用来做什么的,用得最多的地方在科学可视化工具领域中,我比较熟悉的是分子可视化工具,工具中用到的光线追踪渲染几乎就是经典光线追踪,而且很早就开始支持光线追踪渲染,并非近几年才开始支持,当然其他领域的可视化工具也是大多使用经典光线追踪。另外在科学可视化领域中如果要渲染出高质量的出版物图像的话(例如发表文章中的配图),也会使用到经典光线追踪。

    更多相关内容
  • 实时光线追踪 用OpenGL片段着色器实现。 main.cpp源文件中的场景设置。 特征 包含以下几何原语: 领域 盒子 戒指 飞机 圆环面 二次曲面: 椭圆体 锥体 圆筒 椭圆抛物面 双曲抛物面 椭圆双曲面 还: SMAA抗锯齿 ...
  • 光线追踪:按照https://github.comRayTracing实施光线追踪渲染器
  • 简单的二维光线追踪程序,使用并行渲染,添加发光、阴影和反射效果
  • 提议的光线追踪器允许创建简单的合成场景并从不同的相机位置渲染它们。 对象的某些属性(位置、方向、大小)可以定义为常数或时间函数。 实际引擎支持纹理映射和抗锯齿(尚不支持阴影、反射和折射)。 光线追踪器...
  • 你可能认为直接模拟这个过程是个制作图像的... 本质问题不是前向光线追踪不好,而是从光源来的大部分光子对想要绘制的图像都没有帮助。从占用计算资源的角度来说,跟随无用的光子的代价太过于昂贵了。  对于计算效率
  • 光线追踪
  • 我们的目标是为各向同性,均质各向异性和非均质各向同性GRIN介质提供一种易于使用的光学光线示踪剂,该介质可以主要由python脚本控制,并提供足够的接口类和功能以集成到GUI中。 要求 您需要安装NumPy,SciPy,Yaml...
  • 内含三本英文原版的有关光线追踪相关的PDF书籍,对图形渲染学、游戏引擎开发等非常有参考意义
  • 用PyTorch实现的光线追踪
  • 光线追踪算法的c++实现,基于CPU单线程的算法,使用OpenGL辅助显示。可以定义材质的反射和折射特性,有球面和三角面两种基本类型。程序主要实现了光线的采样和传播,但目前的模型搜索采用简单的遍历,因此不适用大...
  • 我的光线追踪器 GLSL 光线追踪器 使用 make 编译项目。 跑步: ./render (-bvh) (-path 1) -input raytracing.scene (-output result.bmp) -bvh:绑定卷层次加速 -path number:用路径跟踪器替换简单跟踪器。 ...
  • C语言成像与光线追踪程序设计,光学追踪程序的编写,光学
  • Raytracer - 用 Ja​​va 编写的光线追踪器 这个项目最初是我在大学时为我的计算机图形课程分配的。 它最初是与 Ignacio Luciani 和 Alejandro Boldt 一起编写的。 最初的任务是创建一个光线追踪器,它可以加载 .sc ...
  • 光线追踪

    2021-02-07 20:31:32
    光线追踪
  • 光线追踪

    2021-02-19 17:53:36
    光线追踪
  • 采用的语言是c++,利用面向对象的思想,一些基础的线性代数和空间几何的知识也会用到,编程的框架用的是GLFW,渲染用到的是OpenGL
  • 光线追踪入门

    2021-06-30 07:13:49
    这里同学们应该理解到的有一个点,第一光线追踪不是唯一的成像方式,第二它与传统的GPU成像或者说 计算机图形学里说的那些光栅化之类的从思路上就有区别,第三光线追踪是最简单的成像方式之一,大概你学完高中数学就...
  • 用于从具有指定折射率的传播区域中的固定点发射一束光线的函数。 提供了带有示例的文档以说明无线电束在地球大气中的传播和传播。
  • 光线追踪3D图像渲染软件项目 文件内容 bin是一个包含所有编译文件的空文件夹; include包含函数头文件; lib包含提供的静态库(为您的 Linux 环境编译); scenes包含软件应该能够读取的场景文件; src包含用 C ...
  • 课程作业写的光线追踪算法 包含说明文档C++代码编写场景文件包含 球体 三角形 平面 光源 材料质 镜面 漫反射
  • sphere-tracer - 一个简单的光线追踪器 早在 1999 年,呃,我写了一个非常简单的光线追踪器。 它追踪球体。 除了球体什么都没有。 闪亮的球体。 如果您看过我的 excel-ray-tracer 存储库,您可能已经猜到我喜欢 ray...
  • Optical_bench - 用于构建光学系统的简单光线追踪工具带有透镜、狭缝、透射光栅、Kong径和屏幕。 可以用光线对一般形状的透镜进行建模输入任意角度。 构建的几个简单示例是给。 112 Sellmeier 和包括大原眼镜。
  • 3DMAX插件 Raytrace光线追踪替换成VRayMap(+关闭对话框)
  • 线串的matlab代码光线追踪光线追踪代码 通过基于表面的几何体传播光线。 表面由其几何形状和光学特性定义。 支持的几何图形包括线性、二次曲面和环形曲面的截面,以及平面、圆柱体和球体的简单实现快捷方式。 ...
  • 用于教育和小型项目设计的python中的几何光学光线追踪。 这是一个简单的,具有alpha质量的项目,没有当前的未来开发计划。 另请参阅:GeOptics 特征 使用小型光学零件库(镜头,镜子,棱镜)进行光线追踪 Shott和...
  • RTv1:光线追踪

    2021-03-20 18:15:13
    RTv1 光线追踪 该项目的目标是根据Raytracing协议生成图像。这些计算机生成的图像将分别代表一个场景,从特定的角度和位置看,由简单的几何对象定义,并且每个图像都有自己的照明系统。
  • 介绍 这开始是 2015 年Spring高级计算机图形学课程(Bruce Maxwell 教授)的最终项目,但随着我继续开发它,此项目已成为个人项目。 以下是描述过程和实现的文章; 显然,这是一项正在进行的工作,因此毫无疑问,...
  • 这是一个使用 ac/mex 体积渲染器的演示。 3D 体积由光线追踪算法渲染。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 10,289
精华内容 4,115
关键字:

光线追踪

友情链接: MITKtest2.zip