Ray Tracing in one Weekend But on CUDA

Ray Tracing in one Weekend But on CUDA

  • 环境说明
  • 项目代码
  • 项目内容
  • 思路
  • 实现方法
  • 效果

环境说明

代码运行在Visual Studio 2019环境,显卡为NVIDIA GeForce GTX 1650,CUDA版本为11.6,cuDNN版本为8.4.0。具体配置方式见CUDA C/C++ 从入门到入土 第一步——让你的CUDA跑起来.

代码参考以下内容:
Accelerated Ray Tracing in One Weekend in CUDA

Ray Tracing in One Weekend

可视计算讲稿16

项目代码

github

项目内容

该项目实现了PathTracing的渲染算法,并提供了四种基本材质(朗伯表面、金属表面、玻璃介质、光源介质),一种物体球体,并提供环境光,相机系统和配套的数学运算。

并为光追渲染算法提供了GPU支持,使速度有所提高。

思路

先实现CPU上的PathTracing算法,然后将项目移植到GPU上。

PathTracing的大致思想为,从相机镜头向幕布处的每个像素发射光线,计算光线进入世界后在不同物体间的折射、反射(镜面、漫反射),并对光照强度进行积分,最终取多条光线的平均值即可。

CUDA编程的思路需要并行。在光追中可以并行的部分在于计算每个像素的颜色,即可以将原先计算像素颜色的循环并行计算。即每个CUDA核心的一个线程计算一个像素的颜色。在所有线程执行完毕之后,将数据从GPU转移到CPU上并进行保存。

实现方法

C++版本PathTracing。利用基本的C++代码,造轮子。需要说明的是,光追函数需要限制递归的次数(否则有小概率导致无限递归,虽然在这个例子里大概率不可能),同时对输出结果进行gamma校正从而保证生成图像的颜色质量。在判断光线与物体相交的过程中,需要利用法线来判断相交的位置是在物体表面外还是物体内。

CUDA版本的PathTracing做出了以下优化:

  • 光追函数利用并行计算,加速效率。
  • 光线路径追踪函数的递归展开,从而加快运行效率。
  • 对随机数进行重写(因为CUDA并行需要每个线程一个随机数种子)

需要注意的是,在CUDA编程过程中,需要注意device和host的关系,尤其需要注意内存的位置,以及申请的内存位于哪里?否则会出现严重的内存泄露以及段错误。

还需要注意的是,在进行Render之前,需要统一进度,保证各个线程的世界包含相同的内容。在Render之后,也需要保证所有线程运行完毕后,再进行内存复制到Host。

效果

测试效果,其中三个球的材质分别为光源、玻璃、朗伯表面(由近到远)。迭代次数为10.光照强度为1.
在这里插入图片描述

最终效果
迭代次数400,光源材质光强为2.0
在这里插入图片描述

迭代次数50,光源材质光强为2.0
在这里插入图片描述

迭代次数10,且光源材质光强为2

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

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

相关文章

所有人都可以做的副业兼职,短剧推广,1天挣几百,附详细方法!

自从上次向大家介绍了短剧掘金项目以来,便陆续收到了众多朋友的询问:现在是否还能加入短剧掘金的大军?答案是肯定的。目前,无论是各大视频平台还是其他渠道,短剧掘金项目都呈现出蓬勃发展的态势。而且,相关…

Seq2Seq模型:详述其发展历程、深远影响与结构深度剖析

