WebGL 实战:绘制你的第一个点(三)
引言
万丈高楼平地起,学习 WebGL 也需要从基础开始。在前两篇文章中,我们分别介绍了 WebGL 的基础知识和渲染管线的原理。这一次,让我们动手绘制一个简单的点。这看似简单的目标,其实包含了 WebGL 的核心概念:着色器、缓冲区、坐标系等。通过这个案例,你将了解 WebGL 程序的基本结构,为接下来的复杂渲染打下坚实的基础。
WebGL 的第一步:学会画点!这是开启 3D 世界的起点。WebGL系列,持续更新
准备工作
在开始之前,你需要以下工具和基础文件:
- 一个现代浏览器(建议使用 Chrome 或 Firefox)。
- 文本编辑器(例如 VS Code 或 Sublime Text)。
HTML 基础模板:
将上面的代码保存为 index.html,我们将在 point.js 文件中编写 WebGL 的主要逻辑。
确保你的浏览器支持 WebGL,可以在 https://get.webgl.org/ 测试兼容性。
虽然本文主要讨论 GLSL 在 WebGL 中的使用,但 GLSL 的应用范围远不止于此。GLSL (OpenGL Shading Language) 还是许多游戏引擎中着色器开发的核心语言。这是因为 GLSL 是 OpenGL 标准的一部分,而许多游戏引擎(例如 Cocos、Unity、Unreal Engine 等)都支持或基于 OpenGL 或其变种来实现图形渲染。
实现步骤
第一步:初始化 WebGL 上下文
创建一个 point.js 文件,并编写以下代码来初始化 WebGL 环境
目的: 获取与显卡交互的 WebGL 上下文 gl,它是后续绘图操作的基础。
第二步:创建着色器
着色器概念:
WebGL 渲染的核心逻辑依赖着色器,主要包括 顶点着色器 和 片元着色器。
着色器由 GLSL 语言编写,运行在 GPU 上,负责处理顶点数据和像素颜色。
1、顶点着色器
定义点的位置:
- 片元着色器
定义点的颜色:
第三步:编译着色器并创建程序
第四步:传递顶点数据
传递顶点坐标到 GPU,并绑定到 a_position:
为顶点着色器传递一个点的位置(例如:[0.0, 0.0, 0.0, 1.0] 表示屏幕中心):
第五步:绘制点
最后,通过 gl.drawArrays 绘制点:
point.js 完整代码
运行 index.html,你将在屏幕中心看到一个红色的点。虽然它看起来很简单,但这是 WebGL 渲染的第一步。从这个点开始,你可以添加更多的元素,例如线条、三角形,甚至整个 3D 世界!
补充说明
坐标系说明:
“WebGL 使用的是左手坐标系,x 轴向右,y 轴向上,z 轴垂直屏幕朝内。在顶点着色器中,点的位置需要通过 gl_Position 映射到裁剪坐标系,其范围是 [-1, 1]。”
像素和点的关系
点的大小受设备像素密度(DPI)和 gl_PointSize 的影响,但某些平台可能限制点的最大尺寸,可以通过 gl.getParameter(gl.ALIASED_POINT_SIZE_RANGE) 查询。
点的大小
默认情况下,绘制的点大小是系统决定的。可以通过 gl_PointSize 在顶点着色器中设置点的大小。
为什么点的位置是 vec4?
1、裁剪坐标系的要求:
WebGL 使用齐次坐标(vec4)来表示点的位置。在绘制 3D 图形时,这种表示方式非常灵活:
-
前三个分量 (x, y, z) 表示点在三维空间的位置。
-
第四个分量 w 用于透视投影计算。例如,当 w = 1.0 时,点是标准的三维坐标;当 w 不等于 1.0 时,点的位置会被按比例缩放。
2、与变换矩阵配合:
在 3D 图形渲染中,变换矩阵通常是 4x4 的形式。将点表示为 vec4,使得可以直接通过矩阵乘法完成模型、视图、投影等变换操作。
3、兼容性:
即使是在 2D 绘制中,我们依然使用 vec4,这样在扩展到 3D 时无需修改顶点着色器。
结语
通过这篇文章,你已经了解了 WebGL 的基本工作流程:初始化上下文、创建着色器、传递顶点数据、绘制图形。从一个简单的点开始,我们逐步掌握 WebGL 的核心概念。下一步,我们将继续探索如何绘制更复杂的图形,例如 线条和三角形,敬请期待!