赞
踩
目前 WebGPU 的标准还没有完全确定下来,需要下载开发者版本的 Chrome Canary 才能开启 WebGPU。(目前正式版中 Chrome 96 / 97 其实已经支持 WebGPU了,但并不是完全支持,98 (据说)会正式支持 WebGPU)。
WebGL 的基础是 OpenGL。OpenGL 的初始版本可以追溯到 1992 年,整个 OpenGL 的设计是基于状态机模型。状态驱动的 OpenGL 难以利用今天 GPU 并行的特点。对于今天的多核计算的设备,使用 OpenGL 非常难以发挥机器的全部计算能力。WebGL 基于 OpenGL,这些 OpenGL 的问题也继承到了 WebGL了。
除此之外,OpenGL 也被各大厂商抛弃。微软的 Windows 有 Direct X,Apple 则提出了 Metal,并且直接不支持新版本的 OpenGL 4,科纳斯则提出了“次世代 OpenGL“ 的 Vulkan。这些新的图形编程语言的特点都是为了适应多核并行的高性能计算。
当然,复杂度也要比 OpenGL 更高。如果学习过 DirectX 12(支持多线程)和 DirectX 11,应该很清楚,DirectX 12 比 11 复杂多了。
需要注意的是,WebGPU 和 WebGL 并没有关系,它不需要显式地依赖 OpenGL ES。从某种意义上,wgsl 也是一门新的语言,然后经由浏览器翻译成更加底层的实现,至于底层是 Vulkan、Metal 或者是 Direct X 等等,则已经不是重点了。
由于 WebGPU 的入口是浏览器,它的标准会尽可能的大众化,也就是不能对设备要求过高,否则这个标准的通用程度也会是一个很大的问题。不可能要求每个需要使用 WebGPU 的用户的 GPU 都是 RTX 3090。可以理解,这也导致标准的复杂性会相应增加。
GPUAdapter
:WebGPU 中将物理的 GPU 硬件视为 GPUAdapter
GPUDevice
:管理资源(它可能有自己处理单元的显存)GPUQueue
:执行 GPU 命令的队列GPUBuffer
(缓冲区)和 GPUTexture
(纹理):在 GPU 内存(显存)中烘焙的物理资源GPUCommandBuffer
和 GPURenderBundle
是用户记录命令的容器GPUShaderModule
包含着色器代码。GPUSampler
或 GPUBindGroup
,配置 GPU 使用其它物理资源的方式和 Web 一样,会保证是当前页面数据。由于通过浏览器翻译成底层的 GPU 语言,在翻译阶段会严格限定指令集并进行验证,避免出现未定义行为。
还有其他的针对安全问题的考虑,暂时不讨论
如果没有清楚一些基础概念,无论是学 WebGL 还是 WebGPU 都是无法深入下去的。(由于篇幅有限,这里只是简单概述一下,后续需要具体用到的概念再展开)
计算机图形系统也是一个计算机系统,因此它肯定也包含了一个通用计算机的所有部件。图形系统包括以下 6 个部分:
这是一个通用的模型,从手机到计算机都可以用这个模型。
现代所有图形系统都是基于光栅的。输出设备看到的图像是由图形系统产生的图形元素组成的序列:
在简单的图形系统中,帧缓冲区只存储屏幕上要显示的像素的颜色值。但在目前的图形系统中,帧缓冲区存储的信息其实非常多,比如还有生成 3D 图像所需要的深度信息等等。
计算显示设备的历史可以追溯到阴极射线管(Cathode Ray Tube,CRT)。二十多年前那种带着长长尾巴的电视机就是基于这种原理。
CRT 因为电子轰击涂在管子上的磷光物质而发光。电子束的方向由两对偏转板控制。计算机的输出由数模转换器转换成 x 偏转板和 y 偏转板上的电压值。当强度足够大的电子束轰击到磷光物质上,CRT 屏幕就会发光。
如果控制电子束偏转的电压以恒定的速率改变,那么电子束就会扫过一条直线轨迹。这样的设备称为随机扫描(random-scan)显示器。
磷光物质被电子束激发以后,典型的 CRT 的发光只能持续很短的时间,一般是几毫秒。为了让人看到稳定的、不闪烁的图像,电子束必须以足够高的速率重复扫描相同的路径,这就是刷新(refresh),刷新的速率叫做刷新率。在早期的系统中,刷新的速率由电源的(交流电)频率决定,例如美国是 60 Hz,而其他大多数地方是 50 Hz。当然,目前显示器已经远远不止 60 Hz 了,例如 iPad Pro 可以 120 Hz,一些专业的游戏笔记本可以达到 144 Hz。
后面,CRT 就被平板显示技术取代了。平板显示器也是基于光栅原理,虽然平板的具体物理实现可能不同,比如是发光二极管(LED)、液晶显示器(LCD)、等离子显示屏等,但都使用了二维栅格来寻址每个单独的发光元件。
3D 显示则利用交替刷新周期在左眼和右眼看到图像进行切换显示。观众需要佩戴满足一定刷新周期的特制眼镜。3D 电影放映机则会产生具有不同偏振方向的两个图像(通常称为左右眼),观众佩戴偏振光眼镜,这样每个眼睛只看到两个图像的一个,经过大脑的视觉合成,从而形成 3D 效果。
因为这里不打算讲物理学(虽然后面如果深入了解光和材质的话,像光度学的概念还是要懂的)。这里一笔带过,现实世界中,我们作为观察者看到的图像是由于环境中光源投射到物体上,然后物体反射到我们的眼睛(当然,还有光源直射你的眼睛、包括物体本身的漫反射等等)。
物体(对象)的材质不同,对光的反射和折射也会不同(目前计算机图形学都是基于几何光学,至于波动光学(诸如衍射、偏振等)是不用于计算机图形学的)。所以材质代表了对光处理模型,例如是完全反射回去(理想镜子),还是会在内部进行不断的散射(蜡烛的次表面散射模型)。
目前计算机三维模型使用的虚拟照相机模型,按照这个模型,API 就需要有下面四种类型的函数:
图形绘制系统的体系结果经过多次反复,但无论如何演变,流水线结构的重要性依然不变。其他的图形绘制方法,包括光线跟踪、辐射度方法和光子映射都不能获得实时的行为。
而现在,流水线体系结构中,顶点处理模块和片元处理模块是可以编程的。
在 WebGL 中,首先需要创建顶点着色器和片段着色器,并且绑定和编译对应的着色器程序。在这之后,需要将这两个着色器程序链接成为一个着色器。
function initShader(gl, vertexShader, fragShader) {
// 创建顶点着色器
const v_shader = gl.createShader(gl.VERTEX_SHADER);
// 绑定顶点着色器代码
gl.shaderSource(v_shader, vertexShader);
// 编译顶点着色器
gl.compileShader(v_shader);
// 创建片段着色器
const f_shader = gl.createShader(gl.FRAGMENT_SHADER)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。