J*aScript WebGL 3D图形编程实战


首先搭建WebGL环境,创建canvas并获取上下文,检查支持性后设置背景色;接着编写GLSL顶点和片元着色器,编译链接成程序;然后定义立方体顶点与索引数据,创建缓冲区上传GPU;启用深度测试,在render中设置投影与视图矩阵,绑定属性并绘制;最后通过requestAnimationFrame实现旋转动画,监听用户交互,完成可交互3D场景。

javascript webgl 3d图形编程实战

WebGL 让你在浏览器中直接运行高性能 3D 图形,无需插件。它基于 OpenGL ES,通过 J*aScript 调用 GPU 进行图形渲染。如果你已经掌握 HTML 和 J*aScript 基础,现在想动手实现一个真实的 3D 场景,这篇文章会带你从零开始,完成一次完整的 WebGL 3D 编程实战。

搭建 WebGL 渲染环境

第一步是准备一个可以绘制 3D 内容的画布(canvas)。

  • 在 HTML 中插入一个 元素,并设置宽高。
  • 使用 J*aScript 获取 canvas 上下文,启用 WebGL 渲染器。
  • 检查浏览器是否支持 WebGL,避免运行时报错。

示例代码:

<font color="#0000FF"><canvas id="glCanvas" width="800" height="600"></canvas></font><script>
  const canvas = document.getElementById('glCanvas');
  const gl = canvas.getContext('webgl');
<p>if (!gl) {
alert('浏览器不支持 WebGL');
}</p><p>gl.clearColor(0.1, 0.1, 0.2, 1.0); // 深蓝背景
gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);</p></script>

编写着色器程序

WebGL 使用 GLSL(OpenGL 着色语言)定义顶点和片元着色器。每个 3D 绘制流程都必须包含这两个核心组件。

  • 顶点着色器:处理每个顶点的位置变换。
  • 片元着色器:决定像素的颜色(光照、纹理等)。
  • 将 GLSL 代码写入 script 标签或字符串中,编译并链接成着色程序。

示例着色器:

// 顶点着色器
const vsSource = `
  attribute vec4 aVertexPosition;
  uniform mat4 uModelViewMatrix;
  uniform mat4 uProjectionMatrix;
  void main() {
    gl_Position = uProjectionMatrix * uModelViewMatrix * aVertexPosition;
  }
`;
<p>// 片元着色器
const fsSource = <code> void main() { gl_FragColor = vec4(1.0, 0.8, 0.4, 1.0); // 橙色 } </code>;</p>

编译与链接:

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;
}
<p>function createProgram(gl, vsSource, fsSource) {
const vertexShader = createShader(gl, gl.VERTEX_SHADER, vsSource);
const fragmentShader = createShader(gl, gl.FRAGMENT_SHADER, fsSource);
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;
}</p><p>const shaderProgram = createProgram(gl, vsSource, fsSource);</p>

定义几何数据并绘制立方体

接下来创建一个 3D 立方体。你需要提供顶点坐标,并设置索引以减少重复数据。

即梦AI 即梦AI

一站式AI创作平台,免费AI图片和视频生成。

即梦AI 16094 查看详情 即梦AI

  • 定义 8 个顶点位置,构成立方体的角点。
  • 使用 index buffer(元素数组缓冲)指定如何连接顶点形成三角形。
  • 启用深度测试,防止远处物体覆盖近处物体。

示例:创建立方体顶点与索引

const positions = [
  -1, -1,  1,    1, -1,  1,    1,  1,  1,   -1,  1,  1,
  -1, -1, -1,    1, -1, -1,    1,  1, -1,   -1,  1, -1,
];
<p>const indices = [
0, 1, 2,    0, 2, 3,  // 前面
4, 5, 6,    4, 6, 7,  // 后面
1, 5, 6,    1, 6, 2,  // 右侧
// 更多面...
];</p><p>// 创建缓冲区
const positionBuffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer);
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(positions), gl.STATIC_DRAW);</p><p>const indexBuffer = gl.createBuffer();
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, indexBuffer);
gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint16Array(indices), gl.STATIC_DRAW);</p><p>// 启用深度测试
gl.enable(gl.DEPTH_TEST);</p>

在 render 函数中绘制:

function render() {
  gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
<p>const projectionMatrix = mat4.perspective(
mat4.create(), 
45 * Math.PI / 180, 
canvas.width / canvas.height, 
0.1, 100.0
);</p><p>const modelViewMatrix = mat4.translate(mat4.create(), [0, 0, -6]);</p><p>// 将矩阵传入着色器
gl.uniformMatrix4fv(
gl.getUniformLocation(shaderProgram, 'uProjectionMatrix'),
false,
projectionMatrix
);
gl.uniformMatrix4fv(
gl.getUniformLocation(shaderProgram, 'uModelViewMatrix'),
false,
modelViewMatrix
);</p><p>// 绑定顶点缓冲
gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer);
const vertexPosition = gl.getAttribLocation(shaderProgram, 'aVertexPosition');
gl.vertexAttribPointer(vertexPosition, 3, gl.FLOAT, false, 0, 0);
gl.enableVertexAttribArray(vertexPosition);</p><p>// 绘制元素
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, indexBuffer);
gl.drawElements(gl.TRIANGLES, indices.length, gl.UNSIGNED_SHORT, 0);
}
render();</p>

