OpenGL中主要包括了两种数据——Buffer和Texture。

Buffer用于储存线性数无类型据块,可以看成普通的内存块,而Texture则用于储存多维数据,一般储存图像或者其他数据。

Buffer

OpenGL中有很多绑定点,Buffer绑定在绑定点使用。

使用glGenBuffers来生成一个Buffer的id。
使用glBindBuffer来绑定一个Buffer。
使用glBufferData来为Buffer分配内存。如果想要改变Buffer中已经初始化的数据,那么可以使用glBufferSubData。
如果想要从Buffer中拷贝或者写入数据,glMapBuffer会返回一个这些数据的指针,可以使用memcpy进行数据拷贝写入等等操作,使用完成后使用glUnmapBuffer来解除。

值得注意的是:所有的Buffer Object都只是一个中间的管理平台,与实际的空间相分离。其中,除了FBO所关联的数据空间在显存之外,PBO和VBO所关联的数据空间位置均不一定 (system memory, shared memory, AGP, Video Memory均有可能)。

如果只是希望将缓存对象的数据清除为一个已知的值,那么也可以使用glClearBufferData()或者glClearBufferSubData()函数。清除缓存对象中所有或者部分数据。绑定到target的缓存存储空间将使用data中存储的数据进行填充。format和type分别指定了data对应数据的格式和类型。glClearBufferData()和glClearBufferSubData()函数允许我们初始化缓存对象中存储的数据,并且不需要保留或者清除任何一处系统内存。

缓存对象中的数据也可以使用glCopyBufferSubData()函数互相进行拷贝。

glCopyBufferSubData()可以在两个目标对应的缓存之间拷贝数据,而GL_COPY_READ_BUFFER和 GL_COPY_WRITE_BUFFER这两个目标正是为了这个目的而生。它们不能用于其他OpenGL的操作当中,并且如果将缓存与它们进行绑定,并 且只用于数据的拷贝和存储目的,不影响OpenGL的状态也不需要记录拷贝之前的目标区域信息的话,那么整个操作过程都是可以保证安全的。

使用glGetBufferSubData()函数可以从绑定到某个目标的缓存中回读数据,然后将它放置到应用程序保有的一处内存当中。我们也可以使用glGetBufferSubData()简单地将之前存入到缓存对象中的数据读回到内存中。

使用Buffer填充顶点shader

创建绑定vao,然后使用glVertexAttribPointer来指定了渲染时索引值为 index 的顶点属性数组的数据格式和位置。当数组中的值被访问并被转换至浮点值时,如果normalized被设置为GL_TRUE,意味着整数型的值会被映射至区间[-1,1](有符号整数),或者区间[0,1](无符号整数),反之,这些值会被直接转换为浮点值而不进行归一化处理。glVertexAttribPointer的stride参数指定了每个数据之间的间距,如果是0,并不意味着间距是0,而是提示OpenGL 数据是紧密排列的,openGL将根据输出的size等参数自行计算间距。间距的计算即是:每个数据开头的地址到下一个数据开头地址的字节数。

要启用或者禁用顶点属性数组,调用glEnableVertexAttribArray和glDisableVertexAttribArray传入参数index。如果启用,那么当glDrawArrays或者glDrawElements被调用时,顶点属性数组会被使用。

关于使用vbo和ibo绑定vao 索引绘制的实例:

//读取数据
GLushort index[];
int index_size = ;
GLfloat vert[];
int vert_size = ;
GLuint gebo;
GLuint gvao;
GLuint gvbo;
std::fstream f1, f2;
std::string s;
int k = ;
f2.open("media/models/1.tri ", std::ios::in);
f1.open("media/models/1.vert", std::ios::in);
while (getline(f1, s))
{
sscanf(s.data(), "%f %f %f", &vert[k], &vert[k + ], &vert[k + ]);
k += ;
vert_size += ;
}
f1.clear();
k = ;
while (getline(f2, s))
{
sscanf(s.data(), "%d %d %d", &index[k], &index[k + ], &index[k + ]);
--index[k + ];
--index[k + ];
--index[k];
k += ;
index_size += ;
}
//生成vbo,ibo,vao,并且绑定vao
glGenBuffers(, &gvbo);
glBindBuffer(GL_ARRAY_BUFFER, gvbo);
glBufferData(GL_ARRAY_BUFFER, vert_size*sizeof(float), vert, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, ); glGenBuffers(, &gebo);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, gebo);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, index_size*sizeof(GLushort), index, GL_STATIC_DRAW);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ); glGenVertexArrays(, &gvao);
glBindVertexArray(gvao);
glBindBuffer(GL_ARRAY_BUFFER, gvbo);
//设置vbo数据格式
glVertexAttribPointer(, , GL_FLOAT, GL_FALSE, , );
//启用此属性数组
glEnableVertexAttribArray(); //绑定ibo到vao
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, gebo);
//索引不传入shader所以不用glVertexAttribPointer等函数
//不要此处不能解绑vbo和ibo glBindVertexArray(); //draw
glUseProgram(program); glUniformMatrix4fv(proj_location2, , GL_FALSE, proj_matrix);
glUniformMatrix4fv(mv_location2, , GL_FALSE, mv_matrix); glBindVertexArray(gvao);
//此处直接使用drawcall,不用再做任何设置
glDrawElements(GL_LINES, index_size, GL_UNSIGNED_SHORT, );

