跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
JavaScript大前端

JavaScript 基础:WebGL 常量、命名规范与绘图初始化

WebGL 开发涉及常量访问、方法命名约定及绘图环境初始化。核心包括区分 GL_前缀与 gl 对象属性,理解参数后缀含义,配置清除颜色与视口坐标系统,以及顶点缓冲区的创建、绑定与内存管理。掌握这些基础是构建 WebGL 应用的关键步骤。

云朵棉花糖发布于 2025/1/19更新于 2026/6/913 浏览
JavaScript 基础:WebGL 常量、命名规范与绘图初始化

1. 常量

如果你熟悉 OpenGL,应该对操作常量很熟悉。这些常量在 OpenGL 中的名字通常以 GL_ 开头。而在 WebGL 中,context 对象上的常量则去掉了这个前缀。例如,GL_COLOR_BUFFER_BIT 常量在 WebGL 中要这样访问:gl.COLOR_BUFFER_BIT。WebGL 以这种方式支持大部分 OpenGL 常量(少数常量不支持)。

2. 方法命名

OpenGL 和 WebGL 中的很多方法会包含相关的数据类型信息。接收不同类型和不同数量参数的方法,会通过方法名的后缀体现这些信息。表示参数数量的数字 (1~4) 在先,表示数据类型的字符串 ("f" 表示浮点数,"i" 表示整数) 在后。比如,gl.uniform4f() 的意思是需要 4 个浮点数值参数,而 gl.uniform3i() 表示需要 3 个整数值参数。

还有很多方法接收数组,这类方法用字母 "v" (vector) 来表示。因此,gl.uniform3iv() 就是要接收一个包含 3 个值的数组参数。在编写 WebGL 代码时,要记住这些约定。

3. 准备绘图

准备使用 WebGL 上下文之前,通常需要先指定一种实心颜色清除。为此,要调用 clearColor() 方法并传入 4 个参数,分别表示红、绿、蓝和透明度值。每个参数必须是 0~1 范围内的值,表示各个组件在最终颜色的强度。比如:

gl.clearColor(0, 0, 0, 1); // 黑色
gl.clear(gl.COLOR_BUFFER_BIT);

以上代码把清理颜色缓冲区的值设置为黑色,然后调用 clear() 方法,这个方法相当于 OpenGL 中的 glClear() 方法。参数 gl.COLOR_BUFFER_BIT 告诉 WebGL 使用之前定义的颜色填充画布。通常,所有绘图操作之前都需要先清除绘制区域。

4. 视口与坐标

绘图前还要定义 WebGL 视口。默认情况下,视口使用整个区域。要改变视口,可以调用 viewport() 方法并传入视口相对于元素的 x、y 坐标及宽度和高度。例如,以下代码表示要使用整个元素:

gl.viewport(0, 0, drawing.width, drawing.height);

这个视口的坐标系统与网页中通常的坐标系统不一样。视口的 x 和 y 坐标起点 (0, 0) 表示元素的左下角,向上、向右增长可以用点 (width–1, height–1) 定义。

知道如何定义视口就可以只使用元素的一部分来绘图。比如下面的例子:

// 视口是<canvas> 左下角四分之一区域
gl.viewport(0, 0, drawing.width/2, drawing.height/2);
// 视口是<canvas> 左上角四分之一区域
gl.viewport(0, drawing.height/2, drawing.width/2, drawing.height/2);
// 视口是<canvas> 右下角四分之一区域
gl.viewport(drawing.width/2, 0, drawing.width/2, drawing.height/2);

定义视口的坐标系统与视口中的坐标系统不一样。在视口中,坐标原点 (0, 0) 是视口的中心点。左下角是 (–1, –1),右上角是 (1, 1)。

如果绘图时使用了视口外部的坐标,则绘制结果会被视口剪切。例如,要绘制的形状有一个顶点在 (1, 2),则视口右侧的图形会被切掉。

5. 缓冲区

在 JavaScript 中,顶点信息保存在定型数组中。要使用这些信息,必须先把它们转换为 WebGL 缓冲区。创建缓冲区要调用 gl.createBuffer() 方法,并使用 gl.bindBuffer() 方法将缓冲区绑定到 WebGL 上下文。绑定之后,就可以用数据填充缓冲区了。比如:

let buffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([0, 0.5, 1]), gl.STATIC_DRAW);

调用 gl.bindBuffer() 将 buffer 设置为上下文的当前缓冲区。然后,所有缓冲区操作都在 buffer 上直接执行。因此,调用 gl.bufferData() 虽然没有包含对 buffer 的直接引用,但仍然是在它上面执行的。上面最后一行代码使用一个 Float32Array(通常把所有顶点信息保存在 Float32Array 中)初始化了 buffer。如果想输出缓冲区内容,那么可以调用 drawElements() 方法并传入 gl.ELEMENT_ARRAY_BUFFER。

gl.bufferData() 方法的最后一个参数表示如何使用缓冲区。这个参数可以是以下常量值:

  • gl.STATIC_DRAW: 数据加载一次,可以在多次绘制中使用。
  • gl.STREAM_DRAW: 数据加载一次,只能在几次绘制中使用。
  • gl.DYNAMIC_DRAW: 数据可以重复修改,在多次绘制中使用。

除非是很有经验的 OpenGL 程序员,否则我们会对大多数缓冲区使用 gl.STATIC_DRAW。

缓冲区会一直驻留在内存中,直到页面卸载。如果不再需要缓冲区,那么最好调用 gl.deleteBuffer() 方法释放其占用的内存:

gl.deleteBuffer(buffer);

目录

  1. 1. 常量
  2. 2. 方法命名
  3. 3. 准备绘图
  4. 4. 视口与坐标
  5. 5. 缓冲区
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • C++ STL 核心基础:迭代器、auto 与范围循环
  • 深入解析 AI 中的 Skills:机制、对比与应用场景
  • GitHub 自定义 SSH Key 配置与验证指南
  • AI 产品经理面试指南:核心能力、技术问答与项目实战
  • OpenClaw 本地部署配置飞书机器人指南
  • 大模型加速落地汽车领域,车企探索智能化新路径
  • 数据结构基础:二叉树与堆的实现详解
  • 数据结构核心:树、二叉树与堆的实现原理
  • 深入理解 Web Worker
  • 自然语言处理在社交媒体分析中的应用与实战
  • 冻结语言模型参数进行 Prompt 微调的技术解析
  • 硬盘分区详解:MBR 与 GPT 的区别与选择
  • Agent Skills Marketplace 完全指南:AI 编程助手技能开发与应用
  • C 语言 Web 开发实战:CGI、FastCGI 与 Nginx 模块详解
  • Linux 网络基础入门:协议、分层与传输流程详解
  • C++ string 类模拟实现详解
  • Linux 网络基础:协议分层与传输流程
  • 2024 年中国人工智能系列白皮书:体育人工智能
  • Linux 进程控制详解
  • C++ set 和 map 的封装实现原理

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online