首页 > 其他分享 >【WebGPU Unleashed】0.1 GPU管线

【WebGPU Unleashed】0.1 GPU管线

时间:2024-09-02 13:23:40浏览次数:13  
标签:片段 0.1 WebGPU 像素 GPU 三角形 管线 3D

一部2024新的WebGPU教程,作者Shi Yan。内容很好,翻译过来与大家共享,内容上会有改动,加上自己的理解。更多精彩内容尽在 dt.sim3d.cn ,关注公众号【sky的数孪技术】,技术交流、源码下载请添加VX:digital_twin123

前面我们学习了应用程序如何通过驱动程序与GPU连接。然而,驱动程序仅通过在应用程序和 GPU 之间传递数据来处理管线工作,他们不执行任何实际的图形处理。一旦绘图请求发送到 GPU,它必须由 GPU 执行并最终产生可见像素。在本节中,我们将探讨 GPU 如何处理绘图命令并通过称为 GPU 管线的过程生成像素。 GPU管线可以比作像素生产工厂:它以配置和输入数据为原材料,生产像素作为最终产品。在像素制造过程中,我们要经历一系列步骤。其中一些步骤是可编程的,一些只是可配置的,还有一些具有固定的功能。接下来我们将详细查看每个管线步骤。

图形编程本质上涉及配置 GPU 管线、将输入数据输入其中并接收结果。因此,对GPU管线有扎实而深入的了解是学习GPU图形编程最重要的方面。 GPU编程的核心活动包括定义管线和提供着色器程序。了解 GPU 管线至关重要,甚至比熟悉特定图形 API 更重要。如果你有使用多个 API 的经验,你会注意到它们都是围绕与 GPU 管线配合使用而设计的。因此,充分了解 GPU 管线可以让我们快速适应新的 API。

GPU编程的三种类型数据

首先,让我们了解一下哪些数据和命令被发送到 GPU。到目前为止,我们一直将这些称为绘制命令或绘制请求,但它们实际上包含什么?在对 GPU 进行编程时,我们需要为其提供三种类型的数据才能有效地工作。

第一种类型的数据是管线配置。打个比方,如果GPU是一位多才多艺的艺术家,我们可以通过提供着色器程序将其配置为达芬奇或鲁本斯风格的绘画。配置包含许多设置,我们将在本书中了解这些设置,但关键组件是着色器程序。着色器是在 GPU 上运行的程序,可确定如何变换几何图形以及如何对像素着色。但是,着色器程序并不是配置所需的唯一数据,还涉及其他步骤,我们将在以后的章节中介绍。

其次,一旦配置了 GPU 管线,就可以生成像素了。我们现在需要向其提供原始输入,通常是数百或数百万个三角形和纹理贴图,GPU 管线会将其转换为像素。

最后,在上述过程中可能还需要其他元数据,通常是uniform缓冲区的形式。如果我们将着色器程序比作在 GPU 上运行的程序,那么uniform就像我们传递给程序的参数,类似于命令行变量。

如何理解GPU管线

现在让我们看一下 GPU 管线,它是 GPU 硬件的理论抽象。虽然它不一定与实际的硬件实现相匹配,但从软件工程的角度来看,它是实时 3D 编程最重要的概念,因为我们所有的编程活动都围绕着 GPU 管线的使用。

理解 GPU 管线的一个好方法是将 GPU 想象成一个工厂。原材料是用三角形表示的几何形状,最终产品是像素。 GPU管线是将原材料转化为最终产品的过程。

在 3D 世界中,三角形是所有形状的基本构建块,就像像素对于 2D 图形一样。你可能会问为什么使用三角形?这是因为使用三角形是表示任意表面的最具效益的方式。水密性是计算机图形学中的一个重要概念。如果网格不包含孔并且具有明确的内部和外部,则该网格被认为是防水的。有关水密性的更严格定义,你可以访问此博客和此视频

虽然使用三角形并不是表示 3D 形状的唯一方法,但它是最有效的。例如,在基于点的渲染中,小圆盘用于表示 3D 形状的表面。然而,这些圆盘必须在底层 3D 表面上进行密集采样,以避免间隙并防止出现伪影。即使进行密集采样,如果我们放大得足够大,间隙仍然可能是可见的。另一方面,即使放大,三角形也可以没有任何间隙地覆盖表面。例如,可以使用三角形网格来表示球体的 3D 模型,每个三角形平滑地过渡到相邻三角形以形成无缝、无间隙的表面。即使在高放大倍数下查看,也能准确渲染 3D 形状。

