当前位置: 首页 > news >正文

光线追踪算法实现

我们已经涵盖了所有要说的内容! 我们现在准备编写第一个光线追踪器。 你现在应该能够猜测光线追踪算法是如何工作的。

首先,请花点时间注意一下,光在自然界中的传播只是从光源发出的无数光线,它们四处反弹,直到到达我们眼睛的表面。 因此,光线追踪非常优雅,因为它直接基于我们周围发生的事情。 除了它以相反的顺序遵循光路这一事实之外,它不亚于一个完美的自然模拟器。

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

相关文章:

光线追踪算法实现

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

学习深度强化学习---第3部分----RL蒙特卡罗相关算法

文章目录 3.1节 蒙特卡罗法简介3.2节 蒙特卡罗策略评估3.3节 蒙特卡罗强化学习3.4节 异策略蒙特卡罗法 本部分视频所在地址&#xff1a;深度强化学习的理论与实践 3.1节 蒙特卡罗法简介 在其他学科中的蒙特卡罗法是一种抽样的方法。 如果状态转移概率是已知的&#xff0c;则是…...

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语言等高级语言&#xff0c;根据是否需要返回到触发跳转代码的下一条代码&#xff0c;跳转有两种语句&#xff1a; 不需要返回&#xff0c;例如&#xff1a;if&#xff0c;goto&#xff0c;switch&#xff0c;while等语句。需要返回&#xff0c;例如&#xff1a;函数调…...

QX320F28335,自研内核指令集,主频150MHz,自研工具链,纯国产DSP,硬件兼容TMS320F28335

32位单核CPU 主频150MHz flash 1M SRAM 500KB 单精度浮点运算FPU 3个4M精度12位的ADC 12个ePWM 6个HRPWM&#xff08;150ps&#xff09;...

《使用ThinkPHP6开发项目》 - 登录接口一

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

zabbix精简模板

一、监控项目介绍 linux自带得监控项目比较多&#xff0c;也不计较杂&#xff0c;很多监控项目用不到。所以这里要做一个比较精简得监控模版 二、监控模板克隆 1.搜索原模板 2.克隆模板 全克隆模板&#xff0c;这样就和原来原模板没有联系了&#xff0c;操作也不会影响原模…...

GO设计模式——14、代理模式(结构型)

目录 代理模式&#xff08;Proxy Pattern&#xff09; 代理模式的核心角色&#xff1a; 优缺点 使用场景 注意事项 代码实现 代理模式&#xff08;Proxy Pattern&#xff09; 代理模式&#xff08;Proxy Pattern&#xff09;通过引入代理对象来控制对真实对象的访问。 代…...

外贸SOHO建站怎么做?海洋建站方法策略?

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

商城免费搭建之java鸿鹄云商 java电子商务商城 Spring Cloud+Spring Boot+mybatis+MQ+VR全景+b2b2c

鸿鹄云商 SAAS云产品概述 1. 涉及平台 平台管理、商家端&#xff08;PC端、手机端&#xff09;、买家平台&#xff08;H5/公众号、小程序、APP端&#xff08;IOS/Android&#xff09;、微服务平台&#xff08;业务服务&#xff09; 2. 核心架构 Spring Cloud、Spring Boot、My…...

【淘宝网消费类电子产品销售数据可视化】

淘宝网消费类电子产品销售数据可视化 引言数据爬取与处理数据可视化系统功能1. 总数据量分析2. 店铺总数据3. 店铺销售额排名4. 不同电子商品销售价格5. 单个商品价格排名6. 不同省份平均销量7. 不同地区的平均销售额8. 省份数量9. 每个省份有用的平均个数 创新点结语 引言 随…...

AI编译器及TVM概述

AI编译器 AI编译器有许多不同的类型和品牌&#xff0c;以下是一些常见的AI编译器&#xff1a; TensorFlow&#xff1a;谷歌开发的深度学习框架&#xff0c;它包含了一个用于优化和编译TensorFlow模型的编译器。 PyTorch&#xff1a;一个基于Python的开源深度学习框架&#xf…...

排序-归并排序与计数排序

文章目录 一、归并排序1、概念2、过程3、代码实现4、复杂度5、稳定性 二、 计数排序1、思路2、代码实现3、复杂度&#xff1a;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系统密码 三、信息化时代的步伐 四、凯撒&#xff1f;替换&#xff1f;呵呵! 一、大帝的密码武器 下载的文件叫zip&#xff0c;应该是提示文件的后缀名是zip&#xff0c;把名字改成1.zip或者其他也行&#xff0c;主要保证后缀名是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 。如果已安装这些程序&#xff0c;请卸载它们以及相关的依赖项。 yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \do…...

leetcode 二数之和 三数之和 四数之和

leetcode 二数之和 三数之和 四数之和 又到了不想写博客的环节&#xff0c;不想归不想&#xff0c;有些事情还是要做的&#xff0c;今天总结的是多数之和的问题。 二数之和 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target …...

谷歌浏览器插件

项目中有时候会用到插件 sync-cookie-extension1.0.0&#xff1a;开发环境同步测试 cookie 至 localhost&#xff0c;便于本地请求服务携带 cookie 参考地址&#xff1a;https://juejin.cn/post/7139354571712757767 里面有源码下载下来&#xff0c;加在到扩展即可使用FeHelp…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现

目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...

生成xcframework

打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式&#xff0c;可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...

前端导出带有合并单元格的列表

// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...

el-switch文字内置

el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...

使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装

以下是基于 vant-ui&#xff08;适配 Vue2 版本 &#xff09;实现截图中照片上传预览、删除功能&#xff0c;并封装成可复用组件的完整代码&#xff0c;包含样式和逻辑实现&#xff0c;可直接在 Vue2 项目中使用&#xff1a; 1. 封装的图片上传组件 ImageUploader.vue <te…...

数据库分批入库

今天在工作中&#xff0c;遇到一个问题&#xff0c;就是分批查询的时候&#xff0c;由于批次过大导致出现了一些问题&#xff0c;一下是问题描述和解决方案&#xff1a; 示例&#xff1a; // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...

AI书签管理工具开发全记录(十九):嵌入资源处理

1.前言 &#x1f4dd; 在上一篇文章中&#xff0c;我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源&#xff0c;方便后续将资源打包到一个可执行文件中。 2.embed介绍 &#x1f3af; Go 1.16 引入了革命性的 embed 包&#xff0c;彻底改变了静态资源管理的…...

【Go语言基础【12】】指针:声明、取地址、解引用

文章目录 零、概述&#xff1a;指针 vs. 引用&#xff08;类比其他语言&#xff09;一、指针基础概念二、指针声明与初始化三、指针操作符1. &&#xff1a;取地址&#xff08;拿到内存地址&#xff09;2. *&#xff1a;解引用&#xff08;拿到值&#xff09; 四、空指针&am…...

动态 Web 开发技术入门篇

一、HTTP 协议核心 1.1 HTTP 基础 协议全称 &#xff1a;HyperText Transfer Protocol&#xff08;超文本传输协议&#xff09; 默认端口 &#xff1a;HTTP 使用 80 端口&#xff0c;HTTPS 使用 443 端口。 请求方法 &#xff1a; GET &#xff1a;用于获取资源&#xff0c;…...