大家好,本文基于WebGPU的计算着色器实现了基础的路径追踪器,支持Middle BVH和No BVH两种加速结构

我主要是将离线渲染零基础实战开发培训班(一期)->第二十九节课的代码移植到WebGPU中,其中的原理可以看该课程

本文实现的代码在这里

实现的功能

本文实现了下面的功能:

  • no bvh or middle bvh
  • path tracer
  • direct light sample
  • lambertian+specular material
  • corner box scene

场景中的球和地板是specular material,完全镜面反射;

墙是labertian material,漫反射

目前的性能是:

硬件(2015年的Mac Pro):

Mac OS Big Sur 11.4操作系统

Canary浏览器

Intel Iris Pro 1536 MB集成显卡

FPS: 9

渲染结果:

目前遍历BVH的性能还不到不用BVH的一半

不用BVH的遍历是指直接遍历所有的三角形的AABB;

BVH的遍历是指先遍历Top Level(BVH树),然后再遍历对应的BVH树叶节点包含的Bottom Level(三角形的AABB)

遍历BVH的性能主要在下面几个方面提升:

1.尽量减少重叠的AABB

2.通过traverse order等方法来减少遍历的BVH节点数量

3.减少显存占用和IO

对于第二个方面,我已经使用了traverse order,即判断ray和aabb相交的tMin如果大于intersectResult.t的话,则不再进入该AABB里继续判断相交了。

但这并没有提升FPS,这是因为我使用的corner box场景简单,本来AABB数量就少,所以这不是性能热点

对于第一个方面,因为我使用的是最简单的Middle BVH来构造的BVH树,重叠的AABB很多。但这也不是主要的性能热点,还是因为AABB数量少

主要的性能热点应该在第三个方面,因为遍历BVH需要使用Stack来保存节点,而每个线程(一个像素对应一个线程)都要在显存中分配一个Stack的内存空间,并且不断有进栈出栈操作,IO压力也大

作为测试,我将Stack的深度降低后(Stack是一个数组,要预先固定深度,也就是设置固定的数组大小),FPS明显提升

以前我实现过Ray Packet来优化这个方面,即一个线程组中的8*8个线程共享同一个Stack。

但是这只适合于Primary Ray的相交,次级射线的相交就不适合了,因为它们发射的方向很不一样。

或许可以对次级射线进行排序,相似方向的射线为一组,然后每组就可以使用Ray Packet来实现共享同一个Stack。

下一步

实现下面的功能:

从0开发WebGPU渲染引擎:实现路径追踪的更多相关文章

  1. 移动端H5开发 之 渲染引擎

    渲染引擎 浏览器渲染引擎,负责解析 HTML, CSS,javascript的DOM部分,如桌面浏览器一般手机端也有4个比较重要的渲染引擎 Gecko,Trident,WebKit,Blink . 黑 ...

  2. 全局光照:光线追踪、路径追踪与GI技术进化编年史

    全局光照(Global Illumination,简称 GI), 作为图形学中比较酷的概念之一,是指既考虑场景中来自光源的直接光照,又考虑经过场景中其他物体反射后的间接光照的一种渲染技术. 大家常听到 ...

  3. 从0开发3D引擎(二):准备预备知识

    大家好,本文介绍了开发3D引擎需要的预备知识,给出了相关的资源. 上一篇博文 从0开发3D引擎(一):开篇 了解Web 3D Web 3D的历史 目前Web 3D是基于WebGL这个Web端3D AP ...

  4. 用函数式编程,从0开发3D引擎和编辑器(一)

    介绍 大家好,欢迎你踏上3D编程之旅- 本系列的素材来自我们的产品:Wonder-WebGL 3D引擎和编辑器 的整个开发过程,探讨了在从0开始构建3D引擎和编辑器的过程中,每一个重要的功能点.设计方 ...

  5. 用函数式编程,从0开发3D引擎和编辑器(三):初步需求分析

    大家好,本文介绍了Wonder的高层需求和本系列对应的具体功能点. 确定Wonder高层需求 业务目标 Wonder是web端3D开发的解决方案,包括引擎.编辑器,致力于打造开放.分享.互助的生态. ...

  6. 从0开发3D引擎(一):开篇

    介绍 大家好,本系列带你踏上Web 3D编程之旅- 本系列是实战类型,从0开始带领读者写出"良好架构.良好扩展性.最小功能集合(MVP)" 的3D引擎. 本系列的素材来自我们的产品 ...

  7. 从0开发3D引擎(四):搭建测试环境

    目录 上一篇博文 了解自动化测试 单元测试 集成测试 端对端测试 通过打印日志来调试 了解运行测试 断点调试 通过Spector.js测试WebGL 通过log调试Shader 移动端测试 了解性能测 ...

  8. 从0开发3D引擎(八):准备“搭建引擎雏形”

    大家好,现在开始本系列的第三部分,按照以下几个步骤来搭建引擎雏形: 1.分析引擎的需求 2.实现最小的3D程序 3.从中提炼引擎原型 4.一步一步地对引擎进行改进,使其具备良好的架构 5.实现与架构相 ...

  9. 从0开发3D引擎(九):实现最小的3D程序-“绘制三角形”

    目录 上一篇博文 运行测试截图 需求分析 目标 特性 头脑风暴 确定需求 总体设计 具体实现 新建Engine3D项目 实现上下文 实现_init 实现"获得WebGL上下文" 实 ...

  10. 从0开发3D引擎(十):使用领域驱动设计,从最小3D程序中提炼引擎(上)

    目录 上一篇博文 下一篇博文 前置知识 回顾上文 最小3D程序完整代码地址 通用语言 将会在本文解决的不足之处 本文流程 解释本文使用的领域驱动设计的一些概念 本文的领域驱动设计选型 设计 引擎名 识 ...

