webgl入门

编程入门 行业动态 更新时间:2024-10-26 16:21:14

webgl<a href=https://www.elefans.com/category/jswz/34/1770026.html style=入门"/>

webgl入门

衔接上一篇文章代码

基础矩形绘制

本次绘制随机50个矩形,能够更加深刻理解到webgl只是一个光栅化api的概念。

增加了两个uniform变量,分别在顶点和片元着色器中。

顶点着色器u_resolution是为了在传入屏幕坐标时转换成裁剪空间坐标

vec4(clipSpace * vec2(1, -1), 0, 1)

y轴*-1是为了倒转坐标,y轴起点从左下角变为左上角

uniform变量不需要像attribute一样需要调用启用enableVertexAttribArray api,只需要寻找到属性位置后通过uniform4f进行赋值即可,我目前理解的uniform在一次着色器绘制时是属于不可变的常量,进行下一次绘制前可更改。

代码

主要代码是这样的

 // 绘制50个颜色不一的矩形for (let i = 0; i < 50; i++) {setRectangle(gl, randomInt(600), randomInt(600), randomInt(600), randomInt(600));gl.uniform4f(colorUniformLocation, Math.random(), Math.random(), Math.random(), 1);// 绘制矩形gl.drawArrays(gl.TRIANGLES, 0, 6);
}
function setRectangle(gl, x, y, width, height) {const x1 = x;const x2 = x + width;const y1 = y;const y2 = y + height;const positions = [x1, y1, x2, y1, x1, y2, x1, y2, x2, y1, x2, y2];gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(positions), gl.STATIC_DRAW);
}// 返回 0 到 range 范围内的随机整数
function randomInt(range) {return Math.floor(Math.random() * range);
}

缓冲区数据读取规则已经在上一篇文章中包含了

简单再提一下

// 告诉属性怎么从positionBuffer中读取数据 (ARRAY_BUFFER)
const size = 2; // 每次迭代运行提取两个单位数据
const type = gl.FLOAT; // 每个单位的数据类型是32位浮点型
const normalize = false; // 不需要归一化数据
const stride = 0; // 0 = 移动单位数量 * 每个单位占用内存(sizeof(type))
// 每次迭代运行运动多少内存到下一个数据开始点
const offset = 0; // 从缓冲起始位置开始读取
gl.vertexAttribPointer(positionAttributeLocation,size,type,normalize,stride,offset
);

更多推荐

webgl入门

本文发布于:2023-11-16 00:16:51,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1610438.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:入门   webgl

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!