在 GPU 工厂内,三角形经过一系列步骤变成像素,这些步骤便构成了 GPU 管线。过去,GPU 管线是固定的,只能以预定义的方式产生像素。然而现在它已经变得可编程,允许我们编写称为着色器的 GPU 程序,并定义我们自己的像素生成方式。

GPU管线的四个阶段

经典的 GPU 管线由四个阶段组成:顶点阶段、光栅化、片段阶段和混合。虽然现代管线引入了额外的阶段,但专注于这四个阶段对于大多数图形任务来说已经足够了。在这些阶段中,只有顶点和片段阶段是可编程的。每个阶段都会增量处理数据,将三角形转换为最终像素。现在让我们详细研究一下每个阶段。
应用投影矩阵就像将渲染对象安装到屏幕上一样
第一阶段是顶点阶段。此阶段的主要目的是将 3D 几何图形转换为扁平的 2D 几何图形。此阶段的输入是称为世界空间的 3D 坐标系中的三角形。此阶段的输出仍然是三角形,但它们已被“压缩”到 2D 屏幕坐标系(也称为剪辑空间)中。将坐标从世界空间转换到屏幕空间的确切方法由顶点着色器程序确定。常见的操作包括透视投影和正交投影。无论应用何种算法,目标都是将 3D 对象投影为 2D,以便可以将它们采样为像素。

此外,该阶段还执行优化技术以减少后续阶段的工作量。这些技术包括剔除(去除背对视图的三角形)和剪切(消除可见区域之外的片段)。
背面剔除会拒绝对最终图像没有贡献的三角形。
第二阶段是光栅化。光栅化是将 2D 形状转换为覆盖同一区域的像素的过程。该阶段的输出称为片段。需要注意的是,片段还不是像素。虽然两者都是 2D 平面中的点,但像素具有颜色并且可显示,而片段是具有任意数据的点。附加到片段的具体数据可以包括纹理坐标、深度和颜色,但它们的最终颜色尚未确定。这是下一阶段的任务。
剪裁删除可见区域之外的三角形
当我们将三角形数据输入管道时,我们可以将元数据附加到三角形顶点。典型的例子包括纹理坐标和颜色。三角形只有三个顶点,但是一旦将其转换为片段,就会生成更多的片段来覆盖三角形。我们如何将元数据附加到这些片段上呢?光栅化阶段使用插值来为所有片段生成相应的元数据。简而言之,插值根据每个片段到三个顶点的距离为其分配元数据值的加权平均值。
光栅化用片段覆盖每个三角形
光栅化过程可以比作工人们铺设三角形砖墙。当我们生成片段之后,就会进入片段着色器阶段。在此阶段,我们为每个片段分配一种颜色,有效地将其转换为一个像素。着色逻辑由我们提供的片段着色器程序决定。
新像素通过混合方式与现有像素合并
最后,混合阶段将每个新生成的像素应用到帧缓冲区中的现有图像。帧缓冲区是包含当前渲染图像的临时存储区域,包括所有先前绘制的元素。在混合阶段,我们可以灵活地定义如何将现有像素与新像素混合。例如,混合对于实现透明效果特别有用。混合完成后,帧缓冲区就会呈现给用户,从而结束一帧的渲染。

WebGPU和其他3D图形API提供了一组函数来帮助我们定义图形管道并将资源发送到GPU进行处理。因此,如何配置管道是我们研究的重点。

总结

在结束本节之前,我们首先讨论一下为什么需要 GPU。为什么我们不能只使用强大的 CPU 来处理图形工作?打个比方,想象一下你是一个工厂主,你总是想雇用拥有博士学位的员工来替你打工吗?如果你正在建设一家专利工厂,那么聘请博士是非常有意义的。然而,如果你正在建造一家香蕉罐头工厂,并且任务只是剥香蕉皮,那么雇用 100 只猴子可能是更好的选择。使用相同数量的资源,可以维持更大的猴子团队。博士非常有能力,可以在研究项目上进行良好的合作,但剥香蕉不需要广泛的研究能力或合作。 CPU 就像博士一样,它们非常有能力并且设计得能够很好地处理同步。另一方面,GPU 包含大量小型计算单元阵列,可以快速处理更简单的任务,尤其是当任务是独立且不需要协作时。那么对于展平三角形和着色像素,这两项任务都很简单且独立,因此 GPU 是它们的理想硬件。过去,GPU 仅用于图形,但一旦它们变得可编程,越来越多的用例开始从中受益,例如人工智能、物理模拟以及视频和图像处理。

本课概述了 GPU 驱动程序和图形管道,解释了管道如何将三角形转换为像素。在下一课中,我们将学习如何配置第一个 WebGPU 管道来渲染简单的场景。

