绘图

WebGL只能绘制三种形状:

  1. 线
  2. 三角

其它的形状都是由上面的三种形状合成之后绘制到三维空间中的

执行绘图操作 WebGL 提供了两种方法:

  1. gl.drawElements()
  2. gl.drawArrays()

这两个方法的第一个参数都是一个常量

常量的取值范围如下:

  1. gl.POINTS: 将每个顶点当成一个点来绘制
  2. gl.LINES: 将数组当成一系列的顶点,在这些顶点间划线,每个顶点既是起点也是终点,因此数组中必须包含偶数个顶点才能完成绘制
  3. gl.LINE_LOOP: 将数组当成一系列顶点,在顶点间划线,从第一个点到第二个点,再从第二个点到第三个点,最后从最后一个点到第一个点
  4. gl.LINE_STRIP: 与LINE_LOOP相同,只不过不会绘制从最后一个点到第一个点的线
  5. gl.TRIANGLES: 将数组当成一系列顶点,在顶点间绘制三角形,除非明确规定否则每个三角形都单独绘制,不与其它三角形共享顶点
  6. gl.TRIANGLES_STRIP: 与上一个相比绘制三角形时会取前两个点与新的点构成新的三角形,即如果有 ABCD 四个点 第一次绘制三角形 ABC 第二次绘制三角形 BCD
  7. gl.TRIANGLES_FAN : 与上一个的区别在于如果有 ABCD 四个点 第一个绘制 ABC 然后绘制 ACD

此外,gl.drawElement() 还接收两个参数

  1. 数组缓冲区起始索引
  2. 缓冲区中的顶点个数

例如绘制三角形可以使用以下代码

  1. // 已经完成了使用着色器清理窗口等初始化操作,具体操作参考前面的文章
  2.  
  3. // 定义三个顶点的坐标
  4. let vertices = new Float32Array([0,1,1,-1,-1,-1]),
  5. buffer = gl.createBuffer(),
  6. vertexSetSize = 2,
  7. vertexSetCount = vertices.length/vertexSetSize,
  8. uColor, aVertexPosition;
  9.  
  10. // 将数据放到缓冲区
  11. gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
  12. gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);
  13.  
  14. // 为片段着色器传入颜色值
  15. uColor = gl.getUniformLocation(program, "uColor");
  16. gl.uniform4fv(uColor, [0, 0, 0, 1]);
  17.  
  18. // 为着色器传入顶点信息
  19. aVertexPosition = gl.getAttribLocation(program, "aVertexPosition");
  20. gl.enableVertexAttribArray(aVertexPosition);
  21. gl.vertexAttribPointer(aVertexPosition, vertexSetSize, gl.FLOAT, false, 0, 0);
  22.  
  23. // 绘制
  24. gl.drawArrays(gl.TRIANGLES, 0, vertexSetCount);

纹理

WebGL 的纹理可以使用DOM中的图像,创建纹理需要调用 gl.createTexture()

图像加载完成前,纹理不会初始化,所以最好在load事件后设置纹理

  1. let image = new Image(),
  2. texture;
  3. image.src = "smile.gif";
  4. image.onload = function(){
  5. texture = gl.createTexture();
  6. gl.bindTexture(gl.TEXTURE_2D,texture);
  7. gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, true);
  8.  
  9. gl.texImage2D(gl.TEXTURE_2D,0,gl.RGBA,
  10. gl.UNSIGNED_BYTE, image);
  11. gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_MAG_FILTER, gl.NEAREST);
  12. gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_MIN_FILTER,gl.NEAREST);
  13.  
  14. // 清除纹理
  15. gl.bindTexture(gl.TEXTURE_2D,null);
  16. }

读取像素

WebGL读取像素需要使用 readPixels()

参数:

  1. x坐标
  2. y坐标
  3. 宽度
  4. 高度
  5. 图像格式
  6. 数据类型
  7. 类型化数组

示例:

  1. let pixels = new Uint8Array(25*25);
  2. gl.readPixels(0, 0, 25, 25, gl.RGBA, gl.UNSIGNED_BYTE, pixels);

