真实感渲染:WebGPU介绍和使用光栅化管线绘制一个三角形
大家好~本课程为“真实感渲染”的线上课程,从0开始,介绍相关的图形学算法和数学基础,给出详细的数学推导、伪代码和实现代码,最终带领大家开发出基于物理的渲染器
线上课程资料:
加QQ群,获得ppt等资料,与群主交流讨论:106047770
本系列文章为线上课程的复盘,每上完一节课就会同步发布对应的文章
本课程系列文章可进入索引查看:
真实感渲染系列文章索引
回顾相关课程内容
- 为什么要学习真实感渲染?
为什么要学习本课
- WebGPU是什么?
- WebGL和WebGPU相比有什么区别?
- 如何用WebGPU绘制一个三角形?

主问题:WebGPU是什么
- WebGPU是什么?
答:Web端图形API。浏览器封装了现代图形API(Dx12、Vulkan、Metal),提供给Web 3D程序员WebGPU API - 它有什么用?
答:
主问题:如何渲染
在哪里渲染?
答:GPU有哪些渲染管线?
答:
每个渲染管线分别用于什么用途?
答:光栅化管线用于渲染;光追管线用于光线相交计算,实现了硬件光线相交计算加速;计算管线用于通用GPU计算,也可以实现光线相交计算,还可以实现遮挡剔除等计算
主问题:WebGPU和WebGL是什么关系
WebGL是什么?
答:和WebGPU一样,都是Web端图形API它对应本地端的什么图形API?它的版本是如何演进的?
答:
WebGL和WebGPU相比有什么区别?
答:
WebGPU相比WebGL有什么优势?
答:- WebGPU提供了对GPU更大范围地控制,从而能提高性能
- WebGPU更好地支持多线程
- WebGPU支持计算管线,从而让程序员能使用GPU进行计算
- WebGPU与WebGL2的区别很大,两者不容易兼容。如果要从WebGL1升级,最好直接升级到WebGPU,一劳永逸
- 各大浏览器都会支持WebGPU,而IOS不支持WebGL2
主问题:如何学习WebGPU
任务:准备开发环境
- WebGPU Node开源项目是干什么的?
答:运行在Node.js环境中,底层封装了Vulkan等本地图形API,上层提供WebGPU API - 为什么要用WebGPU Node开源项目而不是WebGPU标准?
答:因为它有下面的优点:- WebGPU标准目前不支持光追管线,但是WebGPU Node开源项目支持它(需要RTX显卡)
- WebGPU标准使用的WGSL着色器语言缺少很多特性;而WebGPU Node开源项目使用GLSL,更成熟
然而它也有缺点: WebGPU Node提供的WebGPU API版本较老(2020年的版本)
我们使用什么管线?
答:考虑到大多数同学的电脑没有RTX显卡,所以我们主要使用计算管线而不是光追管线来实现光线追踪安装nodejs
Node.js 是能够在服务器端运行JavaScript 的开放源代码、跨平台 JavaScript 运行环境
下载最新版本,版本至少为13及以上
在Windows上安装时务必选择全部组件,包括勾选Add to Path
检查npm
npm是Node.js的包管理工具,通过下面的方式来检查是否已安装:
//应该能打印出版本号
npm -v
- 安装VS Code
进入官网下载并安装
- 准备项目代码
clone本课程的Github项目(HTTPS clone):https://github.com/yyc-git/PotorealisticRenderEdu-3
clone 后,请在根目录上执行:yarn
没有yarn的同学请先执行:npm install --global yarn
每个同学可以在项目中新建“mine/”文件夹(已经被git ignore),用于存放自己的文件
在项目根目录下,输入:
node lessons/2_triangle/code/index.js
应该能看到运行结果:

- Shader languages support for VS Code
安装这个用于GLSL高亮的VS Code插件
- Shaderc GLSL Linter
安装这个用于GLSL编译检查的VS Code插件:
1.下载shaderc,选择对应的操作系统的版本,解压
(在cloud storage中,可以找到历史版本)
2.VS Code中安装Shaderc GLSL Linter插件
3.设置它:
"glslcPath": "your-install-dir/bin/glslc"(e.g. /Users/yang/File/install/bin/glslc)
"glslcArgs": "--target-env=vulkan1.2"
4.验证:
打开项目的scene.vert文件,随便写一些错误的glsl代码,应该会有红线出现。
按f8后出现错误信息,如下图所示:

- Clang-Format
安装这个用于GLSL格式化的VS Code插件:
1.终端上执行:
npm install -g clang-format
2.VS Code中安装Clang-Format插件
3.设置它:
"executable": "your-global-node_module-dir/clang-format/bin/your-os-dir/clang-format"
(e.g. /usr/local/lib/node_modules/clang-format/bin/darwin_x64/clang-format)
4.验证:
打开项目的scene.vert文件,把格式打乱(如缩进代码);然后格式化代码,应该能够正确格式化
主问题:如何使用光栅化管线实现“绘制一个三角形”
WebGPU坐标系介绍
右手坐标系

已知一个三角形的三个顶点(2D坐标,z为0),如何通过光栅化管线渲染出一个三角形?

结学
- 如何通过光栅化管线渲染出一个三角形?
任务:使用光栅化管线实现“绘制一个三角形”
- 请实现代码
答:待实现的代码:exec,实现后的代码:code - 介绍代码实现
答:参考资料:WebGPU学习(二): 学习“绘制一个三角形”示例 - 请每个同学运行代码,渲染出一个三角形
答:在项目根目录下,输入:
node lessons/2_triangle/code/index.js
应该能看到运行结果:

