初学者对 WebGL 与 WebGPU 的看法(A Beginner’s Perspective of WebGL vs WebGPU)

news2024/9/23 11:26:31

初学者对 WebGL 与 WebGPU 的看法(A Beginner’s Perspective of WebGL vs WebGPU)

    • WebGL 和 WebGPU 之间的主要区别:
    • WebGL 是什么以及它适合哪些人使用?
    • WebGPU 是什么?它适合谁使用?
    • WebGL 和 WebGPU 的代码示例
    • 最终裁决:WebGL 与 WebGPU

在搜索了解 WebGPU 与 Vulkan 的关系与区别的时候发现的关于 WebGL 和 WebGPU 对比的不错的文章。

这里翻一下提供给需要的人。

PS:软件翻的,手动修改了一些别扭的地方,整体还行!

原文章地址:A Beginner’s Perspective of WebGL vs WebGPU


前言:

WebGL 作为一种广泛使用的图形应用程序接口(API),因其在多个平台上具有良好的兼容性而被众多开发者所青睐。

尽管如此,对于那些致力于探索图形处理和计算负荷极限的研究人员而言,WebGPU 展现出了其潜在的新功能、高效的硬件交互能力以及卓越的性能表现,预示着它将成为未来网络图形API发展的关键方向。

WebGL 与 WebGPU


WebGL 和 WebGPU 之间的主要区别:

WebGL 基于 OpenGL ES,其性能可能不如 DirectX。而 WebGPU 则采用 Vulkan 的标准 API 构建,提供了更出色的性能和更均衡的CPU/GPU利用

WebGL 作为一种成熟技术,已获得广泛的技术支持。相较之下,WebGPU 尚处于发展的早期阶段,其完整潜能尚未完全展现。

在API设计上,WebGL 实现了跨平台的兼容性,并为开发者提供了诸如 JavaScript 自动内存管理等便利特性;而 WebGPU 则降低了 JavaScript 的调用负担,并能自动管理资源同步。

就应用领域而言,WebGL 主要服务于浏览器中的 3D 图形渲染。WebGPU 的引入,则为复杂的视觉特效和机器学习计算带来了新的可能,这些在以往是不实际的。

比较WebGLWebGPU
API 类型低级 3D 图形 API现代图形和机器工作负载 API
发行年份2011自 2017 年起开始开发
一体化直接集成到浏览器中设计用于与现代 GPU 硬件高效交互
开发人员支持JavaScript 自动内存管理简单且无需编译减少过多 JavaScript 调用的开销,尽量减少样板代码
图形支持支持 3D 图形实现复杂的视觉效果,支持机器学习计算
支持苹果、谷歌、微软、Mozilla苹果、谷歌、Mozilla、微软、英特尔
兼容性跨平台兼容性针对现代硬件进行了优化,计划实现多平台兼容性
表现相对较慢,OpenGL 存在质量问题潜在的高性能、平衡的 CPU/GPU 使用率
访问 GPU允许浏览器利用计算机上的GPU资源有效地与现代 GPU 硬件交互
使用范围移动端 Web 标准,用于在线交互式 3D 图形在 GPU 上移植算法、机器学习计算、复杂的视觉效果

WebGL 是什么以及它适合哪些人使用?

WebGL 是一个功能强大的低级 3D 图形 API,通过 HTML5 Canvas 连接到 ECMAScript,并基于 OpenGL ES 构建。

在 Flash 消亡之后,WebGL 成为在线交互式 3D 图形的首选技术。

它专为寻求跨平台兼容性和无需额外插件即可实现 GPU 3D 加速的开发人员量身定制。

然而,与 DirectX 不同,由于它依赖于运行速度较慢的 OpenGL,因此它的可理解性有限。

在这里插入图片描述

1. WebGL 的优点

  • 直接浏览器集成,无需插件
  • 受到 Apple、Google、Microsoft 和 Mozilla 等主要浏览器供应商的支持
  • 提供跨平台兼容性和原生 GLSL 支持
  • WebKit 的开源特性允许用户进行修改和定制
  • 实现与其他 HTML 文档元素的直接交互

2. WebGL的缺点

  • 由于使用 OpenGL,速度相对较慢
  • 与 DirectX 相比缺乏可理解性
  • 实际运行技术因平台而异
  • OpenGL的质量问题使得游戏开发更倾向于使用针对Windows平台的D3D10+

WebGPU 是什么?它适合谁使用?

WebGPU 是一种前沿的 API,专为图形处理和机器负载而开发。

它克服了 WebGL 的局限性,展现了现代 GPU 硬件的强大功能,并拓宽了编程的应用范围。