添加动画与用户交互

让立方体旋转起来,提升视觉体验。

  • 使用 requestAnimationFrame 实现平滑动画循环。
  • 在每一帧更新 modelViewMatrix 的旋转角度。
  • 监听鼠标或键盘事件控制视角或旋转方向。

动画实现:

let rotation = 0;
<p>function animate() {
rotation += 0.01;
render(rotation);
requestAnimationFrame(animate);
}</p><p>function render(rot) {
// ...清空缓冲</p><p>mat4.translate(modelViewMatrix, [0, 0, -6]);
mat4.rotateY(modelViewMatrix, modelViewMatrix, rot);
mat4.rotateX(modelViewMatrix, modelViewMatrix, rot * 0.5);</p><p>// 传递矩阵并绘制
// ...
}
animate();</p>

基本上就这些。你已经完成了从初始化 WebGL 到绘制可动画 3D 立方体的全过程。虽然原生 WebGL API 较为底层,但理解它能帮你更好地使用 Three.js 等高级库。不复杂但容易忽略细节,比如矩阵顺序、缓冲绑定、着色器编译状态检查等,都是实战中的关键点。

以上就是J*aScript WebGL 3D图形编程实战的详细内容,更多请关注其它相关文章!


# java  # 尚志seo优化推广  # 帮你  # 模式下  # 鼠标  # 如果你  # 角形  # 都是  # 格式转换  # 绑定  # 着色器  # canva  # 键盘事件  # ai  # 浏览器  # js  # html  # javascript  # 移除  # 网站建设前期准备哪些  # 博罗手机网站建设费用  # 企业网站推广方案总结  # 医院网站优化岗位  # 荆门二手车网站推广开户  # 塘厦建设网站  # 内部网站优化方案  # 河北招商网站推广行业  # seo天津网站建设 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894


相关推荐: 手机雨课堂网页版入口免登录 雨课堂网页版可点击直接进入  海棠阅读网页版_进入海棠网页版在线阅读中心  抖音号升级企业号怎么改名字?升级企业号有哪些好处?  智学网成绩单查询系统网_智学网学生平台登录  《大周列国志》皇帝律令功能介绍  一点万象签到领积分指南  如何在mysql中使用索引提示_mysql索引提示优化方法  高德地图导航路线偏差报警频繁怎么办 高德地图路线偏差修复与优化方法  VS Code中的Tailwind CSS IntelliSense插件使用技巧  腾讯QQ邮箱官方入口 QQ邮箱网页版登录平台  Teambition网盘如何共享文件  火柴人战争网页版在线玩  PHP utf8_encode 字符编码转换疑难解析与最佳实践  《华夏千秋》龙女试炼功法获取方法  如何在CSS中清除浮动解决背景颜色不包裹内容问题_clear after技巧  C#解析来自网络的XML流数据 实时错误处理与重试机制  《花瓣》创建专辑方法  windows server2019显卡驱动怎么安装_winserver2019显卡驱动安装与远程桌面优化  mysql通配符能用于日志查询吗_mysql通配符在系统日志查询中的实际使用方法  firefox火狐浏览器最新官网主页_ firefox火狐浏览器平台入口直达官方链接  J*aScript大数运算_BigInt使用指南  微星主板BIOS怎么调整内存时序_内存参数手动优化BIOS设置教程  CSS过渡与滚动滚动事件结合应用_scroll与transition动画  FotoBalloon图片左右镜像教程  微信注销后银行卡解绑了吗_微信注销后银行卡解绑状态  C++ switch case字符串_C++如何实现字符串switch匹配  PDF如何批量加注释_PDF多文件批注高亮操作教程  使用Google服务账号实现Google Drive API无缝集成与文件访问  word文档行距怎么调?word文档调行距的操作步骤  实现二叉树的层序插入:基于树大小的路径导航  解决Flex容器横向滚动内容截断与偏移问题  Lar*el Dusk 测试中管理浏览器权限:以剪贴板访问为例  c++如何掌握指针的核心用法_c++指针入门到精通指南  苹果17 Pro如何启用分屏浏览_iPhone 17 Pro分屏浏览设置步骤  掌握产品代码正则表达式:避免常见陷阱与精确匹配  猫眼电影app如何筛选支持退改签的影院_猫眼电影退改签影院筛选方法  百度小说看书时如何翻页_百度小说手动翻页与自动翻页设置  mysql镜像配置如何恢复数据_mysql镜像配置数据恢复详细流程  《东方航空》添加乘机人方法  顺丰快递在线查询系统 顺丰快递官方查单入口  Cassandra中复合主键、二级索引与ORDER BY排序的限制与解决方案  CSS动画如何实现图标旋转并放大_transform rotate scale @keyframes实现  PHP页面重载后变量状态保持:实现用户档案连续浏览的教程  如何用Golang优化微服务间请求性能_Golang 微服务请求性能优化方法  PyEZ 配置提交中 RpcTimeoutError 的健壮性处理策略  win11怎么启用或禁用休眠 Win11 powercfg命令管理休眠文件【技巧】  Vue 3中独立响应式实例的创建与应用  Win10显卡驱动安装失败怎么办 Win10使用DDU彻底卸载驱动【解决】  CSS如何控制元素外边距_margin实现布局间隔  德邦快递会员怎么开通 

 2025-10-24

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.