- 移植该程序到WebGPU标准需要哪些修改?
总结
- 请回顾本节课的内容?
- 回答开始的问题?
参考资料
- WebGPU学习系列
- 《WebGL编程指南》
- WebGPU规范
谢谢你~
真实感渲染:WebGPU介绍和使用光栅化管线绘制一个三角形的更多相关文章
- 【OpenGL4.0】GLSL渲染语言入门与VBO、VAO使用:绘制一个三角形 【转】
http://blog.csdn.net/xiajun07061225/article/details/7628146 以前都是用Cg的,现在改用GLSL,又要重新学,不过两种语言很多都是相通的. 下 ...
- WebGPU学习(二): 学习“绘制一个三角形”示例
大家好,本文学习Chrome->webgl-samplers->helloTriangle示例. 准备Sample代码 克隆webgl-samplers Github Repo到本地. ( ...
- Direct3D 11 Tutorial 2: Rendering a Triangle_Direct3D 11 教程2:渲染一个三角形
概要 在之前的教程中,我们建立了一个最小的Direct3D 11的应用程序,它用来在窗口上输出一个单一颜色.在本次教程中,我们将扩展这个应用程序,在屏幕上渲染出一个单一颜色的三角形.我们将通过设置数据 ...
- 基于显卡的光栅化渲染器Gaius计划
决定实现一个基于显卡的光栅化渲染器,能将一些基于显卡的新算法融入其中.
- 用 windows GDI 实现软光栅化渲染器--gdi3d(开源)
尝试用windows GDI实现了一个简单的软光栅化渲染器,把OpenGL渲染管线实现了一遍,还是挺有收获的,搞清了以前一些似是而非的疑惑. ----更新2015-10-16代码已上传.gihub地址 ...
- 软件光栅化渲染器Augustus计划
在看完Real-Time Rendering后,我决定动手实现一个软件的光栅化渲染器.我就称它为Augustus计划吧. 计划使用MFC和GDI+来做它的UI.可以访问GitHub来查看它的源代码.
- Unity Shader入门精要学习笔记 - 第14章非真实感渲染
转载自 冯乐乐的 <Unity Shader 入门精要> 尽管游戏渲染一般都是以照相写实主义作为主要目标,但也有许多游戏使用了非真实感渲染(NPR)的方法来渲染游戏画面.非真实感渲染的一个 ...
- DirectX11 With Windows SDK--11 混合状态与光栅化状态
前言 虽然这一部分的内容主要偏向于混合(Blending),但这里还需提及一下,关于渲染管线可以绑定的状态主要有如下四种: 光栅化状态(光栅化阶段) 采样器状态(像素着色阶段) 混合状态(输出合并阶段 ...
- shouldRasterize 光栅化、(缓存)复用、内存、内容稳定
使用场景:稳定的视图(layer)被反复使用或进行动画: 本质:牺牲内存解放cpu: 反例:牺牲内存牺牲cpu. 单次使用或者视图有变动,shouldRasterize不会有任何用途,反而会牺牲内存. ...
- GPU大百科全书 第二章 凝固生命的光栅化
光栅化——死神来了…… 前言:在上一期的GPU大百科全书里,我们目睹了可爱的香草从抽象世界走向现实,从方程还原成实体的全过程.可以说香草活了,因为几何单元,我们赋予了她完整的灵魂. 如果你正在为G ...
随机推荐
- .net 获取客户端真实ip
Nginx 如何设置 情况1 在只有1层nginx代理的情况下,设置nginx配置"proxy_set_header X-Forwarded-For $remote_addr;". ...
- 文心一言 VS 讯飞星火 VS chatgpt (151)-- 算法导论12.2 7题
七.用go语言,对于一棵有 n 个结点的二叉搜索树,有另一种方法来实现中序遍历,先调用 TREE-MINIMUM 找到这棵树中的最小元素,然后再调用 n-1 次的 TREE-SUCCESSOR.证明: ...
- MyBatisPlus简介
MyBatisPlus特性 国内的一个网站 网站地址简介 | MyBatis-Plus (baomidou.com)
- 华企盾DSC防泄密软件:svn、git更新后有感叹号常见处理方法
1.查看客户端日志检查TSVNcache.exe进程是否是legal:1 2.TSVNcache.exe进程是否允许访问未配置加密进程的后缀 3.svn服务器不是加密进程也未装网络驱动,或者加密类型未 ...
- 聊聊流式数据湖Paimon(三)
概述 如果表没有定义主键,则默认情况下它是仅追加 表类型(Append Only Table). 根据桶(Bucket)的定义,我们有两种不同的仅追加模式:"Append For Scala ...
- Python——CSS(层叠样式表,Cascading Style Sheets)、选择器(Selectors)
CSS(层叠样式表,Cascading Style Sheets)是一种用于描述文档样式和布局的样式表语言.它可以与HTML结合使用,用于控制网页的外观和格式.以下是CSS的主要特点和一些基本概念: ...
- GOF23--23种设计模式(二)
一.建造者模式 建造者模式也是属于建造型模式,它提供了一种创建对象的最佳方式 定义:将一个复杂的对象的构建和它的表示分离,使得同样的构建过程可以创建不同的表示 主要作用:在用户不知道对象的构建细节的情 ...
- 2023-07-07:给出两个字符串 str1 和 str2。 返回同时以 str1 和 str2 作为子序列的最短字符串。 如果答案不止一个,则可以返回满足条件的任意一个答案。 输入:str1 =
2023-07-07:给出两个字符串 str1 和 str2. 返回同时以 str1 和 str2 作为子序列的最短字符串. 如果答案不止一个,则可以返回满足条件的任意一个答案. 输入:str1 = ...
- 重磅更新!Sermant 1.2.0 release版本新特性速览
本文分享自华为云社区<重磅更新!Sermant 1.2.0 release版本新特性速览>,作者:华为云开源. 10月,Sermant社区正式发布了1.2.0 release版本,距离上一 ...
- 伯克利:serverless是下一代计算范式
摘要:Serverless技术正是云厂商的基于规模经济的一个选择. 引子 刚过去的HC2020,华为面向多样化算力的时代,发布了DC分布式计算的三个开发套件,其中一个是元戎组件.元戎是基于函数计算的分 ...