WebGL

news2024/12/23 23:35:45

1、WebGL介绍

1.1 WebGL不足

效果较差:较于桌面开发API:Direct3D、OpenGL、UE、Unity。

开发成本:熟悉并掌握一定的数据知识,例如:线性代数。

硬件要求:开发及部署系统硬件要求较高,尤其GPU。

1.2 WebGL学习基础

物理知识、{HTML、CSS、JavaScript、计算机图形学}、数学基础

1.3 WebGL学习资料

网站:

  • WebGL中文网:WebGL中文网
  • GAMES计算机图形学官网:GAMES简介 – 计算机图形学与混合现实在线平台
  • Three.js网站(WebGL的二次封装):Three.js教程

课程:

  • GAMES101-现代计算机图形学入门-闫令琪:GAMES101-现代计算机图形学入门-闫令琪 - Bing video

书籍:

  • WebGL编程指南
  • WebGL高级
  • GPU编程与CG语言之阳春白雪下里巴人(康玉之)

 2、WebGL入门

2.1 WebGL容器(坐标系)

canvas的坐标系如下图,其中canvas坐标的单位都是“px”

 WebGL坐标系如下图,WebGL使用的是正交右手坐标系,每个方向可使用的值的区间都是(-1,1),超出该矩形区间的图像不会绘制。这些值与Canvas的尺寸无关,无论Canvas的长宽比是多少,WebGL的区间值都是一致的。

 2.2 WebGL渲染管线

渲染管线就像一条流水线,由一系列具有特定功能的数字电路单元组成,下一个功能单元处理上一个功能单元生成的数据,逐级处理数据。

顶点着色器和片元着色器是可编程的功能单元,拥有更大的自主性,还有光栅器、深度测试等不可编程的功能单元。

CPU会通过WebGL API和GPU通信,传递着色器程序数据

  • GPU执行的着色器程序可以通过useProgram方法切换。
  • 传递数据就是把CPU主存中的数据传递到GPU显存中。

顶点缓冲区:形状的坐标信息。待加工的数据/数组,将这组数据给到程序,就可以进行处理。

uniform数据:shader里面的数据,把“顶点缓冲区”的数据传递给“顶点着色器”。

图元装配:这些顶点缓冲区用来干什么?做“方便面”。

光栅器:矢量的图形转换成像素图形。

片元着色器:把颜色/纹理加到光栅化后的像素上。

归属测试/模板测试、深度测试(3D):绘制前的测试。

2.3 WebGL关键名词

(1)顶点着色器

GPU渲染管线上一个可以执行着色器语言的功能单元,具体执行的就是顶点着色器程序。

WebGL顶点着色器程序在JavaScript中以字符串的形式存在,通过编译处理后传递给顶点着色器执行。

总结:顶点着色器主要作用就是执行顶点着色器程序对顶点进行变换计算。例如顶点位置坐标进行旋转、平移等矩阵变换,变换后新的顶点坐标然后赋值给内置变量gl_Position,作为顶点着色器的输出,图元装配和光栅化环节的输入。

 (2)图元装配

硬件上具体怎么回事不用思考,从程序的角度来看,就是绘制函数drawArrays()或drawElements()第一个参数绘制模式mode控制顶点如何装配为图元:

  • gl.LINES:把两个顶点装配成一个线条图元。
  • gl.TRIANGLES:把三个顶点装配为一个三角面图元。
  • gl.POINTS:一个点域图元。

 (3)光栅化

分解成一些小的像素。

片元着色器

片元着色器和顶点着色器一样是GPU渲染管线上一个可以执行着色器程序的功能单元。顶点着色器处理的是逐顶点处理顶点数据,片元着色器是逐片元处理片元数据。

通过给内置变量gl_fragColor赋值可以给每一个片元进行着色,值可以是一个确定的RGBA值,可以是一个和片元位置相关的值,也可以是插值后的顶点颜色。