其推出代表着网络图形处理的一大飞跃,将 DirectX 12、Metal 和 Vulkan 的特性带到了互联网上。

WebGPU 主要面向那些追求通过网页实现高级视觉效果、计算优化和 GPU 加速机器学习的开发者。

在这里插入图片描述

1. WebGPU 的优点

  • 展现现代 GPU 硬件的强大功能
  • 降低频繁JavaScript调用的额外负担
  • 自动管理资源同步
  • 如果使用得当,可以释放高性能能力
  • 提供计算着色器,实现灵活的编程和计算资源的处理

2. WebGPU的缺点

  • 仍处于早期发展阶段
  • 尚未实现全平台全面部署
  • WebGL 的后继者,但目前默认禁用
  • W3C 仍在设计功能改进的实现

WebGL 和 WebGPU 的代码示例

WebGL:交互式颜色光谱立方体

在此 WebGL 代码片段中,我们使用顶点着色器和片段着色器来创建立方体。

如果没有兼容的 WebGL 渲染器(例如 three.js),此功能将无法运行。


// 创建一个边长为 1 的立方体几何对象
var cubeGeometry = new THREE.BoxGeometry(1,1,1);

// 顶点着色器代码
var vertexShader = `
    // 定义一个 varying 变量 vUv,用于传递顶点的 UV 坐标
    varying vec3 vUv; 
    void main() {
        // 将顶点的位置赋值给 vUv
        vUv = position; 
        // 计算并设置顶点的最终位置
        gl_Position = projectionMatrix * modelViewMatrix * vec4(position,1.0);
    }
`;

// 片段着色器代码
var fragmentShader = `
    // 接收从顶点着色器传递过来的 vUv 变量
    varying vec3 vUv;
    void main() {
        // 将 vUv 作为颜色值设置给片段
        gl_FragColor = vec4(vUv, 1.);
    }
`;

// 创建一个自定义的着色器材质
var cubeMaterial = new THREE.ShaderMaterial({
    // 指定顶点着色器代码
    vertexShader: vertexShader,
    // 指定片段着色器代码
    fragmentShader: fragmentShader,
});

// 创建一个立方体网格对象,并使用自定义的着色器材质进行渲染
var cube = new THREE.Mesh(cubeGeometry, cubeMaterial);

// 将立方体添加到场景中
scene.add(cube);
    

WebGPU:基本计算着色器

此 WebGPU 代码片段会启动一个基本计算着色器,将缓冲区的每个元素设置为相同的值。

它需要兼容 WebGPU 的浏览器,并且必须从安全的上下文中提供。

// 获取浏览器的 GPU 信息
const gpu = navigator.gpu;

// 获取 canvas 的 GPU 呈现上下文
const context = canvas.getContext('gpupresent');

// 请求 GPU 适配器
const adapter = await gpu.requestAdapter();

// 请求 GPU 设备
const device = await adapter.requestDevice();

// 定义着色器模块描述符
var shaderModuleDescriptor = {
    code: `
        // 定义一个结构体 Data
        [[block]] struct Data {
          value: u32;
        };

        // 定义一个存储缓冲区变量 buffer,绑定到 0 号绑定点,属于 0 号组
        [[binding(0), group(0)]] var<storage_buffer> buffer: Array<Data>;

        // 定义一个计算着色器函数 main,在计算阶段执行,工作组大小为 1
        [[stage(compute), workgroup_size(1)]] fn main([[builtin(global_invocation_id)]] id: vec3<u32>) {
          // 将 1234 赋值给 buffer 中索引为 id.x 的元素的 value 字段
          buffer[id.x].value = 1234;
        }
    `,
};

// 创建着色器模块
var shaderModule = device.createShaderModule(shaderModuleDescriptor);
    

最终裁决:WebGL 与 WebGPU

在基于浏览器的 3D 图形的激烈竞争中,WebGL 和 WebGPU 都表现出了强大的竞争力。

但究竟谁才是王道?谁应该将自己的筹码放在哪种技术上?让我们深入探讨一下。

网络游戏开发

对于网络游戏的开发者而言,源自 Vulkan 的 WebGPU 无疑是最优选择。

在这样一个每一帧都至关重要、计算复杂性不断增长的生态中,WebGPU 带来的更佳性能和均衡的 CPU/GPU 利用,不仅优化了代码效率,也提升了玩家的游戏体验。

WebGPU 不断的进步和承诺的功能提升,更是暗示了这是一项具有未来保障的技术投资。

在这里插入图片描述

AR/VR 内容创作者

