目录

  • 绘制多个顶点

    • 使用缓冲区对象
    • 类型化数组
    • 使用drawArrays()函数绘制图形
      • 图形的移动
      • 图形的旋转
      • 图形的缩放

绘制多个顶点

使用缓冲区对象

  1. 创建缓冲区对象

    var vertexBuffer = gl.createBuffer();if(!vertexBuffer) {console.log('Failed to create the buffer object ');return -1;
    }
  2. 绑定缓冲区对象
    gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);

  3. 将数据写入缓冲区对象
    gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);

  4. 将缓冲区对象分配给一个attribute变量
    gl.vertexAttribPointer(a_Position, 2, gl.FLOAT, false, 0, 0);

  5. 开启attribute变量
    gl.enableVertexAttribArray(a_Position);

类型化数组

使用类型化数组存储大量相同类型的数据,比如顶点的坐标和颜色数据。

var vertices = new Float32Array{[0.0,0.5,-0.5,-0.5,0.5,-0.5]};

使用drawArrays()函数绘制图形

第一个参数是代表不同的绘制图形的方式。

以上顺序的绘制图形效果如下所示:

图形的移动

利用表达式实现移动

//顶点着色器
var VSHADER_SOURCE ='attribute vec4 a_Position;\n' +'uniform vec4 u_Translation;\n' +'void main() {\n' +' gl_Position = a_Position + U_Translation;\n' +'}\n';
var Tx = 0.5,Ty = 0.5,Tz = 0.0;
...
function main()
{var u_Translation = gl.getUniformLocation(gl.program,'u_Translation');...gl.uniform4f(u_Translation, Tx, Ty, Tz, 0.0);
}

即相同类型的变量之间的赋值操作,通过a_Position和u_Translation之间相加传给gl_Position;在gl.uniform4f最后一个分量为0.0的原因是这是一个平移矢量,不是一个点,因此在齐次坐标中最后一个分量是0.0;

通过以上代码后每次调用gl.drawArrays(gl.TRIANGLES,0,n)执行顶点着色器都会执行以下三步:

  1. 将顶点坐标传给a_Position;
  2. 向a_Position加上u_Translation;
  3. 结果赋值给gl_Position;

利用旋转矩阵实现移动

图形的旋转

描述一个旋转需要指明

  1. 旋转轴
  2. 旋转方向
  3. 旋转角度

利用表达式实现旋转

//顶点着色器
var VSHADER_SOURCE =
//x' = x cos b - y sin b
//y' = y sin b + y cos b
//z' = z'attribute vec4 a_Position;\n' +'uniform float u_CosB,u_SinB;\n' +'void main() {\n' +' gl_Position.x = a_Position.x * u_CosB - a_Position.y * u_SinB;\n'+' gl_Position.y = a_Position.x * u_SinB + a_Position.y * u_CosB;\n'+'}\n';var angle = 90.0;
...
function main()
{var radian = Math.PI * angle / 180.0;//转为弧度制var cosB = Math.cos(radian);var sinB = Math.sin(radian);var u_CosB = gl.getUniformLocation(gl.program, 'u_CosB');var u_SinB = gl.getUniformLocation(gl.program, 'u_SinB');...gl.uniform1f(u_CosB,cosB);gl.uniform1f(u_SinB,sinB);
}

利用变换矩阵实现旋转

三阶矩阵实现

四阶矩阵(保持和移动阶数相同)

使用变换矩阵程序代码(旋转)

//顶点着色器
var VSHADER_SOURCE ='attribute vec4 a_Position;\n' +'uniform mat4 u_xformMatrix;\n' +//变换矩阵的定义,使用mat4表示4阶'void main() {\n' +' gl_Position = u_xformMatrix * a_Position;\n' +'}\n';var angle = 90.0;
...
function main()
{var radian = Math.PI * angle / 180.0;//转为弧度制var cosB = Math.cos(radian);var sinB = Math.sin(radian);var xformMatrix = new Float32Array{[cosB, sinB, 0.0, 0.0,-sinB, cosB, 0.0, 0.0,0.0, 0.0, 1.0, 0.0,0.0, 0.0, 0.0, 1.0]};...var u_xformMatrix = gl.getUniformLocation(gl.program, 'u_xformMatrix');...gl.uniformMatrix4fv(u_xformMatrix, false, xformMatrix);
}

WebGL中矩阵元素是按照列主序存储在数组中的

如[a,e,i,m,b,f,i,n,c,g,k,o,d,n,l,p]排序:

平移的变换矩阵实现代码和旋转类似。

图形的缩放

利用变换矩阵实现

代码和上述旋转代码类似。

转载于:https://www.cnblogs.com/heihuifei/p/9932254.html

