光线追踪算法实现
我们已经涵盖了所有要说的内容! 我们现在准备编写第一个光线追踪器。 你现在应该能够猜测光线追踪算法是如何工作的。
首先,请花点时间注意一下,光在自然界中的传播只是从光源发出的无数光线,它们四处反弹,直到到达我们眼睛的表面。 因此,光线追踪非常优雅,因为它直接基于我们周围发生的事情。 除了它以相反的顺序遵循光路这一事实之外,它不亚于一个完美的自然模拟器。
NSDT工具推荐: Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器 - REVIT导出3D模型插件 - 3D模型语义搜索引擎
光线追踪算法获取由像素组成的图像。 对于图片中的每个像素,它都会向场景中发射主光线。 该主光线的方向是通过追踪从眼睛到该像素中心的线来获得的。 一旦我们设置了主光线的方向,我们就会检查场景中的每个对象,看看它是否与其中任何一个对象相交。 在某些情况下,主光线将与多个对象相交。 当发生这种情况时,我们选择交点最接近眼睛的对象。 然后,我们从交点向光源发射阴影光线(图 1):
图 1:我们通过像素中心发射主光线来检查可能的物体相交。 当我们找到一个点时,我们会投射阴影射线来确定该点是被照亮还是在阴影中
如果该光线在到达光源的途中未与物体相交,则命中点将被照亮。 如果它与另一个对象相交,该对象就会在其上投射阴影(图 2):
图 2:小球体在大球体上投射阴影。 阴影光线在到达光源之前与小球体相交
如果我们对每个像素重复此操作,就会获得三维场景的二维表示(图 3):
图 3:为了渲染帧,我们为帧缓冲区的每个像素发射主光线这是该算法的伪代码实现:
这是该算法的伪代码实现:
for (int j = 0; j < imageHeight; ++j) { for (int i = 0; i < imageWidth; ++i) { // compute primary ray directionRay primRay; computePrimRay(i, j, &primRay); // shoot prim ray in the scene and search for the intersectionPoint pHit; Normal nHit; float minDist = INFINITY; Object object = NULL; for (int k = 0; k < objects.size(); ++k) { if (Intersect(objects[k], primRay, &pHit, &nHit)) { float distance = Distance(eyePosition, pHit); if (distance < minDistance) { object = objects[k]; minDistance = distance; //update min distance } } } if (object != NULL) { // compute illuminationRay shadowRay; shadowRay.direction = lightPosition - pHit; bool isShadow = false; for (int k = 0; k < objects.size(); ++k) { if (Intersect(objects[k], shadowRay)) { isInShadow = true; break; } } } if (!isInShadow) pixels[i][j] = object->color * light.brightness; else pixels[i][j] = 0; }
}
正如我们所看到的,光线追踪的美妙之处在于它只需要几行代码即可; 一个人可以用 200 行写出一个基本的光线追踪器。 与其他算法(例如扫描线渲染器)不同,光线追踪只需很少的努力即可实现。
Arthur Appel 于 1969 年在一篇题为“实体着色机器渲染的一些技术”的论文中首次描述了这项技术。 那么,如果这个算法如此美妙,为什么它没有取代所有其他渲染算法呢? 当时(甚至在某种程度上,今天)主要原因是速度。 正如阿佩尔在他的论文中提到的:
这种方法非常耗时,通常需要比线框图多数千倍的计算时间才能获得有益的结果。 大约一半的时间用于确定投影和场景的点对点对应关系。
换句话说,它很慢(正如 Kajiya - 所有计算机图形学历史上最有影响力的研究人员之一 - 曾经说过:“光线追踪并不慢 - 计算机才是”)。 找到光线和几何体之间的交点非常耗时。 几十年来,算法的速度一直是光线追踪的主要缺点。 然而,随着计算机变得越来越快,这不再是一个问题。 尽管仍然必须说一件事:与其他技术(例如 z 缓冲区算法)相比,光线追踪仍然要慢得多。 然而,如今有了快速的计算机,我们可以在几分钟或更短的时间内计算出过去需要一小时的帧。 实时和交互式光线追踪器是一个热门话题。
总而言之,必须记住渲染例程可以被视为两个独立的进程。 第一个步骤确定对象表面的某个点从特定像素(可见性部分)是否可见,第二个步骤对该点进行着色(着色部分)。 不幸的是,这两个步骤都需要昂贵且耗时的射线几何相交测试。 该算法优雅而强大,但迫使我们以渲染时间换取准确性,反之亦然。 自从阿佩尔发表他的论文以来,人们已经进行了大量研究来加速射线与物体的相交例程。 随着计算机变得更加强大并与这些加速技术相结合,光线追踪变得可以在日常生产环境中使用,并且按照当今的标准,它是大多数(如果不是全部)渲染离线软件所使用的事实上的方法。 视频游戏引擎仍在使用光栅化算法。 然而,随着最近 GPU 加速光线追踪(2017-2018)和 RTX 技术的出现,实时光线追踪也已成为可能。 虽然一些视频游戏已经提供了可以打开光线追踪的模式,但它仅限于简单的效果,例如清晰的反射和阴影。
原文链接:光线追踪算法实现 - BimAnt
相关文章:

光线追踪算法实现
我们已经涵盖了所有要说的内容! 我们现在准备编写第一个光线追踪器。 你现在应该能够猜测光线追踪算法是如何工作的。 首先,请花点时间注意一下,光在自然界中的传播只是从光源发出的无数光线,它们四处反弹,直到到达我…...

学习深度强化学习---第3部分----RL蒙特卡罗相关算法
文章目录 3.1节 蒙特卡罗法简介3.2节 蒙特卡罗策略评估3.3节 蒙特卡罗强化学习3.4节 异策略蒙特卡罗法 本部分视频所在地址:深度强化学习的理论与实践 3.1节 蒙特卡罗法简介 在其他学科中的蒙特卡罗法是一种抽样的方法。 如果状态转移概率是已知的,则是…...
linux虚拟机使用81-persistent-net.rule后接口名依然改变的问题处理
测试环境:vmware workstation17 、oracle linux 7.8 1. 复位原有ifname 1)nmcli c s 查看管理的网卡 [rootrac2 ~]# nmcli c s NAME UUID TYPE DEVICE enp0s3 5b01a9de-9552-45da-a84a-1ae6c9506354…...
ARMV8 - A64 - 跳转和返回指令
说明 C语言等高级语言,根据是否需要返回到触发跳转代码的下一条代码,跳转有两种语句: 不需要返回,例如:if,goto,switch,while等语句。需要返回,例如:函数调…...

