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. Spring Boot 例一 实现jsonp接口

    1.新建项目(选择quikstart) 2.增加spring boot 依赖 <dependency> <groupId>org.springframework.boot< ...

  2. 03-树2 List Leaves (25 分)

    Given a tree, you are supposed to list all the leaves in the order of top down, and left to right. I ...

  3. HTML5必须知道的那些事

    [转自] http://www.cnblogs.com/hamy/archive/2012/02/21/2362110.html 再普及一次HTML5基础,HTML5必须知道的那些事,HTML5扫盲. ...

  4. 认识CSS中css背景样式设置

    前端之HTML,CSS(五) CSS CSS背景 CSS可以添加背景颜色和背景图片,也可以对图片进行设置.设置的样式有: background-color 背景颜色 background-image ...

  5. Java基础26-对象初始化过程

    /* 1.因为new Test1()用到了Test1类,所以会把它从硬盘上加载进入内存 2.如果有static静态代码块就会随着类的加载而执行,还有静态成员和普通方法也会随着类的加载而被加载 3.在堆 ...

  6. (转)linux expr命令参数及用法详解

    linux expr命令参数及用法详解 原文:http://blog.csdn.net/tianmohust/article/details/7628694 expr用法 expr命令一般用于整数值, ...

  7. LeetCode 200.岛屿的个数

    给定一个由 '1'(陆地)和 '0'(水)组成的的二维网格,计算岛屿的数量.一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的.你可以假设网格的四个边均被水包围. 示例 1: 输入: ...

  8. java中的各种修饰符作用范围

    访问修饰符: private 缺省 protected public 作用范围: 访问修饰符\作用范围 所在类 同一包内其他类 其他包内子类 其他包内非子类 private 可以访问 不可以 不可以 ...

  9. IE中使用TerraExplorerPro ActiveX控件问题总结

    近段时间,由于工作需要,涉及到Skyline Web的二次开发,遇到一些问题: 问题1:IE中无法使用Skyline 提供的ActiveX Component 的API 解决方法:这个问题一般是没有正 ...

  10. 让ubuntu的ssh保持长时间连接

    Ubuntu下的ssh连接老是自己会断,一段时间不理它就会失去响应 如何让ssh连接服务器或者ssh tunnel保持连接呢? 其实也很方便,只要在/etc/ssh/ssh_config文件里加两个参 ...