WebGL学习笔记(二)相关推荐

  1. pythonsze_python学习笔记二 数据类型(基础篇)

    Python基础 对于Python,一切事物都是对象,对象基于类创建 不同类型的类可以创造出字符串,数字,列表这样的对象,比如"koka".24.['北京', '上海', '深圳' ...

  2. qml学习笔记(二):可视化元素基类Item详解(上半场anchors等等)

    原博主博客地址:http://blog.csdn.net/qq21497936 本文章博客地址:http://blog.csdn.net/qq21497936/article/details/7851 ...

  3. [转载]dorado学习笔记(二)

    原文地址:dorado学习笔记(二)作者:傻掛 ·isFirst, isLast在什么情况下使用?在遍历dataset的时候会用到 ·dorado执行的顺序,首先由jsp发送请求,调用相关的ViewM ...

  4. PyTorch学习笔记(二)——回归

    PyTorch学习笔记(二)--回归 本文主要是用PyTorch来实现一个简单的回归任务. 编辑器:spyder 1.引入相应的包及生成伪数据 import torch import torch.nn ...

  5. tensorflow学习笔记二——建立一个简单的神经网络拟合二次函数

    tensorflow学习笔记二--建立一个简单的神经网络 2016-09-23 16:04 2973人阅读 评论(2) 收藏 举报  分类: tensorflow(4)  目录(?)[+] 本笔记目的 ...

  6. Scapy学习笔记二

    Scapy学习笔记二 Scapy Sniffer的用法: http://blog.csdn.net/qwertyupoiuytr/article/details/54670489 Scapy Snif ...

  7. Ethernet/IP 学习笔记二

    Ethernet/IP 学习笔记二 原文链接:http://wiki.mbalib.com/wiki/Ethernet/IP 1.通信模式 不同于源/目的通信模式,EtherNet/IP 采用生产/消 ...

  8. Java学习笔记二:数据类型

    Java学习笔记二:数据类型 1. 整型:没有小数部分,允许为负数,Java整型分4种:int short long byte 1.1 Int最为常用,一个Int类型变量在内存中占用4个字节,取值范围 ...

  9. 吴恩达《机器学习》学习笔记二——单变量线性回归

    吴恩达<机器学习>学习笔记二--单变量线性回归 一. 模型描述 二. 代价函数 1.代价函数和目标函数的引出 2.代价函数的理解(单变量) 3.代价函数的理解(两个参数) 三. 梯度下降- ...

  10. ASP.NET MVC 2 学习笔记二: 表单的灵活提交

    ASP.NET MVC 2 学习笔记二:  表单的灵活提交 前面说到有做到公司内部的一个请假系统,用的是ASP.NET MVC 2+Entity Framework.虽然EF(Entity Frame ...

最新文章

  1. java基本类型是类吗_Java基本数据类型和引用类型(一)
  2. WDF驱动中KMDF与UMDF区别
  3. [deviceone开发]-数据绑定示例
  4. 读写配置文件(.ini)
  5. asp.net 获得域名,端口,虚拟目录[转]
  6. Linux 脚本、 正则表达式 等
  7. 计算机资源,来自verycd,排行榜
  8. [运算放大器系列]二、电压转4 - 20MA电流电路分析
  9. php架构师都会有什么面试题,PHP架构师面试题目和答案
  10. FileOpen 打开文件
  11. 读数学建模国赛优秀论文的笔记
  12. 网络安全红蓝军对抗完整战术周期
  13. 凯文·凯利最新演讲完整版:未来的十二个趋势
  14. 付永刚计算机信息安全技术课后答案
  15. openldap范例数据库mysql_用mysql作openldap的后台数据库
  16. 老照片变模糊 10种方法将照片处理清晰
  17. UART、SPI、I2C串行通讯协议解释 同步/异步 全双工/半双工通信含义
  18. c语言判断获取位置字符,C语言 · 判定字符位置
  19. 动态规划+vector解旅行计划问题
  20. 瑞安航空和曼彻斯特机场集团因国际旅行限制联合起诉英国政府

热门文章

  1. Remainders Game (中国剩余定理)
  2. 大数据新手之路四:联合使用Flume和Kafka
  3. 与David Blevins聊Java EE的未来
  4. C#学习成果 质数判断
  5. LOB字段存放在指定表空间 清理CLOB字段及压缩CLOB空间
  6. shutdown TCP ports,blocked all malicious scan
  7. 百度路书 信息显示_学会用地图制作路书,分分钟从小白变成自驾游达人
  8. devops_如何成为DevOps的合适人选
  9. it行业如何应对领导_什么是IT文化? 今天的领导者需要知道
  10. 软件开发安全性_开发具有有效安全性的软件的最佳方法