WebGL入门:将3D世界带入网页的魔法

server/2024/9/22 14:19:17/

        WebGL,就像是给网页装上了一双3D眼镜,让我们可以在浏览器里看到和操作三维空间的物体。想象一下,就像你可以在电脑屏幕上玩一个立体的乐高游戏,而不只是看平面的图纸。下面,我们将用一些简单的例子来理解WebGL的核心概念,并通过简短的代码示例来加深理解。

1. WebGL是什么?

        WebGL是一种在网页上渲染交互式3D图形和2D图形的技术,它不需要任何插件,就像你的手机不需要安装额外的软件就可以拍照一样。WebGL是HTML5的一部分,利用了GPU(图形处理器)的力量,让网页上的图形更加生动、流畅。

2. 坐标系:三维空间的定位

        在WebGL中,我们用坐标系来定位三维空间中的物体,就像你在城市里用GPS定位一样。WebGL使用的是右手坐标系,其中x轴指向屏幕的右侧,y轴指向屏幕的上方,z轴则指向屏幕外,就像你把手掌伸向屏幕,手指指向右,拇指指向上的方向。

代码示例:

javascript">const canvas = document.getElementById('myCanvas');
const gl = canvas.getContext('webgl');// 设置视图矩阵,这就像调整相机的视角
const fieldOfView = 45 * Math.PI / 180;   // 视角,45度
const aspect = canvas.width / canvas.height; // 画布的宽高比
const zNear = 0.1;                         // 最近的可见距离
const zFar = 100.0;                        // 最远的可见距离// 创建一个4x4矩阵来存储投影矩阵
const projectionMatrix = mat4.create();
// 使用透视投影设置矩阵,这决定了我们如何“看到”3D空间
mat4.perspective(projectionMatrix, fieldOfView, aspect, zNear, zFar);

3. 顶点着色器与片段着色器:给物体上色

        想象一下,你在给一个乐高模型上色。顶点着色器负责处理模型的每个顶点(就像模型的每个角落),决定它的位置和颜色。片段着色器则负责处理每个像素点,决定最终屏幕上显示的颜色。

代码示例:

javascript">const vertexShaderSource = `attribute vec3 a_position; // 输入属性,代表顶点位置void main() {gl_Position = vec4(a_position, 1.0); // 设置顶点的最终位置}
`;const fragmentShaderSource = `precision mediump float; // 精度声明,对于颜色计算很重要void main() {gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); // 设置片段(像素)的颜色为红色}
`;// 创建并编译顶点着色器
const vertexShader = gl.createShader(gl.VERTEX_SHADER);
gl.shaderSource(vertexShader, vertexShaderSource);
gl.compileShader(vertexShader);// 创建并编译片段着色器
const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);
gl.shaderSource(fragmentShader, fragmentShaderSource);
gl.compileShader(fragmentShader);

4. 缓冲区:存储顶点数据

        缓冲区就像是乐高模型的盒子,里面装着模型的各个部分。在WebGL中,我们使用缓冲区来存储顶点坐标、颜色、纹理坐标等数据。

代码示例:

javascript">// 顶点数据,定义一个正方形的四个顶点
const vertices = [-0.5, 0.5, 0.0, // 顶点1,左上角-0.5, -0.5, 0.0, // 顶点2,左下角0.5, 0.5, 0.0, // 顶点3,右上角0.5, -0.5, 0.0 // 顶点4,右下角
];// 创建一个缓冲区对象
const buffer = gl.createBuffer();
// 绑定缓冲区,使其成为当前操作的目标
gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
// 将顶点数据填充到缓冲区中
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STATIC_DRAW);

        通过这些基础知识和代码示例,希望你对WebGL有了初步的了解。WebGL的世界很广阔,从简单的3D模型到复杂的游戏场景,它都能胜任。继续探索,你会发现更多惊喜!


http://www.ppmy.cn/server/119091.html

相关文章

23种设计模式详解

23种设计模式详解 文章目录 23种设计模式详解1 设计模式概述1.1 创建型模式(Creational Patterns)2.2 结构型模式(Structural Patterns)3.3 行为型模式(Behavioral Patterns) 2 设计模式详解2.1 简单工厂模…

PAT甲级-1075 Judge

题目 题目大意 对参加PAT考试的考生进行排名。输入给出人数N,题目数量K,提交总次数M。接下来一行给出每道题对应的分数。考生的提交按照 考生id-题目序号-本次提交的分数 格式给出。 注意,如果提交的结果编译器未通过,那么给定的…

【设计模式】工厂模式、单例模式、观察者模式、发布订阅模式

1.工厂模式 class Factory{createProduct(name){return new Product(name);} } class Product{constructor(name){this.namename;}display(){console.log(product:${this.name});} }//使用 const factorynew Factory(); const p1factory.createProduct(P1); const p2factory.c…

【笔记】扩散模型(八):DALL-E 2 (unCLIP) 论文解读与代码实现

论文链接:Hierarchical Text-Conditional Image Generation with CLIP Latents 非官方实现:lucidrains/DALLE2-pytorch DALL-E 2 是一个比较经典的文生图模型,虽然和 Stable Diffusion 的架构有些区别,但是也利用了 CLIP 的文本-图…

Selenium with Python学习笔记整理(网课+网站)

本篇是根据学习网站和网课结合自己做的学习笔记,后续会一边学习一边补齐和整理笔记 官方学习网站在这获取: https://selenium-python.readthedocs.io/getting-started.html#simple-usage WEB UI自动化环境配置 (推荐靠谱的博客文章来进行环境配置,具…

孙怡带你深度学习(1)--神经网络

文章目录 深度学习神经网络1. 感知器2. 多层感知器偏置 3. 神经网络的构造4. 模型训练损失函数 总结 深度学习 深度学习(DL, Deep Learning)是机器学习(ML, Machine Learning)领域中一个新的研究方向。 从上方的内容包含结果,我们可以知道,在学习深度学…

Redis 配置

一、关系型数据库与非关系型数据库 1. 关系型数据库 关系型数据库是一种结构化数据库,基于关系模型(二维表格模型),适合记录数据。通过 SQL(结构化查询语言)进行数据的检索和操作。主流的关系型数据库包括…

Qt 学习第十天:小项目:QListWidget的使用

一、页面布局 二、命名按钮 双击按钮可以修改显示中的文字(例如:改成“全选”),objectName是要改成程序员所熟悉的名字(英文,符合代码规范)方便修改和书写代码,一看就能看懂的 三、…