用WebGPU实现基于物理的渲染

news2024/10/7 8:27:36

在这里插入图片描述

推荐:用 NSDT编辑器 快速搭建可编程3D场景

最近,我花了相当多的时间在 WebGPU 中使用 IBL(基于图像的照明)编写 PBR(基于物理的渲染)渲染器。 PBR 本身并没有什么新奇之处。 这是一项自 2014 年以来就存在的技术,所有现代图形引擎都使用它。 但我还没有看到任何在 WebGPU ThreeJS 中执行此操作的教程,其他人已经实现了它,但阅读这些源代码并不容易。

我很想创建一个完整的 PBR 指南,并提供适当的理论解释,但互联网上已经有很多相关材料,我需要花费几个月的时间才能重新创建它。 我决定只写下与目前互联网上可用的内容相比我必须找出的缺失部分。 因此,对于我们为什么要做这个问题,请参考互联网上可用的丰富资源。 我将回答有关 WebGPU 的问题。
在这里插入图片描述

top:金属表面 bottom:介电表面(塑料)

要记住一件事:我不确定自己在做什么。 我对使用 GPU API 有了很好的掌握,但我对 WebGPU 很陌生,也不是计算机图形编程方面的专家,所以我所做的一些事情可能并没有真正意义。 但这似乎有效!

我这里的所有工作都是基于优秀的 Learn OpenGL 教程。 我已经使用兰伯特漫反射、GGX 高光和 Fresnel Schlick 近似实现了基本的 PBR 着色。 我使用预过滤的环境贴图和辐照度贴图实现了 IBL。

1、什么是PBR?

基于物理的渲染(PBR: Physically Based Rendering)是计算机图形学中最现代的渲染方法。 自 2010 年代以来,它一直是一个研究课题,并且自 2010 年代左右开始变得足够有效,可用于实时游戏引擎。 关于它的两本著名出版物是 Brian Karis 的《虚幻引擎 4 中的真实着色》和 Sébastien Lagarde 和 Charles de Rousiers 的《Moving Frostbite to PBR》。

基本思想是使用光的精确物理特性了,这与之前非常粗略的近似不同。 为了实现实时性能,仍然需要近似和缓存大量计算,但结果比以前更加真实。

PBR 将材料分为两类:金属和电介质。 金属是像镜子一样反射光的材料,电介质是像玻璃一样反射光的材料。 不同之处在于,金属具有大量可以移动并反射光的自由电子,而电介质则没有。 最重要的结果是金属具有镜面反射,而电介质则没有。

2、什么是 IBL?

基于图像的照明(IBL: Image Based Lighting)是一种允许使用环境贴图来照亮场景的技术。 它近似于从所有周围反射并来自各个方向的光,以稍微照亮场景。 它经常用作 PBR 的一部分。

3、什么是WebGPU?

简而言之,WebGPU是 WebGL 的继承者。 它反映了计算机图形 API 的演变,并遵循 Vulkan、Metal 和 DirectX 12 的方法及其较低级别和更明确的设计。

如果你对图形 API 的历史感到好奇,并想了解更多 WebGPU 的诞生方式以及其中采取的妥协措施,请查看这篇精彩的文章:我想谈谈 WebGPU。

4、面临的挑战

有几件事对于刚接触 WebGPU 的人来说可能并不明显,对我来说当然也不明显。 当从 OpenGL 翻译代码时,我遇到了以下问题:

  • 解析 HDR 纹理 – 与 WebGPU 无关,但我以前从未这样做过,事实证明确实存在与 WebGPU 相关的问题。
  • 渲染立方体贴图 - 立方体贴图在 WebGL 中有些特定,因此如何在 WebGPU 中执行它们并不简单。
  • 渲染到立方体贴图 - 在 WebGL/OpenGL 中我们将使用帧缓冲区。 相当于什么?
  • 渲染到 mip 级别并读取特定的 mip 级别 - 要么有一个特定的 API,要么我就注定失败(剧透:API 就在那里)。

5、解析 HDR 纹理

为了解析 HDR 纹理,我使用了 Marcin Ignac 的简单但优秀的 parse-hdr 库。 我只需要处理一个问题:我的平台拒绝处理 rgba32float,但parse-hdr库依赖于 Float32Array。

我发现库 @petamoriken/float16 实现了 Float16Array,并且我成功地使用了它。所以我只是修补了parse-hdr库,然后就可以开始了。

6、渲染立方体贴图

