本专栏所有文章示例代码均可在我的gitee码云上获取,读者可自行下载:https://gitee.com/babyogl/learnWebGL;本节代码在文件夹chapter-02里面的color-triangle-02.html。

上节课笔者绘制了一个颜色随顶点位置变化的三角形,实现平移、旋转和缩放变换的矩阵计算,并提供了一个可供交互的菜单栏工具:原生webgl学习(三) WebGL中的矩阵运算:平移、旋转和缩放;

在前面我们已经画了两次三角形了,这次,改变一些套路,我们画矩形。画矩形的代码跟上一节大同小异,代码解释可以参考上一节:原生webgl学习(三) WebGL中的矩阵运算:平移、旋转和缩放,唯一不同的是顶点坐标发生了改变,利用两个三角形构成一个矩形,只需要将代码中的顶点稍作修改即可:

let positions = [-150, -100,150, -100,-150,  100,150, -100,-150,  100,150,  100];

在画图的时候gl.drawArrays的参数稍作修改即可,由于顶点数组长度增加,由原来的3个顶点变为6个顶点,故count应变为6,在这里提供一种更加友好的方法,可以根据数组的长度画图:

 //这样一来对所有数组都适用,三维的为positions.length / 3let primitiveType = gl.TRIANGLES;let offset3 = 0;let count = positions.length / 2;gl.drawArrays(primitiveType, offset3, count);//画图

这个demo的代码在你们下载的文件夹下的chapter-02里面的color-triangle-02.html,运行效果如下:

大家要注意,这个demo的矩形的颜色并不会随着顶点的位置的变化而变化,那是由于在JavaScript代码里面,已经提前设置好顶点的颜色,所以着色器代码也要稍微修改一下:

<script id="vertex-shader" type="x-shader/x-vertex">attribute vec2 a_position;attribute vec4 a_color;uniform mat3 u_matrix;varying vec4 v_color;void main() {vec4 offset = vec4(0.1, 0.1, 0, 1);gl_Position = vec4((u_matrix * vec3(a_position, 1)).xy, 0, 1) + offset;v_color = a_color;}
</script>
<script id="fragment-shader" type="x-shader/x-fragment">precision mediump float;varying vec4 v_color;void main() {gl_FragColor = v_color;}
</script>

顶点着色器里面定义了一个用于接收来自JavaScript代码颜色信息的attribute变量:a_color,在JavaScript代码中,需要获取到这个变量的位置:

 let colorAttributeLocation = gl.getAttribLocation(program, 'a_color');

为其创建缓冲区,并写入数据:

 gl.bindBuffer(gl.ARRAY_BUFFER, colorBuffer);setColor(gl, 1);//设置颜色,alpha为透明度function setColor(gl, alpha = 1) {gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([Math.random(), Math.random(), Math.random(), alpha,Math.random(), Math.random(), Math.random(), alpha,Math.random(), Math.random(), Math.random(), alpha,Math.random(), Math.random(), Math.random(), alpha,Math.random(), Math.random(), Math.random(), alpha,Math.random(), Math.random(), Math.random(), alpha]), gl.STATIC_DRAW);}

接下来要建立着色器中的a_color与上述缓冲区之间的链接,并取出缓冲区的数据:

 //建立着色器中attribute颜色变量与缓冲区之间的连接gl.enableVertexAttribArray(colorAttributeLocation);gl.bindBuffer(gl.ARRAY_BUFFER, colorBuffer);const size2 = 4;//2维坐标:每次迭代运行提取两个单位数据const type2 = gl.FLOAT;//每个单位的数据类型是32位浮点型;如果为Uint8Array的8位数组,要设置为gl.UNSIGNED_BYTEconst normalize2 = false;//不需要归一化数据const stride2 = 0;//每次迭代前进大小* sizeof(类型)以获得下一个位置const offset2 = 0;//从缓冲起始位置开始读取//到指定的缓冲区取出数据gl.vertexAttribPointer(colorAttributeLocation, size2, type2, normalize2, stride2, offset2);

更多的细节请读者自行看代码,里面有详细的注释。这里有一个问题,我们要画矩形和干嘛,有什么用?这里笔者想到了一个比较有趣的应用,利用三角形和矩形构建中文简体字,在后面的文章将带领读者一起实现这个骚操作!但在这之前,还存在一个问题,笔者之前是为了更直观的向大家展示WebGL代码的使用方式,但那样看起来代码似乎很凌乱,用的代码量也很多,也不符合实际开发的要求,下一节,同样是实现一个矩形,但会将相关的功能封装,是代码看起来更加简洁易用。

