信息发布→ 登录 注册 退出

J*aScript中的WebGL基础入门_j*ascript 3D图形

发布时间:2025-11-01

点击量:
首先获取WebGL上下文,然后编写并编译顶点和片段着色器,接着创建缓冲区传入顶点数据,最后调用drawArrays绘制三角形,完成基本渲染流程。

javascript中的webgl基础入门_javascript 3d图形

WebGL(Web Graphics Library)是一种在浏览器中渲染3D图形的技术,无需插件即可直接使用J*aScript操作GPU。它基于OpenGL ES 2.0,允许你在HTML5的<canvas></canvas>元素上绘制复杂的3D场景。对于刚接触J*aScript 3D图形开发的人来说,理解WebGL的基础结构和工作流程是关键。

创建WebGL上下文

要开始使用WebGL,第一步是获取一个WebGL渲染上下文。这通常通过<canvas></canvas>元素完成。

示例代码:

const canvas = document.getElementById('myCanvas');
const gl = canvas.getContext('webgl');

if (!gl) {
  alert('你的浏览器不支持WebGL');
}

确保页面中有一个<canvas id="myCanvas"></canvas>元素。调用getContext('webgl')会返回一个WebGLRenderingContext对象,它是所有绘图操作的核心接口。

编写着色器程序

WebGL使用着色器(Shader)来控制图形渲染。最基本的两个着色器是顶点着色器(Vertex Shader)和片段着色器(Fragment Shader)。

顶点着色器处理每个顶点的位置,片段着色器决定像素的颜色。

// 顶点着色器源码
const vertexShaderSource = `
  attribute vec4 a_position;
  void main() {
    gl_Position = a_position;
  }
`;

// 片段着色器源码
const fragmentShaderSource = `
  precision mediump float;
  void main() {
    gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); // 红色
  }
`;

接下来需要将这些源码编译成着色器对象,并链接成一个程序:

function createShader(gl, type, source) {
  const shader = gl.createShader(type);
  gl.shaderSource(shader, source);
  gl.compileShader(shader);
  if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
    console.error('Shader编译失败:', gl.getShaderInfoLog(shader));
    gl.deleteShader(shader);
    return null;
  }
  return shader;
}

function createProgram(gl, vertexShader, fragmentShader) {
  const program = gl.createProgram();
  gl.attachShader(program, vertexShader);
  gl.attachShader(program, fragmentShader);
  gl.linkProgram(program);
  if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {
    console.error('Program链接失败:', gl.getProgramInfoLog(program));
    return null;
  }
  return program;
}

// 使用方式
const vertexShader = createShader(gl, gl.VERTEX_SHADER, vertexShaderSource);
const fragmentShader = createShader(gl, gl.FRAGMENT_SHADER, fragmentShaderSource);
const program = createProgram(gl, vertexShader, fragmentShader);
gl.useProgram(program);

绘制一个简单三角形

有了着色器程序后,就可以向GPU传递顶点数据并进行绘制。

Mureka Mureka

Mureka是昆仑万维最新推出的一款AI音乐创作工具,输入歌词即可生成完整专属歌曲。

Mureka 1091 查看详情 Mureka

定义三个顶点,组成一个三角形:

const positions = [
  -0.5, -0.5,
   0.5, -0.5,
   0.0,  0.5
];

const positionBuffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer);
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(positions), gl.STATIC_DRAW);

然后将缓冲区数据连接到顶点着色器中的属性变量:

const positionAttributeLocation = gl.getAttribLocation(program, 'a_position');
gl.enableVertexAttribArray(positionAttributeLocation);
gl.vertexAttribPointer(positionAttributeLocation, 2, gl.FLOAT, false, 0, 0);

最后执行绘制命令:

gl.drawArrays(gl.TRIANGLES, 0, 3); // 绘制三角形

理解坐标系与视口

WebGL的默认坐标系是左下为(-1,-1),右上为(1,1)的归一化设备坐标(NDC)。所有在该范围外的顶点都不会显示。

视口设置决定了canvas上的渲染区域:

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

通常在初始化时设置一次即可,但如果canvas尺寸变化,需要重新设置以保持正确比例。

