`
tiankefeng0520
  • 浏览: 143057 次
  • 性别: 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;
}

 

分享到:
评论

相关推荐

    OpenGL ES 3.0

    该章提供了创建纹理、加载纹理数据以及纹理渲染的细节,描述了纹理包装模式、纹理过滤、纹理格式、压缩纹理、采样器对象、不可变纹理、像素解包缓冲区对象和Mip贴图。该章介绍了OpenGL ES 3.0支持的所有纹理类型:2D...

    OpenGL ES 3.x游戏开发 下卷 高清版

    介绍了OpenGL ES 3.x中的各种缓冲区对象和顶点着色器与片元着色器的使用技巧,以及高级光影效果的实现,如凹凸映射、环境反射、阴影、倒影、镜头光晕等。介绍了杰出的3D物理引擎Bullet(Java和C++版本),详细介绍了...

    hello_opengl_oculus:将几个示例组合成一个文件,希望是跨平台的 OpenGL Oculus Rift “样板文件”

    大多数窗口、纹理和帧缓冲区代码取自简单的单页 opengl 示例。 我将使用此代码作为大型项目的起点,但这些项目将需要比目前在此处找到的更健壮的架构。 对于学习 Oculus SDK 而言,这种纯函数式编程、单页方法比...

    OpenGL入门学习.pdf

    一、第一个OPENGL程序...................................................................................................................4 1.1、OPENGL的优点.................................................

    WebGL编程指南

    将渲染缓冲区对象关联到帧缓冲区对象(gl.framebufferRenderbuffer()) 389 检查帧缓冲区的配置(gl.checkFramebufferStatus()) 390 在帧缓冲区进行绘图 390 绘制阴影 392 如何实现阴影 392 示例程序(Shadow....

    webgl编程指南及源码1/2

    将渲染缓冲区对象关联到帧缓冲区对象(gl.framebufferRenderbuffer()) 389 检查帧缓冲区的配置(gl.checkFramebufferStatus()) 390 在帧缓冲区进行绘图 390 绘制阴影 392 如何实现阴影 392 示例程序(Shadow....

    webgl编程指南及源码2/2

    将渲染缓冲区对象关联到帧缓冲区对象(gl.framebufferRenderbuffer()) 389 检查帧缓冲区的配置(gl.checkFramebufferStatus()) 390 在帧缓冲区进行绘图 390 绘制阴影 392 如何实现阴影 392 示例程序(Shadow....

    WebGL编程指南压缩包

    将渲染缓冲区对象关联到帧缓冲区对象(gl.framebufferRenderbuffer()) 389 检查帧缓冲区的配置(gl.checkFramebufferStatus()) 390 在帧缓冲区进行绘图 390 绘制阴影 392 如何实现阴影 392 示例程序(Shadow....

    使用FBO,渲染到纹理

    testing Frame Buffer Object (FBO) for "Render To Texture" 使用opengl的帧缓冲区对象,执行渲染到纹理操作,调试的老外写的例子 测试可用,非常适合入门学习研究

    graphics-algorithm:3D图形学算法代码。包括软渲染,光线追踪,PBR等〜

    3D代码实现仓库 图形学项目案例实现总结(包括渲染,光照,点云等)。我的联系方式是 ,如果对您有帮助还请帮忙点一个star。记录图形学开发内容,学习过程中的总结仓库: : ... OpenGL统一缓冲区对象(U

    易语言程序免安装版下载

    OpenGL支持库中的部分英文名称常量已改为中文,并统一在所有常量名称之前加前缀“GL_”,以减少与其它库的冲突机率。 3. 互联网支持库中的“FTP目录列表”命令返回的文件时间改为FTP服务器返回的原始时间,不做...

    windowsnt 技术内幕

    NTFS POSIX.1符合性 为NTFS分区整理碎片 可移动介质和Windows NT 理解运行第三方磁盘工具造成的问题 支持基于Win32的应用程序 理解Windows NT对附加技术的支持 知道在什么时候不能使用OpenGL屏幕保护 理解DirectX ...

Global site tag (gtag.js) - Google Analytics