除了给片元进行着色外,通过关键字discard还可以实现哪些片元可以被丢弃,被丢弃的片元不会出现在帧缓冲区,自然不会显示在canvas画布上。

2.4 实例:鼠标动态绘制点

2.5 动态绘制多个点

蓝色:屏幕坐标系

绿色:canvas坐标系 

最里面是:WebGL坐标系,坐标范围是(-1,1)

2.6 绘制命令

(1)webgl.drawArrays()

POINTS

LINES LINE_STRIP LINE_LOOP

TRIANGLES TRIANGLE_STRIP TRIANGLES_FAN

(2)drawElements()

好处:当大量数据时,顶点缓冲区数据量很大时,内存会受到限制。使用索引缓冲区,可以节省内存,重复利用点。

用法:需要创建一个索引缓冲区

3 WebGL常用API

(1)TypeArray类型化数组和Array无类型数组

TypeArray数组最大的作用:提升数组的性能。浏览器事先知道数组中的数据类型,故而处理起来更有效率。

JS中Array的内部实现是链表,可以动态增加减少元素,但是元素多时,性能会比较差。当访问某个元素时,需要通过链表一个一个地找下去。

类型化数组管理的是连续内存区域,知道了这块内存的起始位置,可以通过起始位置+N*偏移量(一次加法一次乘法操作)访问到第N个位置的元素。

类型化数组将实现拆分为缓冲和视图两部分。

  • 一个缓冲(ArrayBuffer)描述的是内存中的一段二进制数据,缓冲没有格式而言,并且不提供机制访问其内容。
  • 为了访问在缓存对象中包含的内存,你需要使用视图。视图可以将二进制数据转换为实际有类型的数组。
  • 一个缓冲可以提供给多个视图进行读取,不同类型的视图读取的内存长度不同,读取出来的数据格式也不同。

(2)Float32Array和Float64Array

单精度,也即float,一般在计算机中存储占用4字节,也32位,有效位数为7位;双精度(double)在计算机中存储占用8字节,64位,有效位数为16位。

单精度是这样的格式,1位符号,8位指数,23位小数。 双精度是1位符号,11位指数,52位小数。 含义:表明单精度和双精度精确的范围不一样,

(3)类型化数组的方法、属性和常量

get(index) 、set(index,value)、set(array,offset)、length、BYTES_PER_ELEMENT

(4)顶点数据配置(顶点缓冲区)

createBuffer()方法会在GPU控制的显存上创建一个缓冲区用来存储顶点或顶面索引数据。通过deleteBuffer(buffer)表示:删除某个缓冲区,参数buffer表示顶点/顶点索引缓冲区的名字,也就是执行createBuffer()方法返回的对象变量名。

bindBuffer(target,buffer):target相同,也就是同类缓冲区在同一个时刻只能绑定一个,只有处于绑定状态才能传入数据。

  • target:gl.ARRAY_BUFFER表示顶点缓冲区;ELEMENT_ARRAY_BUFFER表示顶点索引缓冲区。
  • buffer:顶点缓冲区变量名。

bufferData(target,data,usage):把CPU控制的内存中类型数组传入GPU控制的线程顶点或顶点索引缓冲区。

  • target:
  • data:CPU内存
  • usage:通过不同的值控制传入缓冲区数据的方式、GPU使用缓冲区调用数据方式:gl.STATIC_DRAW静态绘制模式(只绘制一次);gl.STREAM_DRAW流绘制模式;gl.DYNAMTC_DRAW动态绘制模式

vertexAttribPointer(location,size,type,normalized,stride,offset)

规定GPU从顶点缓冲区去读取数据的方式,很多时候为了提高顶点数据的传输读取效率,往往会把顶点位置、顶点颜色、顶点法向量、纹理坐标交叉定义在一个类型数组汇总,一次性传入顶点缓冲区中,CPU和GPU不需要多次通信,只需要执行一次databuffer()方法,这时候GPU为了使用顶点缓冲区的不同用于数据,就要按照一定规律读取。