Shader:

//vertex
#version core
layout (location = ) in vec4 position;
uniform mat4 mv_matrix;
uniform mat4 proj_matrix;
void main(void)
{
gl_Position = proj_matrix * mv_matrix * position;
} //fragement
#version core
out vec4 color;
void main()
{
color = vec4(,,,);
}

OpenGL中的数据——Buffer的更多相关文章

  1. OpenGL中FBO的概念及其应用 [转]

    http://www.cppblog.com/kongque/archive/2010/08/26/124754.html FBO一个最常见的应用就是:渲染到纹理(render to texture) ...

  2. OpenGL进阶(十一) - GLSL4.x中的数据传递

    in out 对于 vertex shader,每个顶点都会包含一次,它的主要工作时处理关于定点的数据,然后把结果传递到管线的下个阶段. 以前版本的GLSL,数据会通过一些内建变量,比如gl_Vert ...

  3. 一个I/O线程可以并发处理N个客户端连接和读写操作 I/O复用模型 基于Buf操作NIO可以读取任意位置的数据 Channel中读取数据到Buffer中或将数据 Buffer 中写入到 Channel 事件驱动消息通知观察者模式

    Tomcat那些事儿 https://mp.weixin.qq.com/s?__biz=MzI3MTEwODc5Ng==&mid=2650860016&idx=2&sn=549 ...

  4. OpenGL中glVertex、显示列表(glCallList)、顶点数组(Vertex array)、VBO及VAO区别

    OpenGL中glVertex.显示列表(glCallList).顶点数组(Vertex array).VBO及VAO区别 1.glVertex 最原始的设置顶点方法,在glBegin和glEnd之间 ...

  5. OPenGL中的缓冲区对象

    引自:http://blog.csdn.net/mzyang272/article/details/7655464 在许多OpenGL操作中,我们都向OpenGL发送一大块数据,例如向它传递需要处理的 ...

  6. OpenGL笔记<4> 数据传递二

    Sending data to a shader using uniform Preface 上一节我们介绍了通过顶点属性量进行数据传递,今天我们介绍一下通过uniform变量来进行数据传递的方法. ...

  7. OpenGL 笔记<3> 数据传递 一

    Sending data to a shader using vertex attributes and vertex buffer object 上次我们说到着色器的编译和连接,后面的事情没有做过多 ...

  8. OpenGl中使用着色器的基本步骤及GLSL渲染简单示例

    OpenGL着色语言(OpenGL Shading Language,GLSL)是用来在OpenGL中着色编程的语言,是一种具有C/C++风格的高级过程语言,同样也以main函数开始,只不过执行过程是 ...

  9. NOPI读取模板导出(Excel中追加数据)

    在Controller里,我们定义一个FileResult的Action,返回值是一个文件形式被浏览器下载下来. [HttpGet] public FileResult ExportProductLi ...

随机推荐

  1. Oracle下lag和lead分析函数

    [转自] http://blog.csdn.net/thinkscape/article/details/8290894 Lead和Lag分析函数可以在同一次查询中取出同一字段的前N行的数据(Lag) ...

  2. 【研究】Struts2-052漏洞

    漏洞描述: CVE-2017-9805 2017年9月5日,Apache Struts官方发布最新的安全公告称,Apache Struts 2.5.x的REST插件存在远程代码执行高危漏洞,漏洞编号为 ...

  3. 【研究】Discuz<3.4任意文件删除漏洞

    这里以Discuz3.2为例 关键字:Powered by Discuz! X3.2 时间有限,就不一一截图了,Discuz所有页面全在Discuz_X3.2_SC_UTF8/upload/目录下 利 ...

  4. poj2393tmp

    #include"iostream" #include"stdio.h" #include"algorithm" using namespa ...

  5. postgresql数据库primary key约束/not null约束/unique约束及default值的添加与删除、列的新增/删除/重命名/数据类型的更改

    如果在建表时没有加primary key约束.not null约束.unique约束.default值,而是创建完表之后在某个字段添加的话 1.primary key约束的添加与删除 给red_pac ...

  6. (转) CentOS 7添加开机启动服务/脚本

    CentOS 7添加开机启动服务/脚本 原文:http://blog.csdn.net/wang123459/article/details/79063703 一.添加开机自启服务 在CentOS 7 ...

  7. Java for循环的几种用法分析

    J2SE 1.5提供了另一种形式的for循环.借助这种形式的for循环,可以用更简单地方式来遍历数组和Collection等类型的对象.本文介绍使用这种循环的具体方式,说明如何自行定义能被这样遍历的类 ...

  8. pat1003. Emergency (25)

    1003. Emergency (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue As an emerg ...

  9. Python项目中如何优雅的import

    Python项目中如何优雅的import 前言 之前有一篇关于Python编码规范的随笔, 但是写的比较杂乱, 因为提到了import语句, 在篇文章中, 我专门来讲Python项目中如何更好的imp ...

  10. Cannot connect to VM com.sun.jdi.connect.TransportTimeoutException

    Cannot connect to VM com.sun.jdi.connect.TransportTimeoutException 描述 在用eclipse进行debug的时候弹出了上面的错误,在s ...