AR/VR 内容创建者倾向于使用 WebGL。凭借对 AR/VR 内容的可靠支持,WebGL 在可靠性至关重要的领域中脱颖而出。

与 HTML5 的无缝集成、原生 GLSL 支持和跨平台兼容性不仅保证了开发的简易性,还扩大了用户覆盖范围。

不过,请密切关注 WebGPU 在这些领域即将推出的增强功能。

在这里插入图片描述

机器学习爱好者

机器学习爱好者应该加入 WebGPU。

WebGPU 具有诸多优势,例如更低的 CPU 使用率和更高效地与现代 GPU 硬件交互,它大胆地涉足了未知领域。

在 GPU 上移植复杂算法可能会通过 WebGPU 的计算着色器得到改观,从而显著提升机器学习算法的性能。

在这里插入图片描述


结论:

在 WebGL 的跨平台兼容性和易用性,与 WebGPU 的现代高性能承诺之间,我们的判断如下:WebGL 依然是网络图形处理的可靠选择;而 WebGPU,虽然初出茅庐,但在处理密集型机器学习算法和复杂游戏应用方面展现了巨大潜力

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

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

相关文章

spring事件发布器ApplicationEventPublisher的使用

1、前言 spring中有一个事件发布器,使用了观察者模式,当有事件发布的时候,事件监听者会立刻收到发布的事件。今天我们来介绍下这个事件发布器怎么使用。 2、简单使用 2.1、创建事件实体类 事件实体类需要继承ApplicationEvent。我们模拟老师发布事件的诉求。 public class T…

【51项目】基于51单片机protues交通灯的设计(完整资料源码)

基于51单片机protues交通灯的设计 一、 项目背景 1.1背景 随着科技的不断发展&#xff0c;LED技术在交通领域的应用越来越广泛。LED模拟交通灯作为一种新型的交通信号控制设备&#xff0c;以其高效、节能、环保等优点&#xff0c;逐渐取代了传统的交通信号灯。近年来&#xff…

【人工智能】Transformers之Pipeline(三):文本转音频(text-to-audio/text-to-speech)

​​​​​​​ 一、引言 pipeline&#xff08;管道&#xff09;是huggingface transformers库中一种极简方式使用大模型推理的抽象&#xff0c;将所有大模型分为音频&#xff08;Audio&#xff09;、计算机视觉&#xff08;Computer vision&#xff09;、自然语言处理&#x…

【深度学习入门篇 ⑨】循环神经网络实战

【&#x1f34a;易编橙&#xff1a;一个帮助编程小伙伴少走弯路的终身成长社群&#x1f34a;】 大家好&#xff0c;我是小森( &#xfe61;ˆoˆ&#xfe61; ) &#xff01; 易编橙终身成长社群创始团队嘉宾&#xff0c;橙似锦计划领衔成员、阿里云专家博主、腾讯云内容共创官…

把当前img作为到爷爷的背景图

&#xff08;忽略图大小不一致&#xff0c;一般UI给的图会刚好适合页面大小&#xff0c;我这网上找的图&#xff0c;难调大小&#xff0c;我行内的就自己随便写的宽高&#xff09;&#xff0c;另外悄悄告诉你最后有简单方法&#xff5e;&#xff5e; 先来看看初始DOM结构代码 …

【接口自动化_12课_基于Flask搭建MockServer】

知识非核心点,面试题较少。框架搭建的过程中的细节才是面试要点 第三方接口,不方便进行测试, 自己要一个接口去进行模拟。去作为我们项目访问模拟接口。自己写一个接口,需要怎样写 一、flask:轻量级的web应用的框架 安装命令 pip install flask 1、flask-web应用 1)…

【防雷】浪涌保护器的选择与应用

浪涌保护器&#xff08;SPD&#xff09;是一种用于保护电气设备免受电力系统突发的电压浪涌或过电压等干扰的重要装置。供电系统由于外部受雷击、过电压影响&#xff0c;内部受大容量设备和变频设备的开、关、重启、短路故障等&#xff0c;都会产生瞬态过电压&#xff0c;带来日…

你下载的蓝光电影,为什么不那么清晰?

1080P 为什么糊 蓝光对应的就是 1080P分辨率为 1920 * 1080 随便抽取一帧画面&#xff0c;得到的就是一张有 1920 * 1080 个像素点的图片大多数电影是每秒播放 24 张图片&#xff0c;也就是一个 24 帧的电影 电影在电脑上的储存 压缩方案 不仅仅有如下两种&#xff0c;还有…

Vue3 + uni-app 微信小程序:仿知乎日报详情页设计及实现