可以在同一个WebGL程序中定义多个该方法,每个方法的参数location分别指向一个不同的顶点变量,然后控制其后面其他的参数。

  • location:顶点着色器程序中顶点的位置(shader中的变量-》JS中的变量)
  • size:每次取几个数据(x,y,z,1.0)。如果该值为1,着色器程序中的顶点变量vec4后的第2,3分量是0,第4分量是1。
  • type:顶点数据类型,所有数据没有分界线,只能靠类型按作用的位bit数来分界。
  • normalized:布尔值,是否归一化到区间[0,1],[-1,1],一般为false
  • stride:点个数*字节数
  • offset:CPU从一组数据中第几元素开始读取数据

enableVertexAttribArray(location)

顶点缓冲区和GPU渲染管线之间存在一个硬件单元可以决定GPU是否能读取顶点缓冲区中的顶点数据。关闭方法:disableVertexAttribArray(location),location是顶点着色器程序中顶点变量的索引位置。

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

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

相关文章

炒股经验总结

判断大盘调整到后期 高位补跌,大盘出现大阴线 板块炒作到尾声 板块龙头开始回调,炒作炒到边角料 良好的量价关系 放量突破,缩量回踩 跌破前低3天收不回来止损,无关涨跌,这是底线,以后涨了也不后悔&am…

正点原子IMX6ULL-Linux驱动开发

目录 第一期 第6讲 Ubuntu终端操作与Shell命令 第一期 第8讲 Ubuntu文件系统结构 第一期 第9讲 Ubuntu磁盘管理 第一期 第10讲 Ubuntu压缩与解压缩 第一期 第11讲 Ubuntu用户和用户组 第一期 第12讲 Ubuntu文件权限 第一期 第13讲Linux连接文件 第一期 第14讲 vim编辑器 第一期…

专利申请与专利转让有什么区别?

专利申请与专利转让有什么区别? 一、专利转让和专利申请的流程不同 专利转让的流程: (1)找到合适的转让途径; (2)专利转让人和专利受让人进行签署专利权转让合同; (3)填写专利转让相关文件,需要严格按照国家规定形式进行填写&#…

公司想要做自动化测试,那么自动化测试发展和价值回报有哪些?

很长一段时间,都在思考,怎么能通俗的看待自动化测试的收效 自动化测试到底能不能成为一种趋势? 自动化测试到底能不能形成一种规模? 自动化测试到底能不能成为我们的利器? 自动化测试到底能对我们的职业带来何种发…

为什么有的公司会禁用spring声明式事务

在之前我一直偏向于使用声明式事务,我一直觉得声明式事务比较好用。相比于编程式事务,使用声明式事务时只需要加上一个注解,spring就能够帮助我们完成所有的事务控制。反观编程式事务却需要我们自己去控制事务的提交和回滚,这种代…

【JavaSE】Clonable?关于深拷贝与浅拷贝那些事儿咱们一次聊明白

💁 个人主页:黄小黄的博客主页 ❤️ 支持我:👍 点赞 🌷 收藏 🤘关注 🎏 格言:All miracles start from sometime somewhere, make it right now. 本文来自专栏:JavaSE从入…

新年新气象,100行 Python 代码制作动态鞭炮

放鞭炮贺新春,在我国有两千多年历史。关于鞭炮的起源,有个有趣的传说。 西方山中有焉,长尺余,一足,性不畏人。犯之令人寒热,名曰年惊惮,后人遂象其形,以火药为之。——《神异经》 当…

IU8689 单声道145W/75W立体声D类音频功放IC产品介绍

概要 IU8689E是-款单声道可输出145W,立体声2*75W D类音频功率放大器,这款器件在顶层设计了散热焊盘,焊盘上连接散热器后在供电电压24V的情况下,最大可以输出2x75W的连续功率;通过主从模式的设置可以让IU8689E实现无限级联&#x…

C# 线程的基本使用