标签:片段,0.1,WebGPU,像素,GPU,三角形,管线,3D
From: https://blog.csdn.net/u013929284/article/details/141637870

相关文章

  • Switch 塞尔达传说旷野之息:中文本体+1.6.0+2DLC整合版+林可儿3.0.1 增强整合MOD
    整合包复制到SD卡,同时解压MOD复制到atmosphere/contents,使用DBI安装成功。安装后原来版本的存档还在。本体+1.6.0+2DLC整合版XCI塞尔达传说:狂野之息/旷野之息游戏变成了完全的开放地图,沙盒式的玩法拓展出了更多的内容,林克可以爬山、游泳,而且游戏对应外观变化,玩家在游戏......
  • Day12_0.1基础学习MATLAB学习小技巧总结(12)——程序流程控制3-switch结构
    利用空闲时间把碎片化的MATLAB知识重新系统的学习一遍,为了在这个过程中加深印象,也为了能够有所足迹,我会把自己的学习总结发在专栏中,以便学习交流。素材来源“数学建模清风”特此说明:本博客的内容只在于总结在使用matlab中的一些小技巧,并非教程,若想系统的学习MATLAB,也可以移步......
  • [转]OpenCV4.8 GPU版本CMake编译详细步骤 与CUDA代码演示
    导读本文将详细介绍如何使用CMake编译OpenCV4.8CUDA版本并给出Demo演示,方便大家学习使用。CMake编译详细步骤废话不多说,直接进入正题!【1】我使用的工具版本VS2017+CMake3.18.2+OpenCV4.8.0+CUDA11.2一般情况下VS版本≥VS2017均可,CMake版本≥3.18.2,OpenCV......
  • Linux实时查看GPU (NVIDIA),CPU及内存使用情况
    GPU方法一:需要用到一个工具gpustatpipinstallgpustat#安装工具gpustat-cp#输出当前状态gpustat-cp-i1#持续监视方法二:使用nvidia-smi命令nvidia-smi-lsecondsnvidia-smi--loop=seconds上述两个命令都可以,要把seconds换成你想刷新的时间间隔。按......
  • HPC应用&生命科学领域软件AutoDock-GPU详细安装使用教程
    目录应用简介编译安装测试算例及提交脚本应用简介AutoDock-GPU是基于OpenCL的GPU加速版本分子对接软件autodock-4.2.6。可以支持DCU已经其他支持OpenCL的设备,如CPU和NvidiaGPU等。github源码: https://github.com/ccsb-scripps/AutoDock-GPU编译安装AutoDock-GPU......
  • C++小助手1.0.1
    注:只能在C++6.7.5运行小助手代码:#include<bits/stdc++.h>#include<windows.h>#include<conio.h>usingnamespacestd;//显示带有动画效果的文本voidccc(strings){ for(charc:s){ cout<<c; Sleep(50); } cout<<endl;}//加密字符串(简单的移......
  • PyTorch深度学习实战(26)—— PyTorch与Multi-GPU
    当拥有多块GPU时,可以利用分布式计算(DistributedComputation)与并行计算(ParallelComputation)的方式加速网络的训练过程。在这里,分布式是指有多个GPU在多台服务器上,并行指一台服务器上的多个GPU。在工作环境中,使用这两种方式加速模型训练是非常重要的技能。本文将介绍PyTorch中......
  • 渲染加速新选择:GPU云渲染平台的全方位评估
    在当今快速发展的数字时代,视觉内容的创造和呈现已成为各行各业的共同需求。无论是电影制作、游戏开发还是建筑设计,高质量的视觉输出都是不可或缺的。GPU云渲染平台以其强大的计算能力和灵活性,为这些行业提供了一种全新的解决方案。GPU云渲染平台概述基本概念:GPU云渲染平台是一......
  • (约230个工具)野兔在线工具箱系统最新版本V4.0.1更新
    野兔在线工具箱系统,采用最新ThinkPHP8框架开发完成,也是基于YETUADMIN开发的工具箱系统,这次野兔在线工具系统更新,更新了几个新的功能模块,和已知的问题,修复系统部分功能。程序开发程序名称:野兔在线工具箱系统程序开发:PHP+MySQL+tp8程序源码:100%开源,支持任意二开,商用程序支持:电脑......
  • GPU虚拟化技术简介:实现高性能图形处理的灵活部署
    本文分享自天翼云开发者社区《GPU虚拟化技术简介:实现高性能图形处理的灵活部署》,作者:z****nGPU虚拟化技术是一项重要的创新,通过将物理GPU划分为多个虚拟GPU,实现多用户共享和独立运行图形处理任务的能力。本文介绍了GPU虚拟化技术的基本原理、应用场景和优势。该技术在云计算、虚......