Ray Tracing in one Weekend But on CUDA

2024-06-03 08:04
文章标签 cuda one ray tracing weekend

本文主要是介绍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

这篇关于Ray Tracing in one Weekend But on CUDA的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1026413

相关文章

图解可观测Metrics, tracing, and logging

最近在看Gophercon大会PPT的时候无意中看到了关于Metrics,Tracing和Logging相关的一篇文章,凑巧这些我基本都接触过,也是去年后半年到现在一直在做和研究的东西。从去年的关于Metrics的goappmonitor,到今年在排查问题时脑洞的基于log全链路(Tracing)追踪系统的设计,正好是对这三个话题的实践。这不禁让我对它们的关系进行思考:Metrics和Loggi

PyInstaller问题解决 onnxruntime-gpu 使用GPU和CUDA加速模型推理

前言 在模型推理时,需要使用GPU加速,相关的CUDA和CUDNN安装好后,通过onnxruntime-gpu实现。 直接运行python程序是正常使用GPU的,如果使用PyInstaller将.py文件打包为.exe,发现只能使用CPU推理了。 本文分析这个问题和提供解决方案,供大家参考。 问题分析——找不到ONNX Runtime GPU 动态库 首先直接运行python程序

pytorch torch.nn.functional.one_hot函数介绍

torch.nn.functional.one_hot 是 PyTorch 中用于生成独热编码(one-hot encoding)张量的函数。独热编码是一种常用的编码方式,特别适用于分类任务或对离散的类别标签进行处理。该函数将整数张量的每个元素转换为一个独热向量。 函数签名 torch.nn.functional.one_hot(tensor, num_classes=-1) 参数 t

leetcode#66. Plus One

题目 Given a non-negative integer represented as a non-empty array of digits, plus one to the integer. You may assume the integer do not contain any leading zero, except the number 0 itself. The digi

CUDA:用并行计算的方法对图像进行直方图均衡处理

(一)目的 将所学算法运用于图像处理中。 (二)内容 用并行计算的方法对图像进行直方图均衡处理。 要求: 利用直方图均衡算法处理lena_salt图像 版本1:CPU实现 版本2:GPU实现  实验步骤一 软件设计分析: 数据类型: 根据实验要求,本实验的数据类型为一个256*256*8的整型矩阵,其中元素的值为256*256个0-255的灰度值。 存储方式: 图像在内存中

ffmpeg安装测试(支持cuda支持SRT)

文章目录 背景安装ffmpeg直接下载可执行文件选择版本选择对应系统版本下载测试Linux下安装 查看支持协议以及编码格式 常见错误缺少 libmvec.so.1LD_LIBRARY_PATH 错误 GPU加速测试SRT服务器搭建下载srs5.0源码解压安装配置启动 SRT推流测试SRT播放测试 背景 在音视频开发测试中,FFmpeg是一个不可或缺的工具,它以其强大的音视频处理

Java后端分布式系统的服务调用链路分析:Distributed Tracing

Java后端分布式系统的服务调用链路分析:Distributed Tracing 大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿! 在分布式系统中,服务之间的调用关系错综复杂,Distributed Tracing(分布式追踪)技术可以帮助我们清晰地追踪请求在系统中的流转路径,分析性能瓶颈和故障原因。 分布式追踪概述 分布式追踪通过为每个请求生成唯一的追踪

One-Shot Imitation Learning

发表时间:NIPS2017 论文链接:https://readpaper.com/pdf-annotate/note?pdfId=4557560538297540609&noteId=2424799047081637376 作者单位:Berkeley AI Research Lab, Work done while at OpenAI Yan Duan†§ , Marcin Andrychow

【FFMPEG】Install FFmpeg CUDA gltransition in Ubuntu

因为比较复杂,记录一下自己安装过程,方便后续查找,所有都是在docker环境安装cuda11.7的 **ffmpeg 4.2.2 nv-codec-headers-9.1.23.3 ** 手动下载安装吧 https://github.com/aperim/docker-nvidia-cuda-ffmpeg/blob/v0.1.10/ffmpeg/Dockerfile最好手动一个一个安装,错误跳