一 多线程的概念 1 进程Process 2 线程Thread ① 线程中的指令:一个方法(委托) ② 线程中的数据:相关的对象; 3 System.Threading.Thread属性 4 System.Threading.Thread方法 5 线程的创建 1) Thread类…

初识Spring

目录 一: 为什么要学习? 二: 概述 三:Spring发展史 一: 为什么要学习? 可以最大程度地简化项目的开发大量公司在使用顶级的源码设计:spring框架源码设计非常优秀,在java开源项目中可以说是顶…

1.8T数据离奇消失之谜

编者按 数字化浪潮蓬勃兴起,企业面临的安全挑战亦日益严峻。 腾讯安全近期将复盘2022年典型的攻击事件,帮助企业深入了解攻击手法和应对措施,完善自身安全防御体系。 本篇是第六期,讲述了某企业NAS系统数据被删除,始…

SpringBoot 配合126邮箱实现邮件发送功能

126邮箱邮件发送授权码申请pom依赖邮件配置代码编写Bean与配置自动装载原始手工方式发送邮件发送纯文本的邮件发送包含HTML标签的邮件发送包含附件的邮件发送包含静态资源的文件测试SpringBoot 提供了系统级别邮箱服务,只需要导入一个邮箱启动器然后进行配置就可以使…

LabVIEW如何减少下一代测试系统中的硬件过时6

LabVIEW如何减少下一代测试系统中的硬件过时6 HAL Benefits When addressing obsolescence, HALs yield the benefits of lowermigration costs, faster migration time, higher code reuse, and easiermaintainability. Lower Migration Costs The act of designing a use…

如何pdf合并成一个?推荐3种方法

在企业处理多份合同文件或者财务报销时,经常会处理大量的PDF文件。因此为了更高效率办公,我们经常需要将多个pdf合并成一个。如何pdf合并成一个呢?给大家推荐3个方法。 1、Smallpdf工具 如何pdf合并成一个?推荐大家可以使用Small…

一篇canvas带你画出整个特效世界

目录 一,canvas是啥? 1.初识canvas 2.路径绘制 3.拆分画法 4.清除画布 5.绘制圆形笑脸 6.贝塞尔曲线 ①二次贝塞尔曲线 ②三次贝塞尔曲线 一,canvas是啥? Canvas是HTML5中新出的一个元素,我们可以在上面绘制…

为什么redis中提供hash数据类型?

目录 1.什么是哈希表?缺点是什么? 2.Redis的数据类型(type、encoding) 3.比较常用命令、使用场景、实现方式 1.什么是哈希表?缺点是什么? 把关键字key映射到表中记录的地址。映射关系是散列函数&#x…

图表控件LightningChart.NET 入门教程(六):许可证管理介绍(上)

LightningChart.NET SDK 是一款高性能数据可视化插件工具,由数据可视化软件组件和工具类组成,可支持基于 Windows 的用户界面框架(Windows Presentation Foundation)、Windows 通用应用平台(Universal Windows Platfor…

初学Java web(十)Filter 和 Listener

Filter和Listener 一.Filter 概念:Filter表示过滤器,是JavaWeb三大组件(Servlet、Filter、Listener)之一。 过滤器可以把对资源的请求拦截下来,从而实现一些特殊的功能。 过滤器一般完成一些通用的操作,比如:权限控…

Nuttx学习入门

Nuttx学习 NuttX 是一个实时操作系统 (RTOS),强调标准合规性和占用空间小。可从 8 位扩展到 64 位微控制器环境,NuttX 中的主要管理标准是 POSIX 和 ANSI 标准。 NuttX 的主要环境依赖性是 (1) GNU make,(2) bash 脚本,和 (3) L…

第三十四章 数论——高斯消元解线性方程组

第三十四章 数论——高斯消元解线性方程组一、高斯消元1、线性方程组2、高斯消元步骤(1)数学知识铺垫增广矩阵和阶梯矩阵初等变换(2)高斯消元步骤二、代码模板1、问题:2、代码一、高斯消元 1、线性方程组 我们在小学…