Seq2Seq(Sequence-to-Sequence)模型是一种深度学习架构,专为处理从一个输入序列到一个输出序列的映射任务设计。这种模型最初应用于机器翻译任务,但因其灵活性和有效性,现已被广泛应用于自然语言处理(NLP&a…

PageHelper多数据源无法自动切换数据源问题解决

在使用PageHelper进行分页处理的过程中,通过配置autoRuntimeDialect: true发现,在执行MySQL分页处理后,继续执行SqlServer的分页,使用的仍然是MySQL的语法,PageHelper并没有进行自动切换数据源处理。 在查看源码的时候…

Kaggle线上零售 CRM分析(RFM+BG-NBD+生存分析+PySpark)

数据集地址:数据集地址 我的NoteBook地址:NoteBook地址 这个此在线零售数据集包含2009年12月1日至2011年12月9日期间的在线零售的所有交易。该公司主要销售独特的各种场合礼品。这家公司的许多客户都是批发商。本文将通过pyspark对数据进行导入与预处理&…

TVS管的功率计算与选型

“选择多大功率的TVS管才算合适?”。关于TVS功率的选择,不晓得之前你考虑过没。反正我这边是感觉网上关于TVS管参数、选型等文章比较多,但关于TVS管功率计算及功率选型的文章比较少。但往往在这些点上更能体现面试者的功力。 研究过TVS规格书…

9-Django项目--验证码操作

目录 templates/login/login.html utils/code.py views/login.py 验证码 生成验证码 code.py 应用验证码 views.py login.html templates/login/login.html {% load static %} <!DOCTYPE html> <html lang"en"> <head><meta charset&q…

Polar Web【简单】login

Polar Web【简单】login 本文旨在记录此题的探索和解决过程。 Contents Polar Web【简单】login探索&思路EXP (python)结果&总结 探索&思路 查看源码&#xff0c;发现存在用户信息泄露。尝试用获取信息登录&#xff0c;显示成功&#xff0c;但其后没有可做的操作。…

【力扣】不相交的线

一、题目描述 二、题目解析 根据上图及题目给出的示例&#xff0c;我们不难发现&#xff0c;我们其实要找的就是两个数组中的最长公共子序列的长度。 因此&#xff0c;本题我们就可以直接转化为求两个数组中的最长公共子序列的长度。 对于 最长公共子序列问题&#xff0c;可…

Java Socket 网络编程实例(阻塞IO、非阻塞IO、多路复用Selector、AIO)

文章目录 1. 概述2. TCP 阻塞式IO 网络编程实例2.1 TCP网络编程服务端2.2 ByteBufferUtil2.3 客户端代码2.4 运行截图 3. TCP 非阻塞式IO 网络编程实例3.1 服务端3.2 客户端3.3 运行截图 4. 多路复用4.1 服务器端4.2 客户端4.3 运行截图 5. AIO5.1 AIO 服务端5.2 客户端5.3 运行…

【Python】Python异步编程

Python 异步编程 异步编程 异步编程是一种编程范式&#xff0c;通过非阻塞的方式执行任务&#xff0c;允许程序在等待某些操作&#xff08;如I/O操作、网络请求、数据库查询等&#xff09;完成时&#xff0c;继续执行其他任务。这与同步编程&#xff08;或阻塞编程&#xff09…

【图像处理与机器视觉】XJTU期末考点

题型 选择&#xff1a;1 分10 填空&#xff1a;1 分15 简答题&#xff08;也含有计算和画图&#xff09;&#xff1a;10 分*4 计算题&#xff1a;15 分20 分 考点 选择题&#xff08;部分&#xff09; 数字图像处理基础 p(x,y),q(s,t)两个像素之间的距离由公式&#xff1a…

知乎x-zse-96、x-zse-81

声明 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01;wx a15018601872 本文章未…

GraphQL(2):使用express和GraphQL编写helloworld

1 安装express、graphql以及express-graphql 在项目的目录下运行一下命令。 npm init -y npm install express graphql express-graphql -S 2 新建helloworld.js 代码如下&#xff1a; const express require(express); const {buildSchema} require(graphql); const grap…

spring mvc 中怎样定位到请求调用的controller

前言 在java web开发过程中&#xff0c;正常情况下controller都是我们自己写的&#xff0c;我们可以很方便的定位到controller的位置。但是有些时候我们引入的其他依赖中可能也有controller&#xff0c;为了找到并方便的调试jar包中的controller&#xff0c;我们一般会进行全局…

基于Java的零食管理系统的设计与实现(论文+源码)_kaic

摘 要 随着科技的进步&#xff0c;以及网络的普及&#xff0c;都为人们的生活提供了极大的方便。因此&#xff0c;在管理”三姆”宿舍在线零食商店时&#xff0c;与现代的网络联系起来是非常必要的&#xff0c;本次设计的系统在研发过程中应用到了Java技术&#xff0c;这在一定…

windows10系统64位安装delphiXE11.2完整教程

windows10系统64位安装delphiXE11.2完整教程 https://altd.embarcadero.com/download/radstudio/11.0/radstudio_11_106491a.iso XE11.1 https://altd.embarcadero.com/download/radstudio/11.0/RADStudio_11_2_10937a.iso XE11.2 关键使用文件在以下内容&#xff1a;windows10…

现代信号处理12_谱估计的4种方法(CSDN_20240602)

Slepian Spectral Estimator(1950) 做谱估计的目标是尽可能看清楚信号功率谱在某一个频率上的情况&#xff0c;假设我们想了解零频时的分布&#xff0c;最理想的情况是滤波器的传递函数H(ω) 是一个冲激函数&#xff0c;这样就没有旁瓣&#xff0c;也就没有泄漏&#xff1b;其次…

回溯算法 -- 216. 组合总和 III

目录 一.题目描述 二.解题思路 三.回溯三部曲 3.1确定递归函数的参数 3.2确认递归的终止条件 3.3确定单层循环逻辑 四.具体的代码 一.题目描述 找出所有相加之和为 n 的 k 个数的组合&#xff0c;且满足下列条件&#xff1a; 只使用数字1到9每个数字 最多使用一次 返…

经典的滑动窗口的题目 力扣 2799. 统计完全子数组的数目(面试题)

给你一个由 正 整数组成的数组 nums 。 如果数组中的某个子数组满足下述条件&#xff0c;则称之为 完全子数组 &#xff1a; 子数组中 不同 元素的数目等于整个数组不同元素的数目。 返回数组中 完全子数组 的数目。 子数组 是数组中的一个连续非空序列。 示例 1&#xff1…

【1】AI介绍

迎接 AGI 时代 AGI(Artificial General Intelligence),人工通用智能,AGI是一种可以执行复杂任务的人工智能,能够完全模仿人类智能的行为。应用领域涉及医疗、交通、智能家居等多个与人类活动密切相关的领域。 AGI 多久会到来? 乐观预测:明年(未来已来)主流预测:3-5…