原生webgl学习(四) WebGL绘制矩形(一)相关推荐

  1. html5--5-4 绘制矩形

    html5--5-4 绘制矩形 学习要点 掌握绘制矩形的方法:strkeRect()/fillRect() 掌握绘制路径的 beginPath()和closePath() 矩形的绘制方法 rect(x ...

  2. HTML画4个矩形,html5--5-4 绘制矩形

    html5--5-4 绘制矩形 学习要点 掌握绘制矩形的方法:strkeRect()/fillRect() 掌握绘制路径的 beginPath()和closePath() 矩形的绘制方法 rect(x ...

  3. WebGL学习(1) - 三角形

    原文地址:WebGL学习(1) - 三角形 还记得第一次看到canvas的粒子特效的时候,真的把我给惊艳到了,原来在浏览器也能做出这么棒的效果.结合<HTML5 Canvas核心技术>和网 ...

  4. WebGL学习之纹理盒

    原文地址:WebGL学习之纹理盒 我们之前已经学习过二维纹理 gl.TEXTURE_2D,而且还使用它实现了各种效果.但还有一种立方体纹理 gl.TEXTURE_CUBE_MAP,它包含了6个纹理代表 ...

  5. WebGL(四)—— 第一个WEBGL程序

    WebGL(四)-- 第一个WEBGL程序 <!DOCTYPE html> <html lang="en"> <head><meta ch ...

  6. OpenCV与图像处理学习三——线段、矩形、圆、椭圆、多边形的绘制以及文字的添加

    OpenCV与图像处理学习三--线段.矩形.圆.椭圆.多边形的绘制以及文字的添加 一.OpenCV中的绘图函数 1.1 线段绘制 1.2 矩形绘制 1.3 圆绘制 1.4 椭圆的绘制 1.5 多边形绘 ...

  7. 我的webgl学习之路(一)

    我的webgl学习之路 (一) 做项目中偶然需要移动端3d展示,所以学习了threejs;但是有着各种限制,还有就是项目要达到好的效果肯定是需要后期处理等等,所以展开了我学习webgl之路,我刚开始毫 ...

  8. webgl渲染管线、缓冲区绘制三角形

    文章目录 前言 一.WebGL是什么 二.WebGL渲染管线 1 获取坐标元素 2 顶点着色器 3 图元装配 4 光栅化阶段 5 片元着色器 三. 绘制一个三角形 1 初始化一个HTML 2 创建画布 ...

  9. opencv进阶学习笔记6:使用鼠标在图像上绘制矩形框或者多边形框

    基础版笔记传送门: python3+opencv学习笔记汇总目录(适合基础入门学习) 进阶版笔记目录: python+opencv进阶版学习笔记目录(适合有一定基础) 感兴趣区域传统绘制: openc ...

最新文章

  1. 软件工程作业No.5
  2. Layui框架 中table解决日期格式问题
  3. javaweb:servlet过滤器
  4. 谈谈对线程与进程的理解
  5. 【牛客 - 185A】无序组数 (思维,数学,因子个数)
  6. Delphi Format函数功能及用法详解
  7. java获取b站动态列表地址_爬虫入门(三)爬取b站搜索页视频分析(动态页面,DBUtils存储)...
  8. E: 无法获得锁 /var/lib/apt/lists/lock - open (11: 资源暂时不可用) E: 无法对目录 /var/lib/apt/lists/ 加锁 问题解决方法
  9. PostgreSQL中查看版本的几种方式
  10. python与数学关系大吗_通过一个简单的数学游戏,清晰了解各大编程语言之间的一些区别...
  11. c语言结构体语法分析,C语言结构体struct的语法解析
  12. python == 字符编码
  13. 用电脑上的计算器计算反三角函数
  14. Clickhouse 实现row_number、dense_rank
  15. 一台阿里云ECS下的CIDI方案 最具性价比的简化DevOps自动化部署方案
  16. 2022年中职网络空间安全国赛竞赛题解析仅代表自己的建议——2022年中职网络安全国赛竞赛试题1解析
  17. node.js-医院预约挂号系统的设计与实现毕业设计源码141041
  18. 设计模式之十三观察者模式
  19. 在线 像素画 工具 PX-Art
  20. 【AGL】初探AGL之Application framework

热门文章

  1. iOS 音视频之网络视频播放AVPlayerViewController(iOS8.0+使用)
  2. 基于ssm框架的校园订餐系统设计与实现 毕业设计-附源码270912
  3. 计算机原理期末试卷,计算机组成原理 期末试卷七及答案
  4. SpringMVC 集成 JWT验证方式
  5. 限制软件试用期的简单思路
  6. H3C交换机结合深信服AC做802.1x认证
  7. HP大中华区总裁孙振耀退休感言 :
  8. 解决复制PDF到翻译网站有换行导致翻译错误的问题
  9. 数以万计的培训机构,如何选择!
  10. mt6739方案开发,mt6739基带芯片模块,mt6739资料下载