基本上就这些。虽然原生WebGL API较为底层、代码冗长,但正是这种接近硬件的操作让你能精确控制图形渲染过程。掌握这些基础后,可以进一步学习模型变换、纹理映射、光照计算等内容,或使用Three.js等高级库提升开发效率。

以上就是J*aScript中的WebGL基础入门_j*ascript 3D图形的详细内容,更多请关注其它相关文章!


相关文章: Python Socket多播通信中指定源IP地址的实践指南  c++如何使用TBB库进行任务并行_c++ Intel线程构建模块  微信网页版登录教程_微信网页版登录入口在哪  J*aScript中在Map循环中检测并处理空数组元素  AO3中文官网链接_AO3网页版稳定镜像站  韩小圈电脑版在线入口_网页版免费登录地址  word邮件合并后日期格式不对怎么改_Word邮件合并日期格式修改方法  微信网页版官方快速登录入口 微信网页版网页版账号直达  QQ邮箱稳定登录入口_QQ邮箱官方网站网页版使用  钉钉视频会议画面卡顿如何解决 钉钉会议画面优化方法  composer 和 npm/yarn 在管理依赖方面有什么核心思想差异?  PDF文件体积过大处理_PDF压缩技巧详解  2026年发布! 美少女养成动作RPG《神剑少女战记》发布实机演示  J*a如何使用AtomicInteger控制计数_J*a无锁计数器性能分析  PHP URL参数传递与500错误调试指南  在FastAPI中利用lifespan与依赖注入高效管理Redis连接池  Golang并发任务中错误如何聚合_Golang goroutine error收集方式  PHP中获取MongoDB服务器运行时间(Uptime)的专业指南  《燕云十六声》两周内达九百万玩家!位居畅销榜第五  拼多多视频播放卡顿如何处理 拼多多视频播放优化技巧  Angular中单选按钮的正确使用与常见陷阱解析  PHP 枚举:根据字符串获取枚举案例的策略与实现  如何提高微信支付的安全性_微信支付安全防护与设置建议  在Go语言中利用后缀数组处理多字符串:实现高效文本匹配与自动补全  Lar*el开发:如何在编辑界面正确预选数据库中的多选标签  HTML5原生日期选择器与jQuery UI:实现日期选择器的联动与程序化控制  使用PHP DOM解析器高效提取HTML中特定标题及其紧邻段落  优化LangChain文档加载与ChromaDB集成:解决多文档处理与分块问题  PHP表单提交消息延迟显示:Post-Redirect-Get模式深度解析与实践  MAC怎么安装Homebrew包管理器_MAC为开发者和高级用户安装命令行工具  Yandex搜索引擎官方地址 俄罗斯网络世界的主要入口  KFC早餐时段怎么领特惠代码_KFC早餐订餐优惠代码获取与使用说明  如何配置Composer的PSR-4自动加载_Composer自动加载命名空间映射实践教程  J*a初级项目如何接入API数据_第三方接口请求与响应解析  优化MinIO list_objects_v2 操作的性能瓶颈与最佳实践  文心一言怎样用插件调度API数据_文心一言用插件调度API数据【API调用】  Win11蓝牙耳机断连怎么解决 Win11蓝牙设置重新配对与驱动更新【技巧】  12306选座怎么选到商务座_12306商务座选择与配置说明  零跑汽车11月交付量达70327台 实现连续9个月正增长  PHP表单隐藏域数据传递:常见问题与最佳实践  Lar*el Form Request 中唯一性验证更新操作的正确实践  Go与Ruby之间实现AES加密互通:CFB模式下的密钥长度匹配策略  微信客户端如何收红包_微信客户端接收红包使用教程  Lar*el 递归关系中排除指定分支的教程  使用CSS更改登录屏幕输入框中PNG图标颜色的策略与局限性  漫蛙manwa2最新登录网址_漫蛙manwa2手机网页版入口  “在文档元素之后找到了标记”是什么错误? 检查并修复XML中多个根元素的3个方法  JUnit5/Mockito:优雅测试内部依赖与异常处理的实践  Win11怎么设置开机NumLock亮 Win11修改注册表InitialKeyboardIndicators值  C#中解析不规范的HTML为XML 常见的坑与解决办法 

在线客服
服务热线

服务热线

4008988990

微信咨询
二维码
返回顶部
×二维码

截屏,微信识别二维码

打开微信

微信号已复制,请打开微信添加咨询详情!