引言 在移动互联网时代&#xff0c;信息的获取变得越来越便捷&#xff0c;而知乎日报作为一款高质量内容聚合平台&#xff0c;深受广大用户喜爱。本文将详细介绍如何利用Vue 3框架结合微信小程序的特性&#xff0c;设计并实现一个功能完备、界面美观的知乎日报详情页。我们将从…

Linux LVM扩容方法

问题描述 VMware Centos环境&#xff0c;根分区为LVM&#xff0c;大小50G&#xff0c;现在需要对根分区扩容。我添加了一块500G的虚拟硬盘(/dev/sdb)&#xff0c;如何把这500G扩容到根分区&#xff1f; LVM扩容方法 1. 对新磁盘分区 使用fdisk /dev/sdb命令&#xff0c;进…

C++:类和对象1

1.类的定义 类定义在面向对象编程中是一个核心概念&#xff0c;它定义了对象的结构和行为。在C中&#xff0c;类定义包含类的名称、数据成员&#xff08;也称为属性或者字段&#xff09;和成员函数&#xff08;也称为方法或者操作&#xff09;多个部分。数据成员定义了对象的状…

2024-07-16 Unity插件 Odin Inspector5 —— Conditional Attributes

文章目录 1 说明2 条件特性2.1 DisableIf / EnableIf2.2 DisableIn / EnableIn / ShowIn / HideIn2.3 DisableInEditorMode / HideInEditorMode2.4 DisableInInlineEditors / ShowInInlineEditors / HideInInlineEditors2.5 DisableInPlayMode / HideInPlayMode2.6 ShowIf / Hi…

docker安装mysql突然无法远程连接

docker安装mysql突然莫名其妙的无法远程连接 docker安装mysql突然无法远程访问问题背景发现问题排查问题解决问题总结 docker安装mysql突然无法远程访问 问题背景 大概一年前在服务器中通过docker安装mysql5.7端口映射关系是3308->3306 前期在服务器上开方了3308端口 fir…

Python用Pyqt5制作音乐播放器

具体效果如下 需要实现的功能主要的几个有&#xff1a; 1、搜索结果更新至当前音乐的列表&#xff0c;这样播放下一首是搜素结果的下一首 2、自动播放 3、滚动音乐文本 4、音乐进度条 5、根据实际情况生成音乐列表。我这里的是下面的情况&#xff0c;音乐文件的格式是 歌…

图——图的遍历(DFS与BFS算法详解)

前面的文章中我们学习了图的基本概念和存储结构&#xff0c;大家可以通过下面的链接学习&#xff1a; 图的定义和基本术语 图的类型定义和存储结构 这篇文章就来学习一下图的重要章节——图的遍历。 目录 一&#xff0c;图的遍历定义&#xff1a; 二&#xff0c;深度优先…

【MySQL】:学习数据库必须要知道的背景知识

客户端—服务器 客户端是一个“客户端—服务器”结构的程序 C&#xff08;client&#xff09;—S&#xff08;server&#xff09; 客户端和服务器是两个独立的程序&#xff0c;这两个程序之间通过“网络”进行通信&#xff08;相当于是两种角色&#xff09; 客户端 主动发起网…

CV12_ONNX转RKNN模型(谛听盒子)

暂时简单整理一下&#xff1a; 1.在边缘设备上配置相关环境。 2.配置完成后&#xff0c;获取模型中间的输入输出结果&#xff0c;保存为npy格式。 3.将onnx格式的模型&#xff0c;以及中间输入输出文件传送到边缘设备上。 4.编写一个python文件用于转换模型格式&#xff0c…

对某根域的一次渗透测试

前言 两个月之前的一个渗透测试项目是基于某网站根域进行渗透测试&#xff0c;发现该项目其实挺好搞的&#xff0c;就纯粹的没有任何防御措施与安全意识所以该项目完成的挺快&#xff0c;但是并没有完成的很好&#xff0c;因为有好几处文件上传没有绕过&#xff08;虽然从一个…

linux|多线程(一)

主要介绍了为什么要有线程 和线程的调用 和简单的对线程进行封装。 背景知识 a.重谈地址空间 我们知道物理内存的最小单元大小是4kB 物理内存是4G那么这样的单元友1M个 操作系统先描述再组织struct page[1M] 对于32位数据字长的机器&#xff0c;页表有2^32条也就是4G条&#…

springboot的JWT令牌

生成JWT令牌 依赖 <!--jwt令牌--> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt</artifactId> <version>0.9.1</version> </dependency> <dependency> <groupId>javax.xml.bind<…