新闻中心

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图形的详细内容,更多请关注其它相关文章!


# 的人  # 保定网站推广  # 网站建设朋友圈文案  # 文心一言seo  # seo优化后续  # 萍乡网站建设收费  # 长治百度推广营销  # 白银市比较好的网站推广  # 莱山品牌网站优化  # 石阡seo优化转化率  # 海鲜餐饮营销推广方案ppt软件  # 你在  # 是一种  # 有何区别  # javascript  # 搜索功能  # 如何实现  # 有哪些  # 如何用  # 角形  # 着色器  # canva  # ai  # 浏览器  # html5  # js  # html  # java 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: 纯CSS与HTML网格布局的HTML精简策略:SVG与JS方案解析  理解Python模块与全局变量的作用域管理  J*aScript中高效管理与清空动态列表:避免循环陷阱  优化MinIO list_objects_v2 操作的性能瓶颈与最佳实践  微信网页版官方快速登录入口 微信网页版网页版账号直达  PowerPoint如何制作滚动字幕结尾彩蛋_PowerPoint路径动画实现平滑滚动字幕效果  qq浏览器打开空白页怎么办 qq浏览器启动后显示白屏的解决教程  vivo浏览器自带的下载器速度慢怎么办 vivo浏览器提升文件下载速度的技巧  C++如何实现一个装饰器模式_C++设计模式之动态地给对象添加额外职责  在Runstone环境中高效处理TasteDive API的JSON数据  微博网页版主页入口 微博官方网站免登录访问  Golang指针如何与map组合使用_Golang map指针组合实践  网易大神账号申诉需要多久_网易大神账号申诉流程说明  如何高效处理PHP中的Excel数据导入导出?PortPHP/Spreadsheet助你轻松搞定!  微信语音通话掉线如何解决 微信语音通话稳定优化方法  C++ typeid如何获取类型信息_C++ RTTI运行时类型识别用法  整合Supabase认证与Django模型:跨模式迁移的解决方案  Win10如何恢复误删的快捷方式_Win10重建常用软件快捷方式  如何将一个大型PHP应用拆分为多个Composer包_微服务与模块化架构的Composer实践  机构:以往存储涨价周期小米利润率实际上有所改善 能转嫁给消费者等  Bilibili动漫最新防封地址发布-Bilibili动漫2025年最稳正版入口推荐  苹果手机如何防止被恶意App追踪  天猫双十一预售商品怎么退款_天猫双十一预售退款操作指南  Python vgamepad库按键模拟:正确使用XUSB_BUTTON常量  GemBox Document HTML转PDF垂直文本渲染问题及解决方案  Vue.js 图片显示异常排查:理解应用挂载范围与DOM ID唯一性  Spring Boot嵌入式服务器与J*a EE:功能支持深度解析  2025年云电脑操作系统体验 | 无需本地硬件,随时随地使用高性能PC  React Hooks最佳实践:动态组件状态管理的组件化方案  怎么去除衣服上的口红印_生活小妙招教你用酒精轻松擦除  Win10自动更新怎么关闭 Win10永久关闭系统更新的两种方法【终极版】  Go语言中Map存储的结构体如何调用指针方法:深入解析与实践  红果短剧网页版官网入口 官方最新网址发布  Win11如何开启讲述人功能 Win11屏幕阅读器(讲述人)开启与关闭【教程】  c++如何实现单例设计模式_c++线程安全的单例模式写法  怎样使用“本地安全策略”提升Windows安全性_Secpol.msc配置指南【高手】  Steam官网入口直达 Steam注册及登录步骤  如何使用纯J*aScript判断Input元素是否在特定类容器内  Golang如何通过reflect获取匿名字段方法_Golang reflect匿名字段方法访问技巧  NVIDIA股价11月重挫12%:下月有望好转 但难回5万亿美元巅峰  虚幻5科幻题材ARPG大作遭取消!本是《奇异人生》厂商新作  iCloud登录入口网页版 苹果iCloud官网登录  BetterDiscord插件中安全更新用户简介的实践指南  在J*a中如何使用BigDecimal进行高精度计算_BigDecimal类应用指南  J*aScript数据结构转换:将对象数组按类别分组  可靠CSGO开箱平台解析 CSGO开箱网合集  Golang如何使用buffered channel提高性能_Golang buffered channel优化技巧  C++如何比较两个字符串_C++ string compare函数与操作符对比  PySpark中高效提取字符串右侧可变长度数字:使用regexp_extract  J*a递归快速排序中静态变量导致数据累积的陷阱与解决方案 

搜索