QX320F28335,自研内核指令集,主频150MHz,自研工具链,纯国产DSP,硬件兼容TMS320F28335
32位单核CPU 主频150MHz flash 1M SRAM 500KB 单精度浮点运算FPU 3个4M精度12位的ADC 12个ePWM 6个HRPWM(150ps)...

《使用ThinkPHP6开发项目》 - 登录接口一
《使用ThinkPHP6开发项目》 - 安装ThinkPHP框架-CSDN博客 《使用ThinkPHP6开发项目》 - 设置项目环境变量-CSDN博客 《使用ThinkPHP6开发项目》 - 项目使用多应用开发-CSDN博客 《使用ThinkPHP6开发项目》 - 创建应用-CSDN博客 《使用ThinkPHP6开发项目》 - 创建控制器-CSD…...

zabbix精简模板
一、监控项目介绍 linux自带得监控项目比较多,也不计较杂,很多监控项目用不到。所以这里要做一个比较精简得监控模版 二、监控模板克隆 1.搜索原模板 2.克隆模板 全克隆模板,这样就和原来原模板没有联系了,操作也不会影响原模…...
GO设计模式——14、代理模式(结构型)
目录 代理模式(Proxy Pattern) 代理模式的核心角色: 优缺点 使用场景 注意事项 代码实现 代理模式(Proxy Pattern) 代理模式(Proxy Pattern)通过引入代理对象来控制对真实对象的访问。 代…...

外贸SOHO建站怎么做?海洋建站方法策略?
外贸SOHO建站多少钱?外贸自助建站系统有哪些? 随着全球化的加速发展,外贸SOHO已经成为越来越多创业者的选择。然而,要想在竞争激烈的外贸市场中脱颖而出,一个专业的外贸网站是必不可少的。接下来海洋建站将探讨外贸SO…...