Javascript高级编程学习笔记(99)—— WebGL(5) 绘图的更多相关文章

  1. Javascript高级编程学习笔记(97)—— WebGL(3) WebGL上下文(1)

    WebGL上下文 在支持WebGL的浏览器中,WebGL的名字为 "experimental-webgl",这是由于 webgl 的规范仍未制定完成 制定完成后名字就会改为简单的 ...

  2. Javascript高级编程学习笔记(98)—— WebGL(4) WebGL上下文(2)

    错误 Javascript与WebGL之间的一个最大区别在于,WebGL的操作一般不会抛出错误 如果希望获取WebGL的错误信息,那么就需要手动调用  gl.getError() 方法 该方法会返回以 ...

  3. Javascript高级编程学习笔记(96)—— WebGL(2) 类型化视图

    类型化视图 类型化视图一般也被认为是一种类型化数组. 因为其元素必须是某种特定的数据类型,类型化视图都继承自 Dataview Int8Array: 表示8位二补整数(即二进制补数) Uint8Arr ...

  4. Javascript高级编程学习笔记(95)—— WebGL(1) 类型化数组

    WebGL webgl 是针对 canvas 的 3D上下文,与其它Web技术不同,WebGL并非是W3C制定的标准,而是由 Khronos Group 制定的. 类型化数组 WebGL所涉及的复杂运 ...

  5. Javascript高级编程学习笔记(3)—— JS中的数据类型(1)

    前一段时间由于事情比较多,所以笔记耽搁了一段时间,从这一篇开始我会尽快写完这个系列. 文章中有什么不足之处,还望各位大佬指出. JS中的数据类型 上一篇中我写了有关JS引入的Script标签相关的东西 ...

  6. JavaScript高级编程学习笔记(第三章之一)

    继续记笔记,JavaScript越来越有意思了. 继续... 第三章:JavaScript基础 ECMAScript语法在很大程度上借鉴了C和其它类似于C的语言,比如Java和Perl. 大小写敏感: ...

  7. Javascript高级编程学习笔记(1)—— JS简介

    此系列文章,用于记录所学,如有错误欢迎指出. Javascript组成 1.核心(ECMAScript) 2.文档对象模型(DOM) 3.浏览器对象模型(BOM) 1.核心(ECMAScript) E ...

  8. Javascript高级编程学习笔记(57)—— 事件(1)事件流

    事件 JS与HTML的交互是通过事件实现的 而事件指的就是:文档或浏览器窗口特定的交互瞬间 可以通过侦听器来预定事件,以便在事件发生时执行相应的代码 这种模式也是设计模式中的观察者模式 事件流 有了事 ...

  9. Javascript高级编程学习笔记(89)—— Canvas(6) 变换

    变换 通过上下文的变化,可以对图像进行处理后再将其绘制到画布上 当我们创建上下文时,会以默认值初始化变化矩阵,在默认的变换矩阵下所有处理都按描述直接绘制. 而当我们为上下文应用变换时,会导致使用不同的 ...

随机推荐

  1. navicat for mysql 破解方法

    https://www.cnblogs.com/da19951208/p/6403607.html  破解教程

  2. 1. Java面向对象之泛型-认识泛型

    package generic; class Point{ private  Object x; private  Object y; public Object getX() { return x; ...

  3. HTML5 CSS3 专题 :诱人的实例 3D展示商品信息

    强化下perspective和transform:translateZ的用法.传统的商品展示或许并不能很好的吸引用户的注意力,但是如果在展示中添加适当的3D元素,~说不定效果不错哈~ 效果图: 说明一 ...

  4. 安装scrapy出错Failed building wheel for Twisted

    用64位windows10的CMD命令安装pip install scrapy出错: Running setup.py bdist_wheel for Twisted ... error Failed ...

  5. python插入记录后取得主键id的方法(cursor.lastrowid和conn.insert_id())

    #!/usr/bin/python # import MySQL module import MySQLdb # get user input name = raw_input("Pleas ...

  6. django(权限、认证)系统—— Permissions和Group

    接着上面的3篇讨论文章,我们阐述了Django中如何使用Authentication系统进行,用户的创建,登陆,登出,完成了用户的认证.接下来,我们要看另外一个议题,那就是Authorization授 ...

  7. 提示“本地连接没有有效的ip配置-未修复“窗口

    很多人在使用电脑时可能会遇到了这样一个网络问题,电脑无法连接网络,使用自带网络诊断工具诊断提示:"本地连接没有有效的ip配置".这种网络故障多数是出在使用路由器共享上网的windo ...

  8. BZOJ_4873_[Shoi2017]寿司餐厅_最大权闭合子图

    BZOJ_4873_[Shoi2017]寿司餐厅_最大权闭合子图 题意:http://www.lydsy.com/JudgeOnline/problem.php?id=4873 分析:我们发现分数正负 ...

  9. golang sync/atomic

    刚刚学习golang原子操作处理的时候发现github上面一个比较不错的golang学习项目 附上链接:https://github.com/polaris1119/The-Golang-Standa ...

  10. spring 上传文件文件的一个例子,

    /** * 类名称:UploadTest 类描述:创建人:zhang 创建时间:2015年3月13日 下午4:20:57 修改人:zhang * 修改时间:2015年3月13日 下午4:20:57 修 ...