1.使用缓冲区对象向顶点着色器传入多个顶点的数据,需要遵循以下五个步骤:

1.1 创建缓冲区对象(gl.createBuffer())。

1.2 绑定缓冲区对象(gl.bindBuffer())。

1.3 将数据写入缓冲区对象(gl.bufferData())。

1.4 将缓冲区对象分配给一个attribute变量(gl.vertexAttribPointer())。

1.5 开启attribute变量(gl.enableVertexAttribArray())。

2.创建缓冲区对象(gl.createBuffer())

在使用WebGL时,需要调用gl.createBuffer()方法来创建缓冲区对象。下面的图上部分是执行前的状态,下部分是执行后的状态。

对应createBuffer的是gl.deleteBuffer(buffer)函数,用来删除创建的缓冲区对象。buffer表示带删除的缓冲区对象。

3.绑定缓冲区(gl.bindBuffer(target, buffer))

将缓冲区对象绑定到WebGl系统中已经存在的“目标”(target)上。参数:

target:绑定的目标。可以使以下中的一个:gl.ARRAY_BUFFER,表示缓冲区对象中包含了顶点的数据;gl.ELEMENT_,表示缓冲区对象中包含了顶点的索引值。

buffer:指定之前由gl.createBuffer()返回的带绑定的缓冲区对象。

执行绑定后,WebGL系统内部状态发生变化。如图所示:

4.向缓冲区对象中写入数据(gl.bufferData(target, data, usage))

开辟存储空间,想绑定在target上的缓冲区对象总写入数据data。参数:

target:gl.ARRAY_BUFFER或gl.ELEMENT_ARRAY_BUFFER。

data:写入缓冲区对象的数据。

usage: 表示程序将如何使用存储在缓冲区对象中的数据。参数值包括:gl.STATIC_DRAW,只会向缓冲区对象中写入一次数据,但需要绘制很多次;gl.STREAM_DRAW,只会向缓冲区对象中写入一次数据,然后绘制若干次;gl.DYNAMIC_DRAW,会想缓冲区对象中多次写入数据,并绘制很多次。

5.类型化数组

WebGL使用的各种类型化数组包括:

数组类型/每个元素所占用字节数/描述(C语言总的数据类型)

Int8Array/1/8位整形数(signed char)

UInt8Array/1/8位无符号整形数(unsigned char)

Int16/2/16位整形数(signed short)

UInt16Array/2/16位无符号整形数(unsigned short)

Int32Array/4/32位整形数(signed int)

UInt32Array/4/32位无符号整形数(unsigned int)

Float32Array/4/单精度32位浮点数(float)

Float64Array/8/双精度64位浮点数(double)

6.类型化数组的方法、属性和常量

方法、属性和常量/描述

get(index)/获取第index个元素值

set(index, offset)/设置第index个元素的值为value

set(array, offset)/从第offset个元素开始讲数组array中的值填充进去

length/数组长度

BYTES_PER_ELEMENT/数组中每个元素所占字节数

7.将缓冲区对象分配给attribute变量(gl.vertexAttribPointer(location, size, type, normalized, stride, offset))

将绑定到gl.ARRAY_BUFFER的缓冲区对象分配给有location指定的attribute变量。参数:

location:指定带分配attribute变量的存储位置。

size:指定缓冲区中每个顶点的分量个数(1到4)。若size比attribute变量书序的分量数小,确实分量将按照与gl.vertexAttrib[1234]f()相同的规则补全。

type:使用一下类型之一来指定数据格式:gl.UNSIGNED_BYTE,无符号字节,UInt8Array;gl.SHORT,短整形,Int16Array;gl.UNSIGNED_SHORT,无符号短整形,Uint16Array;gl.INT,整形,Int32Array;gl.UNSIGNED_INT, 无符号整形,Uint32Array;gl.FLOAT,浮点型,Float32Array。

normalize:传入true或false,标明是否将非浮点型的数据归纳化到[0,1]或[-1,1]区间。

stride:指定相邻两个顶点间的字节数,默认为0。

offset:指定缓冲区对象中的偏移量以字节为单位。如果是起始位置,则offset为0。

8.开启attribute变量(gl.enableVertexAttribArray(location))

为了使定点着色器能够访问缓冲区内的数据,需要使用gl.enableVertexAttribArray()方法开启attribute变量。