随机推荐

  1. TF-IDF定义及实现

    TF-IDF定义及实现 定义 ​ TF-IDF的英文全称是:Term Frequency - Inverse Document Frequency,中文名称词频-逆文档频率,常用于文本挖掘,资讯检索等 ...

  2. Shell在日常工作中的应用实践

    作者:京东物流 李光新 1 Shell可以帮我们做什么 作为一名测试开发工程师,在与linux服务器交互过程中,大都遇到过以下这些问题: •一次申请多台服务器,多台服务器需要安装相同软件,配置相同的环 ...

  3. Rust中的函数指针

    什么是函数指针 通过函数指针允许我们使用函数作为另一个函数的参数.函数的类型是 fn (使用小写的 "f" )以免与 Fn 闭包 trait 相混淆.fn 被称为 函数指针(fun ...

  4. SRIO接口卡航电总线解决方案

    TES600是天津拓航科技的一款基于FPGA与DSP协同处理架构的通用高性能实时信号处理平台,该平台采用1片TI的KeyStone系列多核浮点/定点DSP TMS320C6678作为主处理单元,采用1 ...

  5. pytest—添加日志

    开头 保存工作中常用的日志. pytest有自己的日志管理的开关,不需要用到python的日志库 开始 在文件根目录下新建一个pytest.ini文件 基本设置 [pytest] log_cli=tr ...

  6. 一种KV存储的GC优化实践

    作者:vivo 互联网服务器团队- Yuan Jian Wei 从内部需求出发,我们基于TiKV设计了一款兼容Redis的KV存储.基于TiKV的数据存储机制,对于窗口数据的处理以及过期数据的GC问题 ...

  7. 老夫的正则表达式大成了,桀桀桀桀!!!【Python 正则表达式笔记】

    一.正则表达式语法 (一) 字符与字符类 特殊字符 \.^$?+*{}[]()| 为特殊字符,若想要使用字面值,必须使用 \ 进行转义 字符类 [] [] 匹配包含在方括号中的任何字符.它也可以指定范 ...

  8. vue下载附件按钮功能

    一.tools文件夹下tools文件中封装下载方法: const iframeId = 'download_file_iframe' function iframeEle (src) { let el ...

  9. 2022-06-16:给定一个数组arr,含有n个数字,都是非负数, 给定一个正数k, 返回所有子序列中,累加和最小的前k个子序列累加和。 假设K不大,怎么算最快? 来自亚马逊。

    2022-06-16:给定一个数组arr,含有n个数字,都是非负数, 给定一个正数k, 返回所有子序列中,累加和最小的前k个子序列累加和. 假设K不大,怎么算最快? 来自亚马逊. 答案2022-06- ...

  10. 2021-04-05:给两个长度分别为M和N的整型数组nums1和nums2,其中每个值都不大于9,再给定一个正数K。 你可以在nums1和nums2中挑选数字,要求一共挑选K个,并且要从左到右挑。返回所有可能的结果中,代表最大数字的结果。

    2021-04-05:给两个长度分别为M和N的整型数组nums1和nums2,其中每个值都不大于9,再给定一个正数K. 你可以在nums1和nums2中挑选数字,要求一共挑选K个,并且要从左到右挑.返 ...