我使用了 WebGPU 示例中的 Cubemap。 那里没有什么特别令人惊讶的。

7、渲染到立方体贴图

我忘了是如何找到它的,但诀窍是在创建视图时传递 baseArrayLayer和 arrayLayerCount。

除此之外,它需要与相应的 OpenGL 解决方案类似的数学运算,例如准备 6 个视图矩阵,一个用于立方体贴图的每个面。

const passEncoder = commandEncoder.beginRenderPass({
  colorAttachments: [
    {
      view: cubemapTexture.createView({
        baseArrayLayer: i,
        arrayLayerCount: 1,
      }),
      loadOp: "load",
      storeOp: "store",
    },
  ],
  // ...
});

8、渲染到 mip 级别

我使用了 WebGPU 基础教程,特别是在 GPU 上生成 mip 的指南。 诀窍是仅指定与之前的 baseMipLevel 和 mipLevelCount 不同的值。

const passEncoder = commandEncoder.beginRenderPass({
  colorAttachments: [
    {
      view: prefilterTexture.createView({
        baseArrayLayer: i,
        arrayLayerCount: 1,
        baseMipLevel: mip,
        mipLevelCount: 1,
      }),
      clearValue: [0.3, 0.3, 0.3, 1],
      loadOp: "load",
      storeOp: "store",
    },
  ],
  // ...
});

事实证明,可以使用 textureSampleLevel函数读取特定的mip级别。 这是最令人担忧的部分,因为我知道如果它不能直接在 API 中使用,就没有任何办法解决这个问题。 幸运的是,WebGPU 现在是一个成熟且严肃的 API,可以处理类似的事情。

let prefilteredColor = textureSampleLevel(
  prefilterMap, // texture
  ourSampler, // sampler
  r, // texture coordinate
  roughness * MAX_REFLECTION_LOD, // mip level
).rgb;

9、结束语

点击这里查看完整源代码。

关于渲染技术、优化、妥协等还有很多要补充的,但我不是谈论这些的最佳人选。


原文链接:WebGPU物理渲染实现 — BimAnt

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python装饰器(decorators)

本文改编自以下文章:Decorators in Python 装饰器是一个很强大的工具,它允许我们很便捷地修改已有函数或者类的功能,我们可以用装饰器把另一个函数包装起来,扩展一些功能而不需要去修改这个函数代码。 预备知识 在Python中&…

度矩阵、邻接矩阵

度矩阵(degree matrix) 度矩阵是对角阵,对角上的元素为各个顶点的度,顶点vi的度表示和该顶点相关联的变得数量。 在无向图中,顶点vi的度d(vi)N(i)(即与顶点相连的边的数目)有向图中&#xff0…

六年北漂:一个普通程序员的成长之路

微信推送规则改了,星标一下公众号,否则可能收不到推送 收拾完东西,终于忙完一天了,坐在桌子前,梳理一下我的北漂经历。 中午刚下飞机,到了住的地方,直接开始下雨,瞬间感受到一股闷热…

揭秘:房产小程序如何助力售楼业务提升

随着移动互联网的发展,小程序已经成为各行各业进行营销推广的利器之一。对于房地产行业而言,小程序同样具有巨大的潜力。下面,我们将介绍如何使用乔拓云平台开发一款吸睛的房地产营销小程序。 第一步:注册登录乔拓云平台&#xff…

Linux基础--文件描述符

目录 一.C文件接口 1.hello.c写文件 2.hello.c读文件 3.输出信息到显示器 二、系统文件I/O 0.系统调用和库函数 1.open 2.write 3.read 4.close 三、文件描述符fd 1. 0 & 1 & 2 2.文件描述符分配规则 3.重定向 4.使用dup2系统调用 四、FILE 一.C文件接…

为了做好农业,拼多多请来顶尖农业专家当独立董事

8月29日,拼多多发布截至6月30日的2023年第二季度业绩报告。财报显示,拼多多集团今年第二季度收入为523亿元,同比增长66%,远超市场预期。 财报发布的同时,拼多多还宣布,其董事会已聘任荷兰瓦赫宁根大学终身…

【办公自动化】使用Python批量处理Excel文件并转为csv文件

🤵‍♂️ 个人主页:艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞&#x1f4…

一文了解聚合支付

