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

WebGL(Web Graphics Library)是一种在浏览器中渲染3D图形的技术,无需插件即可直接使用J*aScript操作GPU。它基于OpenGL ES 2.0,允许你在HTML5的<canvas></canvas>元素上绘制复杂的3D场景。对于刚接触J*aScript 3D图形开发的人来说,理解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); // 红色
}
`;
接下来需要将这些源码编译成着色器对象,并链接成一个程序:
functioncreateShader(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是昆仑万维最新推出的一款AI音乐创作工具,输入歌词即可生成完整专属歌曲。
1091
查看详情
定义三个顶点,组成一个三角形:
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 常见的坑与解决办法