`
tiankefeng0520
  • 浏览: 145720 次
  • 性别: Icon_minigender_1
  • 来自: 长春
社区版块
存档分类
最新评论

OpenGL学习八:缓冲区对象

阅读更多

 

产生原因
OpenGL是按照CS结构设计的,当OPENGL需要数据的时候,必须从客户机内存传递到服务器,如果客户机和服务器属于不同的计算机,这样的数据效率缓慢,并且有时是冗余的
做法
1.创建缓冲区对象
glGenBuffers(NUM_BUFFER,buffers);
2.激活缓冲区对象
glBindBuffer(target,buffer);
GL_ARRAY_BUFFER //坐标,颜色 等
GL_ELEMENT_ARRAY_BUFFER //索引坐标
GL_TEXTURE_BUFFER//纹理缓冲
……
3.用数据分配和初始化缓冲区对象
glBufferData(target,size,data,usage)

usage:
#define GL_STREAM_DRAW 0x88E0
#define GL_STREAM_READ 0x88E1
#define GL_STREAM_COPY 0x88E2
#define GL_STATIC_DRAW 0x88E4
#define GL_STATIC_READ 0x88E5
#define GL_STATIC_COPY 0x88E6
#define GL_DYNAMIC_DRAW 0x88E8
#define GL_DYNAMIC_READ 0x88E9
DRAW: 客户机指定了用于渲染的数据
READ:从OPENGL缓冲区读取数据值,并且在应用程序中用于各种鱼渲染不直接相关的计算过程
COPY:从OPENGL缓冲区读取数据值,作为用于渲染的数据

STREAM:缓冲区对象中数据需要经常更新,但是作为绘图或其他操作使用较少
STATIC:缓冲区数据只指定1次,但是这些数据使用频率非常高
DYNAMIC:缓冲区数据常常更新,并且使用频率也很高
4.激活顶点数组
5.为顶点数组指定数据,这里指定的数据在服务器存储的内存地址


glGenBuffers(NUM_BUFFER,buffers);
 glBindBuffer(GL_ARRAY_BUFFER,buffers[VERTICES]);
 glBufferData(GL_ARRAY_BUFFER,sizeof(vertices),vertices,GL_STATIC_DRAW);
 glVertexPointer(3,GL_FLOAT,0,0);
 glEnableClientState(GL_VERTEX_ARRAY);

 glBindBuffer(GL_ARRAY_BUFFER,buffers[COLOR]);
 glBufferData(GL_ARRAY_BUFFER,sizeof(colors),colors,GL_STATIC_DRAW);
 glColorPointer(3,GL_FLOAT,0,0);
 glEnableClientState(GL_COLOR_ARRAY);

 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,buffers[INDICES]);
 glBufferData(GL_ELEMENT_ARRAY_BUFFER,sizeof(indices),indices,GL_STATIC_DRAW);
缓冲区数据更改

方法1:
glBufferSubData(Glenum target,GLintptr offset,Glsizeiptr size,const Glvoid* data)
用data指向数据更新target相关联的当前绑定缓冲区的对象中offset开始的size个字节数据

方法2:
使用glMapBuffer返回一个指向缓冲区对象的指针,可以在这个缓冲区写入新值。在完成了对缓冲区对象的数据更新之后,可以调用glUnmapBuffer(target)取消都这个缓冲区的映射。
数据在缓冲区对象向之间复制
void glCopyBufferSubData(GLenum readbuffer,GLenum writebuffer,GLinrptr readoffset,GLinrptr writeoffset,Glsizeiptr size)
Glvoid* glMapBuffer(target,access)
target:当前绑定缓冲区对象的数据存储
accrss: GL_READ_ONLY
        GL_WRITE_ONLY
        GL_WRITE_READ_ONLY
glIsBuffer 查看缓冲区是否已被绑定
glDeleteBuffers 清空缓冲区对象
glUnmapBuffer(target) 对数据存储访问之后,调用取消对这个缓冲区的映射
#include "header.h"	

#define VERTICES 0
#define COLOR 1
#define INDICES 2
#define NUM_BUFFER 3
GLuint buffers[NUM_BUFFER];
float quard=0;

 GLfloat vertices[][3]={{0,0,50},//0
{100,0,50},//1
{100,100,50},//2
{0,100,50},//3
{0,0,-50},//4
{100,0,-50},//5
{100,100,-50},//6
{0,100,-50}//7
};
 GLfloat colors[][3]={{1.0,0.2,0.2}, {0.2,0.2,1.0}, {0.8,1.0,0.2}, {0.75,0.75,0.75}, {0.35,0.35,0.35}, {0.5,0.5,0.5}, {0.3,0.4,0.5}, {0.5,0.6,0.7}};
GLubyte indices[][4]={{3,2,1,0},{7,6,5,4},{7,4,0,3},{6,5,1,2},{7,3,2,6},{0,4,5,1}};



void display(void)
{
	glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
	glLoadIdentity();
	glRotatef(quard,1,1,0);
	glDrawElements(GL_QUADS,24,GL_UNSIGNED_BYTE,0);
	glFlush();
	glutSwapBuffers();
	

}
void rotate()
{
	quard+=0.1;
	glutPostRedisplay();
}

void mouse(int button,int state,int x,int y)
{
	switch(button)
	{
	case GLUT_LEFT_BUTTON:
		if(GLUT_DOWN==state)
		{
			glutIdleFunc(rotate);
		}else
		{
			//glutIdleFunc(0);
		}
	}
}



void init()
{
	

	glClearColor(0.0,1.0,0.0,0.0);
	glClearDepth(1.0);
	glViewport(0,0,600,480);


	glEnable(GL_DEPTH_TEST);
	glDepthFunc(GL_LEQUAL);

	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();

	glOrtho(-300,300,-100,380,-100,100);
	glMatrixMode(GL_MODELVIEW);

	glewInit();
	glGenBuffers(NUM_BUFFER,buffers);
	glBindBuffer(GL_ARRAY_BUFFER,buffers[VERTICES]);
	glBufferData(GL_ARRAY_BUFFER,sizeof(vertices),vertices,GL_STATIC_DRAW);
	glVertexPointer(3,GL_FLOAT,0,0);
	glEnableClientState(GL_VERTEX_ARRAY);

	glBindBuffer(GL_ARRAY_BUFFER,buffers[COLOR]);
	glBufferData(GL_ARRAY_BUFFER,sizeof(colors),colors,GL_STATIC_DRAW);
	glColorPointer(3,GL_FLOAT,0,0);
	glEnableClientState(GL_COLOR_ARRAY);

	glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,buffers[INDICES]);
	glBufferData(GL_ELEMENT_ARRAY_BUFFER,sizeof(indices),indices,GL_STATIC_DRAW);


}

int main(int argc,char** argv)
{
	glutInit(&argc,argv);
	
	glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);

	glutInitWindowSize(600,480);
	glutInitWindowPosition(100,100);
	glutCreateWindow("缓冲区对象");

	init();

	glutDisplayFunc(display);
	glutMouseFunc(mouse);
	glutMainLoop();



	return 0;
}

 

分享到:
评论

相关推荐

    C#版的OpenGL

    开发者在使用时,需要了解OpenGL的基本概念,如顶点、图元、缓冲区、着色器等,并通过C#接口调用相应的OpenGL函数进行编程。同时,熟悉C#的类库和编程范式也是必不可少的,这将帮助他们更好地理解和利用这个C#版的...

    Android OpenGL入门示例:绘制三角形和正方形

    使用`glGenBuffers()`创建缓冲区对象,然后用`glBindBuffer()`绑定它,接着调用`glBufferData()`将顶点数据传入缓冲区。这一步是数据上传到GPU的过程。 接着,设置着色器。OpenGL ES使用顶点着色器和片段着色器进行...

    现代OpenGL+Qt:绘制可旋转、带光照效果的三维物体

    8. **清理资源**:在应用退出时,记得释放OpenGL资源,如删除着色器程序和缓冲对象。 这个过程涉及到的知识点广泛,包括OpenGL上下文管理、顶点数组、着色器编程、矩阵变换、光照模型以及Qt的事件处理机制。理解并...

    OpenGL编程指南 第7版(英文版) pdf

    - 引入了新的函数,如`glDrawBuffers`,用于指定多个颜色缓冲区。 2. **OpenGL 3.1**: - 继续改进了着色器语言,增加了更多内置函数。 - 支持更复杂的几何处理,通过几何着色器扩展了几何管线的功能。 - 提高了...

    OpenGL学习资料文档.rar

    "OpenGL超级宝典第五版"则更深入地探讨了OpenGL的各种高级特性,如纹理映射、光照模型、顶点数组、缓冲区对象、帧缓冲对象、着色器编程等。此书对于想要进阶学习和开发高性能图形应用的开发者来说是必不可少的参考。...

    OpenGL学习内容以及参考书籍和网站-2008.

    ### OpenGL学习内容以及参考书籍和网站-2008 #### 一、OpenGL背景与历史 OpenGL(Open Graphics Library)是一种跨平台的应用程序接口(API),用于渲染2D和3D矢量图形。它最初由Silicon Graphics Inc. (SGI) 开发...

    opengl 第八版 源码

    7. **缓冲区对象**:用于高效地存储和传输数据,如顶点数据、索引数据和帧缓冲。 8. **帧缓冲对象(FBO)**:允许程序员创建离屏渲染目标,实现复杂的后处理效果。 9. **着色器程序**:将多个着色器组合成一个完整...

    OpenGL编程指南(原书第9版)内附随书源代码

    4. **缓冲区对象**:缓冲区对象是存储图形数据的主要方式,包括顶点数据、索引数据、纹理数据等。通过缓冲区对象,开发者可以有效地管理数据并提高性能。 5. **纹理映射**:纹理映射是将2D图像应用到3D物体表面的...

    opengl类学习文件

    学习OpenGL的过程中,你将接触到顶点坐标、颜色、纹理、光照、投影、视口变换等概念,还会涉及状态机模型、着色器语言(GLSL)、缓冲区对象、帧缓冲对象(FBO)和纹理渲染等高级特性。通过分析和实践这些源代码,你...

    OPENGL学习 3D小雪人

    7. **渲染循环**:OpenGL应用通常包含一个主循环,不断清除屏幕、更新模型状态、绘制图形并交换缓冲区以显示结果。 8. **固定功能和可编程管线**:OpenGL早期版本使用固定功能管线,但现代OpenGL更倾向于使用可编程...

    Android OpenGL ES学习

    3. **顶点数组对象**(Vertex Array Object, VAO)和**缓冲区对象**(Buffer Object, BO):用于高效地存储和传输顶点数据到GPU。VAO是顶点数据的配置信息,BO则用来存储顶点数据。 4. **纹理**(Texture):在2D...

    openGLES3.0Example_6_MapBuffers_triangle.rar

    在"openGLES3.0Example_6_MapBuffers_triangle.rar"这个示例中,我们关注的是OpenGL ES 3.0如何使用缓冲区对象(Buffer Objects)来绘制一个三角形。缓冲区对象是OpenGL ES中存储顶点数据、颜色数据或纹理坐标等图形...

    opengl课件 opengl课件

    5. **缓冲区**:用于存储数据,如顶点数据、索引数据、纹理数据等。 在"opengl课件"中,可能会包含以下内容: - OpenGL基础理论:介绍OpenGL的工作原理、基本概念和术语。 - 编程实践:提供示例代码,讲解如何设置...

    opengl课件PPT

    - **缓冲区对象(Buffer Objects)**:用于存储数据,如顶点、颜色、法线和纹理坐标,提高渲染效率。 3. OpenGL着色语言(GLSL): - **GLSL简介**:OpenGL着色器语言是为GPU编写程序的语言,用于执行顶点、片段...

    OpenGL编程指南第7版

    为了提高渲染性能,OpenGL引入了缓冲区对象的概念,包括顶点缓冲区对象(VBO)、索引缓冲区对象(IBO)等。通过这些对象可以在GPU上存储大量数据,减少CPU与GPU之间的数据传输次数。 #### 3. 帧缓冲区对象(FBO) FBO允许...

    OpenGL 手册 OpenGL 2.1 Reference

    5. **缓冲区对象**:OpenGL 2.1引入了缓冲区对象,可以高效地管理数据,如顶点、颜色和法线。`glGenBuffers()`, `glBindBuffer()`, `glBufferData()` 等函数用于创建、绑定和填充缓冲区。 6. **顶点数组**:这部分...

    opengl red book

    - **缓冲区对象**:为了提高图形渲染效率,OpenGL引入了缓冲区对象的概念,包括顶点缓冲区对象(VBO)、索引缓冲区对象等。 - **帧缓冲区对象**:帧缓冲区对象(FBO)允许在非窗口表面绘制,常用于后处理效果的...

    opengl_programming_guide_8th_edition.pdf

    - **性能优化技巧**:提供了一系列关于提高OpenGL应用程序性能的方法,如减少API调用次数、使用缓冲区对象等。 - **调试与错误处理**:讨论了OpenGL应用程序中的常见问题及其解决方法,以及如何有效地调试OpenGL程序...

    OPENGL学习

    以下是一些关于OpenGL学习的关键点,以及可能在提供的文件中涉及的内容。 1. **OpenGL基本概念**:首先,了解OpenGL的工作原理和架构至关重要。它是跨平台的,用于渲染2D和3D图形的库,由一组函数调用组成,这些...

    OpenGL入门学习之十四——OpenGL版本和OpenGL扩展.pdf

    - **OpenGL 1.5**:重点在于引入了缓冲区对象(Buffer Objects),这使得GPU可以直接访问内存中的数据,进一步提高了渲染效率。 - **OpenGL 2.0**:这是一个重要的里程碑,引入了全新的着色语言——OpenGL Shading ...

Global site tag (gtag.js) - Google Analytics