第四方支付是相对于第三方支付而提出的概念,又被称为“聚合支付”是指通过聚合第三方支付平台、合作银行、等多种支付工具进行的综合支付服务。 简言而之,把支付接口聚合到一个平台上面,来给商家或者个人来提供支付服务。 第四方支付集中了各…

为什么深度网络(vgg,resnet)最后都不使用softmax(概率归一)函数,而是直接加fc层?

这个问题很简单,并不是没有使用softmax,而是没有显式使用softmax。 随着深度学习框架的发展,为了更好的性能,部分框架选择了在使用交叉熵损失函数时默认加上softmax,这样无论你的输出层是什么,只要用了nn.…

【GO】LGTM_Grafana_Tempo(2) --- 官方用例改后实操

最近在尝试用 LGTM 来实现 Go 微服务的可观测性,就顺便整理一下文档。 Tempo 会分为 4 篇文章: Tempo 的架构官网测试实操跑通gin 框架发送 trace 数据到 tempogo-zero 微服务框架使用发送数据到 tempo 根据官方文档实操跑起来 tempo,中间根…

测试理论与方法----软件测试工作流程第一个环节:提取测试需求

测试理论与方法 一、软件测试流程 1、软件测试定义 软件:程序数据文档:不仅仅包含应用程序,还应该包含和这个程序相关的数据,文档 软件测试:测试的对象:应用程序,数据,文档 软件…

java八股文面试[数据库]——慢查询优化

分析慢查询日志 直接分析慢查询日志, mysql使用explain sql语句进行模拟优化器来执行分析。 oracle使用explain plan for sql语句进行模拟优化器来执行分析。 table | type | possible_keys | key |key_len | ref | rows | Extra EXPLAIN列的解释: ta…

六、事务-3.事务四大特性

1、原子性 事务是一组操作,这组操作是不可分割的最小操作单元,这组操作要么全部执行成功,要么全部执行失败。 如:三步转账操作,当中只要有一步操作失败了,整个就失败了。 2、一致性 事务完成时&#xff…

使用vs2019+opencv4.3.0搭建开发环境笔记

使用vs2019opencv4.3.0搭建开发环境笔记 1.软件下载适配2.opencv适配三级目录 3.运行第一个demo报错 参考: 博文 1.软件下载适配 首先是需要下载安装vs2019,下载社区版免费,安装过程基本点击就可 vs2019官网 opencv下载 opencv4.3.0 2.o…

MySQL事务原理、MVCC详解

事务原理 1 事务基础 1). 事务 事务 是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系 统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。 2). 特性 原子性(Atomi…

Java CompletableFuture 详细使用教程与实践

一、Java CompletableFuture 详细使用教程 Java 8引入了一种强大的异步编程工具:CompletableFuture。它提供了一种处理异步计算的方式,使得你可以在计算完成时获取结果,或者将一个或多个 CompletableFuture 的结果组合在一起。本部分将详细解…

深入了解Kubernetes(k8s):安装、使用和Java部署指南(持续更新中)

目录 Docker 和 k8s 简介1、kubernetes 组件及其联系1.1 Node1.2 Pod1.3 Service 2、安装docker3、单节点 kubernetes 和 KubeSphere 安装3.1 安装KubeKey3.2 安装 kubernetes 和 KubeSphere3.3 验证安装结果 4、集群版 kubernetes 和 KubeSphere 安装5、kubectl 常用命令6、资…

Node.js 是什么?Node.js 安装及配置环境 入门指南!

Node.js 是一个基于 Chrome V8 引擎的开源、跨平台的 JavaScript 运行时环境。它允许开发者使用 JavaScript 构建高性能、可扩展的网络应用程序,使 JavaScript 能够在服务器端运行,而不仅仅局限于浏览器端。Node.js 的包管理器 npm,是全球最大…

浅谈安防视频监控平台EasyCVR视频汇聚平台对于夏季可视化智能溺水安全告警平台的重要性

每年夏天都是溺水事故高发的时期,许多未成年人喜欢在有水源的地方嬉戏,这导致了悲剧的发生。常见的溺水事故发生地包括水库、水坑、池塘、河流、溪边和海边等场所。 为了加强溺水风险的提示和预警,完善各类安全防护设施,并及时发现…

直播程序源码OAuth协议:开放授权的重要性

什么是OAuth协议? OAuth协议又称为开放授权协议,是一种开放标准协议,OAuth协议被开发出来,主要用于授权用户去访问第三方的应用程序。在直播程序源码平台中,为了方便用户或是对接其他应用的功能,常常需要与…