9.将矩阵传递给对象缓冲区(gl.uniformMatrix4fv(location, transpore, array)

将array表示的4*4矩阵分配给有location指定的uniform变量。参数:

location:uniform变量的存储位置

Transpose:在WebGL中必须指定为false

array:带传输的类型化数组,4*4矩阵按例主序存储在其中

WebGL 绘制和变换的更多相关文章

  1. WebGL绘制有端头的线

    关于WebGL绘制线原理不明白的小伙伴,可以看看我之前的文章WebGL绘制有宽度的线.这一篇我们主要来介绍端头的绘制,先看效果图. 端头一般被称为lineCap,主要有以下三种形式: butt最简单等 ...

  2. 一篇文章理清WebGL绘制流程

    转自:https://www.jianshu.com/p/e3d8a244f3d9 目录 初始化WebGL环境 顶点着色器(Vertex Shader)与片元着色器(Fragment Shader) ...

  3. 利用javascript和WebGL绘制地球 【翻译】

    利用javascript和WebGL绘制地球 [翻译] 原翻译:利用javascript和WebGL绘制地球 [翻译] 在我们所有已知的HTML5API中,WebGL可能是最有意思的一个,利用这个AP ...

  4. WebGL绘制有宽度的线

    WebGL中有宽度的线一直都是初学者的一道门槛,因为在windows系统中底层的渲染接口都是D3D提供的,所以无论你的lineWidth设置为多少,最终绘制出来的只有一像素.即使在移动端可以设置有宽度 ...

  5. WebGL 绘制Line的bug(二)

    上一篇文章简单介绍了WebGL绘制Line的bug,不少朋友给我发了私信,看来这个问题大家都遇上过哈.今天这篇文章会讲述解决这个问题的work around. 基本思路 上一篇文章结尾简单提了下解决的 ...

  6. WebGL 绘制Line的bug(一)

    今天说点跟WebGL相关的事儿,不知道大家有没有碰到过类似的烦恼. 熟悉WebGL的同学都知道,WebGL绘制模式有点.线.面三种:通过点的绘制可以实现粒子系统等,通过线可以绘制一些连线关系:面就强大 ...

  7. WebGL入门教程(二)-webgl绘制三角形

    前面已经介绍过了webgl,WebGL入门教程(一)-初识webgl(http://www.cnblogs.com/bsman/p/6128447.html),也知道了如何绘制一个点,接下来就用web ...

  8. ArcGIS JS 3.x使用webgl绘制热力图

        ArcGIS Js Api 3.x 热力图在数据量达到三万左右的时候,绘制速度不尽人意,数据量再大些,缩放时候就会很卡,非常影响客户体验.     参考了一下网上webgl热力图,能达到更流畅 ...

  9. WebGL 绘制Line的bug(三)

    之前铺垫了许多,今天可以来分享点纯干货了. 上一篇已经讲述了通过面模拟线条时候,每一个顶点的顶点数据包括:端点坐标.偏移量.前一个端点坐标.后一个端点坐标,当然如果我们通过索引的方式来绘制的话,还包括 ...

随机推荐

  1. EM算法学习资料备忘

    将学习EM算法过程中看到的好的资料汇总在这里,供以后查询.也供大家參考. 1. 这是我学习EM算法最先看的优秀的入门文章,讲的比較通俗易懂,并且举了样例来说明当中的原理.不错! http://blog ...

  2. Charles做代理的Map Remote路径配置

    使用Webpack做前端开发时,本地localhost使用了Webpack-dev-server搭建一个服务,开发阶段如果想把对本地后台的请求改为对外网的请求,可以使用Charles开启代理,把路径修 ...

  3. [转] 机器学习是什么——周志华

    机器学习现在是一大热门,研究的人特多,越来越多的新人涌进来. 不少人其实并没有真正想过,这是不是自己喜欢搞的东西,只不过看见别人都在搞,觉着跟大伙儿走总不会吃亏吧. 问题是,真有个"大伙儿& ...

  4. Spark Shuffle原理解析

    Spark Shuffle原理解析 一:到底什么是Shuffle? Shuffle中文翻译为“洗牌”,需要Shuffle的关键性原因是某种具有共同特征的数据需要最终汇聚到一个计算节点上进行计算. 二: ...

  5. Spark部署

    Spark的部署让人有点儿困惑,有些需要注意的事项,本来我已经装成功了YARN模式的,但是发现了一些问题,出现错误看日志信息,完全看不懂那个错误信息,所以才打算翻译Standalone的部署的文章.第 ...

  6. excel数据批量导入

    1.  html <form id="form_search" action="@Url.Action("UpLoadFile")" ...

  7. Matlab 读取excel文件提示服务器出现意外情况或无法读取问题解决

    1.问题描述: 该错误通常发生在应用函数读取excel文件(后缀xls或xlsx)时. 应用xlsread函数读取提示服务器出现意外情况: 应用importdata读取时提示can‘t open fi ...

  8. install ubuntu on Android mobile phone

    Android 是基于Linux内核的开源操作系统,主要用在移动设备上.当然同样是基于Linux内核的操作系统,现在支持的Android的智能手机理论来说都能运行基于Linux的操作系统,比如现在流行 ...

  9. 百度echarts极速入门

    1.http://echarts.baidu.com/ 进入官网 2.打开官方示例 3.随便打开一个列子并打开f12浏览器调试模式,找到例子的iframe地址 4.打开地址 5.下载例子,so eas ...

  10. 关于Unity中红外线瞄准的效果实现

    今天做一个FPS游戏的时候,由于我做的是第三人称的射击,所以需要一个枪的红外线瞄准的效果. 一开始我在枪上挂一个很细很长的聚光灯,瞄准远处物体的时候,看起来有点红外线的样子,但是靠近之后光线就变成一个 ...