商城免费搭建之java鸿鹄云商 java电子商务商城 Spring Cloud+Spring Boot+mybatis+MQ+VR全景+b2b2c
鸿鹄云商 SAAS云产品概述 1. 涉及平台 平台管理、商家端(PC端、手机端)、买家平台(H5/公众号、小程序、APP端(IOS/Android)、微服务平台(业务服务) 2. 核心架构 Spring Cloud、Spring Boot、My…...

【淘宝网消费类电子产品销售数据可视化】
淘宝网消费类电子产品销售数据可视化 引言数据爬取与处理数据可视化系统功能1. 总数据量分析2. 店铺总数据3. 店铺销售额排名4. 不同电子商品销售价格5. 单个商品价格排名6. 不同省份平均销量7. 不同地区的平均销售额8. 省份数量9. 每个省份有用的平均个数 创新点结语 引言 随…...
AI编译器及TVM概述
AI编译器 AI编译器有许多不同的类型和品牌,以下是一些常见的AI编译器: TensorFlow:谷歌开发的深度学习框架,它包含了一个用于优化和编译TensorFlow模型的编译器。 PyTorch:一个基于Python的开源深度学习框架…...

排序-归并排序与计数排序
文章目录 一、归并排序1、概念2、过程3、代码实现4、复杂度5、稳定性 二、 计数排序1、思路2、代码实现3、复杂度:4、稳定性 一、归并排序 1、概念 是建立在归并操作上的一种有效,稳定的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已…...

国产数据库适配-人大金仓(kingbase V8R3)
金仓数据库是基于POSTGRE_SQL 参考资料 国产数据库人大金仓踩坑记录和函数适配_金仓数据库关系不存在-CSDN博客 Springboot工程 适配人大金仓 kingbase V8R3 引入驱动包和方言包 hibernate-5.2.17.Finaldialect.jar kingbase8-8.2.0.jar application.yml文件 driver-cla…...

HAAS 哈斯机床 读写刀补数据
哈斯机床不管是串口机床还是网口机床 都提供了Q命令 可以使用Q命令 进行刀具补偿的读取和写入 最多支持200把刀的 读取和写入...

Visual studio+Qt开发环境搭建以及注意事项和打开qt的.pro项目
下载qt-然后安装5.14.2_msvc2017 不知道安装那个就全选5.14.2的父级按钮 https://download.qt.io/archive/qt/5.14/5.14.2/ 安装Visual studio,下载直接下一步就行 配置Visual studio的qt环境 在线安装-重启Visual studio会自动安装 离线安装-关闭Visual studio点击安装 关闭…...

BUUCTF crypto做题记录(4)新手向
目录 一、大帝的密码武器 二、Windows系统密码 三、信息化时代的步伐 四、凯撒?替换?呵呵! 一、大帝的密码武器 下载的文件叫zip,应该是提示文件的后缀名是zip,把名字改成1.zip或者其他也行,主要保证后缀名是zip就…...
【ArcGIS微课1000例】0080:ArcGIS将shp转json(geojson)案例教程
本文以案例的形式,讲述在ArcGIS软件中,将矢量数据转为GeoJSON的方法。 扩展阅读:【GIS风暴】GeoJSON数据格式案例全解 文章目录 一、GeoJson简介二、ArcGIS将矢量数据转为GeoJSON一、GeoJson简介 GeoJSON是一种基于JSON的地理空间数据交换格式,它定义了几种类型JSON对象以…...

阿里云Centos8安装Dockers详细过程
一、卸载旧版本 较旧的 Docker 版本称为 docker 或 docker-engine 。如果已安装这些程序,请卸载它们以及相关的依赖项。 yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \do…...
leetcode 二数之和 三数之和 四数之和
leetcode 二数之和 三数之和 四数之和 又到了不想写博客的环节,不想归不想,有些事情还是要做的,今天总结的是多数之和的问题。 二数之和 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target …...
解锁数据库简洁之道:FastAPI与SQLModel实战指南
在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...

UDP(Echoserver)
网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法:netstat [选项] 功能:查看网络状态 常用选项: n 拒绝显示别名&#…...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...

如何在看板中有效管理突发紧急任务
在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...
Qt Http Server模块功能及架构
Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...

selenium学习实战【Python爬虫】
selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...
CMake控制VS2022项目文件分组
我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...
LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》
这段 Python 代码是一个完整的 知识库数据库操作模块,用于对本地知识库系统中的知识库进行增删改查(CRUD)操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 📘 一、整体功能概述 该模块…...

【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看
文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...

Golang——9、反射和文件操作
反射和文件操作 1、反射1.1、reflect.TypeOf()获取任意值的类型对象1.2、reflect.ValueOf()1.3、结构体反射 2、文件操作2.1、os.Open()打开文件2.2、方式一:使用Read()读取文件2.3、方式二:bufio读取文件2.4、方式三:os.ReadFile读取2.5、写…...