WebGL学习笔记(二)
目录
- 绘制多个顶点
- 使用缓冲区对象
- 类型化数组
- 使用drawArrays()函数绘制图形
- 图形的移动
- 图形的旋转
- 图形的缩放
绘制多个顶点
使用缓冲区对象
创建缓冲区对象
var vertexBuffer = gl.createBuffer();if(!vertexBuffer) {console.log('Failed to create the buffer object ');return -1; }
绑定缓冲区对象
gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);
将数据写入缓冲区对象
gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);
将缓冲区对象分配给一个attribute变量
gl.vertexAttribPointer(a_Position, 2, gl.FLOAT, false, 0, 0);
开启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)执行顶点着色器都会执行以下三步:
- 将顶点坐标传给a_Position;
- 向a_Position加上u_Translation;
- 结果赋值给gl_Position;
利用旋转矩阵实现移动
图形的旋转
描述一个旋转需要指明
- 旋转轴
- 旋转方向
- 旋转角度
利用表达式实现旋转
//顶点着色器
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学习笔记(二)相关推荐
- pythonsze_python学习笔记二 数据类型(基础篇)
Python基础 对于Python,一切事物都是对象,对象基于类创建 不同类型的类可以创造出字符串,数字,列表这样的对象,比如"koka".24.['北京', '上海', '深圳' ...
- qml学习笔记(二):可视化元素基类Item详解(上半场anchors等等)
原博主博客地址:http://blog.csdn.net/qq21497936 本文章博客地址:http://blog.csdn.net/qq21497936/article/details/7851 ...
- [转载]dorado学习笔记(二)
原文地址:dorado学习笔记(二)作者:傻掛 ·isFirst, isLast在什么情况下使用?在遍历dataset的时候会用到 ·dorado执行的顺序,首先由jsp发送请求,调用相关的ViewM ...
- PyTorch学习笔记(二)——回归
PyTorch学习笔记(二)--回归 本文主要是用PyTorch来实现一个简单的回归任务. 编辑器:spyder 1.引入相应的包及生成伪数据 import torch import torch.nn ...
- tensorflow学习笔记二——建立一个简单的神经网络拟合二次函数
tensorflow学习笔记二--建立一个简单的神经网络 2016-09-23 16:04 2973人阅读 评论(2) 收藏 举报 分类: tensorflow(4) 目录(?)[+] 本笔记目的 ...
- Scapy学习笔记二
Scapy学习笔记二 Scapy Sniffer的用法: http://blog.csdn.net/qwertyupoiuytr/article/details/54670489 Scapy Snif ...
- Ethernet/IP 学习笔记二
Ethernet/IP 学习笔记二 原文链接:http://wiki.mbalib.com/wiki/Ethernet/IP 1.通信模式 不同于源/目的通信模式,EtherNet/IP 采用生产/消 ...
- Java学习笔记二:数据类型
Java学习笔记二:数据类型 1. 整型:没有小数部分,允许为负数,Java整型分4种:int short long byte 1.1 Int最为常用,一个Int类型变量在内存中占用4个字节,取值范围 ...
- 吴恩达《机器学习》学习笔记二——单变量线性回归
吴恩达<机器学习>学习笔记二--单变量线性回归 一. 模型描述 二. 代价函数 1.代价函数和目标函数的引出 2.代价函数的理解(单变量) 3.代价函数的理解(两个参数) 三. 梯度下降- ...
- ASP.NET MVC 2 学习笔记二: 表单的灵活提交
ASP.NET MVC 2 学习笔记二: 表单的灵活提交 前面说到有做到公司内部的一个请假系统,用的是ASP.NET MVC 2+Entity Framework.虽然EF(Entity Frame ...
最新文章
- java基本类型是类吗_Java基本数据类型和引用类型(一)
- WDF驱动中KMDF与UMDF区别
- [deviceone开发]-数据绑定示例
- 读写配置文件(.ini)
- asp.net 获得域名,端口,虚拟目录[转]
- Linux 脚本、 正则表达式 等
- 计算机资源,来自verycd,排行榜
- [运算放大器系列]二、电压转4 - 20MA电流电路分析
- php架构师都会有什么面试题,PHP架构师面试题目和答案
- FileOpen 打开文件
- 读数学建模国赛优秀论文的笔记
- 网络安全红蓝军对抗完整战术周期
- 凯文·凯利最新演讲完整版:未来的十二个趋势
- 付永刚计算机信息安全技术课后答案
- openldap范例数据库mysql_用mysql作openldap的后台数据库
- 老照片变模糊 10种方法将照片处理清晰
- UART、SPI、I2C串行通讯协议解释 同步/异步 全双工/半双工通信含义
- c语言判断获取位置字符,C语言 · 判定字符位置
- 动态规划+vector解旅行计划问题
- 瑞安航空和曼彻斯特机场集团因国际旅行限制联合起诉英国政府
热门文章
- Remainders Game (中国剩余定理)
- 大数据新手之路四:联合使用Flume和Kafka
- 与David Blevins聊Java EE的未来
- C#学习成果 质数判断
- LOB字段存放在指定表空间 清理CLOB字段及压缩CLOB空间
- shutdown TCP ports,blocked all malicious scan
- 百度路书 信息显示_学会用地图制作路书,分分钟从小白变成自驾游达人
- devops_如何成为DevOps的合适人选
- it行业如何应对领导_什么是IT文化? 今天的领导者需要知道
- 软件开发安全性_开发具有有效安全性的软件的最佳方法