WebGL编程指南案例解析之多数据存储于一个缓冲区以及着色器通信
//顶点着色器往片元着色器传值
//多个参数值存于一个缓冲对象中 var vShader = `
attribute vec4 a_Position;
attribute float a_PointSize;
attribute vec4 a_Color;
varying vec4 v_Color;
void main(){
gl_Position = a_Position;
gl_PointSize = a_PointSize;
v_Color = a_Color;
}
`; var fShader = `
//设定默认精度
precision mediump float;
varying vec4 v_Color;
void main(){
gl_FragColor = v_Color;
}
`; function main(){
//获取canvas元素
var canvas = document.getElementById('webgl'); //获取webgl上下文
var gl = getWebGLContext(canvas); if(!gl){
console.log('Failed to get the rendering context for WebGL!');
return;
} //初始化着色器
if(!initShaders(gl,vShader,fShader)){
console.log('Failed to initialize shaders.');
return;
} var n = initVertexBuffers(gl);
if(n < ){
console.log('Failed to set the positions of the vertices!');
return;
} //用指定颜色填充webgl容器,就是设置背景
gl.clearColor(0.4, 0.5, 0.0, 1.0);
gl.clear(gl.COLOR_BUFFER_BIT); gl.drawArrays(gl.TRIANGLES,,n); function initVertexBuffers(gl){
var verticesSizes = new Float32Array([
0.0,0.5,10.0,1.0,0.0,0.0,
-0.5,-0.5,20.0,0.0,1.0,0.0,
0.5,-0.5,30.0,0.0,0.0,1.0
]);
var n = ;//点的个数 //创建缓冲区对象
var vertexSizeBuffer = gl.createBuffer();
if(!vertexSizeBuffer){
console.log('Failed to create the buffer object!');
return -;
} //将缓冲区对象绑定到目标ARRAY_BUFFER
gl.bindBuffer(gl.ARRAY_BUFFER,vertexSizeBuffer);
//往ARRAY_BUFFER
gl.bufferData(gl.ARRAY_BUFFER,verticesSizes,gl.STATIC_DRAW); var fsize = verticesSizes.BYTES_PER_ELEMENT;
console.log(fsize); //获取shaderProgram中attribute变量‘a_Position’的地址
var a_Position = gl.getAttribLocation(gl.program,'a_Position');
if (a_Position < ) {
console.log('Failed to get the storage location of a_Position');
return -;
}
//将缓冲区对象分配给a_Position变量
gl.vertexAttribPointer(a_Position,,gl.FLOAT,false,fsize * ,);
//开启着色器对缓冲区数据的访问
gl.enableVertexAttribArray(a_Position); var a_PointSize = gl.getAttribLocation(gl.program,'a_PointSize');
if (a_PointSize < ) {
console.log('Failed to get the storage location of a_Position');
return -;
}
//将缓冲区对象分配给a_PointSize变量
//这里的3表示每个顶点数据由3个float组成,所以两个点之间的字节量为fsize*3
//偏移量为fsize*2,1表示只取1个数据
//比如下面的数据表示从一个顶点中(0.0,0.5,10.0)顶点数据量为单个数据量字节长*3
//从第fsize*2个字节开始取数据,取1个数据(数据长度为fsize)
gl.vertexAttribPointer(a_PointSize,,gl.FLOAT,false,fsize * ,fsize * );
//开启着色器对缓冲区数据的访问
gl.enableVertexAttribArray(a_PointSize); var a_Color = gl.getAttribLocation(gl.program,'a_Color');
if (a_Color < ) {
console.log('Failed to get the storage location of a_Color');
return -;
}
//将缓冲区对象分配给a_Color变量
//这里的3表示每个顶点数据由3个float组成,所以两个点之间的字节量为fsize*3
//偏移量为fsize*2,1表示只取1个数据
//比如下面的数据表示从一个顶点中(0.0,0.5,10.0)顶点数据量为单个数据量字节长*3
//从第fsize*2个字节开始取数据,取1个数据(数据长度为fsize)
gl.vertexAttribPointer(a_Color,,gl.FLOAT,false,fsize * ,fsize * );
//开启着色器对缓冲区数据的访问
gl.enableVertexAttribArray(a_Color); return n;
}
} main();

注意:
①首先顶点着色器接收三个外来数据,position、size、color(我们最终画一个三角形,所以这里的size其实是没用上的);
②我们将三个数据拼在一起作为一条数据,所以每6个数值为一个顶点携带的数据,所以我们每次读取6 * size 个字节;
③对于这6 * size个字节,根据(偏移量,数据长度)来为三个属性取值定位:
a_Position:(size * 0 , 2);
a_PointSize:(size * 2 , 1);
a_Color:(size * 3 , 3)
④对于 varying vec4 v_Color 我们看到,两个着色器中都会有,在顶点着色器中该变量在main()方法中赋值之后,用于输出
输出给谁用?当然是片元着色器咯,所以在片元着色器中该变量用于接收属性值。
有一点需要注意,用于两种着色器自定义数据通信的变量,类型和名称都必须一样。
WebGL编程指南案例解析之多数据存储于一个缓冲区以及着色器通信的更多相关文章
- WebGL编程指南案例解析之绘制一个点
<!DOCTYPE html> <html> <head> <title>webgl</title> <style type=&quo ...
- WebGL编程指南案例解析之平移和旋转的矩阵实现
手写各种矩阵: //矩阵 var vShader = ` attribute vec4 a_Position; uniform mat4 u_xformMatrix; void main(){ gl_ ...
- WebGL编程指南案例解析之绘制三个点
//案例2.绘制3个点,将顶点数据存到缓冲区对象(gl.ARRAY_BUFFER)中,然后顶点着色器从里面读数据(3个顶点) //着色器将对这些顶点进行逐个解析, //第一个顶点给到顶点着色器,赋值给 ...
- WebGL编程指南案例解析之加载纹理(贴图)
var vShader = ` attribute vec4 a_Position; attribute vec2 a_TexCoord; varying vec2 v_TexCoord; void ...
- WebGL编程指南案例解析之纹理叠加
var vShader = ` attribute vec4 a_Position; attribute vec2 a_TexCoord; varying vec2 v_TexCoord; void ...
- WebGL编程指南案例解析之绘制四边形
//案例4,绘制矩形,和三角形类似,但是注意因为一个矩形有4个顶点,按照两个三角形绘制矩形的话,顶点顺序要注意 var vShader = ` attribute vec4 a_Position; v ...
- WebGL编程指南案例解析之绘制三角形
//案例3.绘制三角形,将顶点数据存到缓冲区对象(gl.ARRAY_BUFFER)中,然后顶点着色器从里面读数据(3个顶点) //顶点着色器中去掉gl_PointSize = 10.0,绘制三角不能设 ...
- WebGL编程指南案例解析之平移和旋转的math库实现
这里说的math库实现,指的是,通过一般的加减乘除(角度计算)来更新坐标值. 因为涉及到坐标的变化,所以这里都是基于对顶点着色器的修改 平移: var vShader = ` attribute ve ...
- WebGL编程指南案例解析之3D视图视区问题
var VSHADER_SOURCE = 'attribute vec4 a_Position;\n' + 'attribute vec4 a_Color;\n' + 'uniform mat4 u_ ...
随机推荐
- 【Python】【内置函数】【bytes&bytearray&str&array】
[bytes] 英文文档: class bytes([source[, encoding[, errors]]]) Return a new “bytes” object, which is an i ...
- 广州工业大学2016校赛 F 我是好人4 dfs+容斥
Problem F: 我是好人4 Description 众所周知,我是好人!所以不会出太难的题,题意很简单 给你n个数,问你1000000000(含1e9)以内有多少个正整数不是这n个数任意一个的倍 ...
- go下载安装
https://studygolang.com/dl 一直下一步即可.
- shell until 循环
until 循环 格式: until condition do command done #输出0-9 #!/bin/bash a=0 until [ ! $a -lt 10 ] do echo ...
- ubuntu 14.04 server 能ping通,但不能ssh
ssh是一种安全协议,主要用于给远程登录会话数据进行加密,保证数据传输的安全,我们可以很方便的用ssh链接工具连接远程服务器进行相关操作,但是在享受这种方便的同时我们需要进行一些配置. 首先我们需要在 ...
- js实现滑动拼图验证码
js实现滑动拼图验证码,我这个样式是仿那些大网站做了, 学习用的,只用到前端. 小的个人网站感觉还可以用,大一点的别人用机器一下就破解了. 下面看图示: 样子大概是这样的. 源码在这 百度网盘: ...
- IdentityServer3零星笔记
Scope 是什么?有哪几种类型?每种类型都怎么使用? StandardScopes.All是什么概念? 解释:在Scope的Claims属性里包含的所有声明(类型是ScopeClaim,它的name ...
- shell中引号的妙用
#!/bin/bashfile=('leon 01.cap' leon-02.cap nicky-01.cap whoareu-01.cap 8dbb-01.cap)dict=(simple.txt ...
- Codeforces Round #364 (Div. 1) (差一个后缀自动机)
B. Connecting Universities 大意: 给定树, 给定2*k个点, 求将2*k个点两两匹配, 每个匹配的贡献为两点的距离, 求贡献最大值 单独考虑每条边$(u,v)$的贡献即可, ...
- Mashmokh and ACM CodeForces - 414D (贪心)
大意: 给定n结点树, 有k桶水, p块钱, 初始可以任选不超过k个点(不能选根结点), 在每个点放一桶水, 然后开始游戏. 游戏每一轮开始时, 可以任选若干个节点关闭, 花费为关闭结点储存水的数量和 ...