Opengl es2.0 学习笔记(十)VBO、IBO和FBO

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hiwoshixiaoyu/article/details/83895668

VBO:顶点缓冲,也就是说把顶点的存储在 显卡中开辟内存,提高传递的效率。也可以说叫顶点坐标的 缓冲区。

//创建vbo
glGenBuffers(1,&_vbo);
//绑定vbo
glBindBuffer(GL_ARRAY_BUFFER,_vbo);
//copy数据到显存
//
// GL_STREAM_DRAW		不经常变化
//GL_STATIC_DRAW		常量
//GL_DYNAMIC_DRAW        经常变化

glBufferData(GL_ARRAY_BUFFER,sizeof(vertexs),vertexs,GL_STATIC_DRAW);
//修改部分数据
//glBufferSubData()
 //绑定完之后 恢复状态
glBindBuffer(GL_ARRAY_BUFFER,0);

使用:

//使用绑定的vbo
glBindBuffer(GL_ARRAY_BUFFER,_vbo);

//绘制过程

//关闭vbo
 glBindBuffer(GL_ARRAY_BUFFER,0);

IBO:索引缓冲,按照索引进行连接,提高效率。按照索引去
画 图形。

创建

 glGenBuffers(1,&_indexbo);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,_indexbo);
glBufferData(GL_ELEMENT_ARRAY_BUFFER,sizeof(indexBuf),indexBuf,GL_STATIC_DRAW);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,0);

使用

//开启
 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,_indexbo);
//绘制 使用 glDrawElements进行索引绘制
//关闭
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,0);

FBO:帧缓存,将我们需要绘制的物体,会知道纹理上,最后在把纹理绘制一遍。这也叫离屏渲染。

FBO创建/开始使用/结束使用

virtual void beginFBO(unsigned FBOID,unsigned textureId)
{
	glBindFramebuffer(GL_FRAMEBUFFER,FBOID);
	//把数据渲染到纹理 的0级上
	glFramebufferTexture2D(GL_FRAMEBUFFER,GL_COLOR_ATTACHMENT0,GL_TEXTURE_2D,textureId,0);
}


virtual void endFBO(unsigned FBOID,unsigned textureId)
{
	glBindFramebuffer(GL_FRAMEBUFFER,0);
}
virtual std::pair(unsigned,unsigned)  createFBO(int width ,int height)
 {	
	std::pair(unsigned,unsigned) buf;
	//unsigned FBOID;
	//unsigned RBOID;
	//生产1个帧buffer
	glGenFramebuffers(1,&buf.first);
	//绑定framebuffer
	glBindFramebuffer(GL_FRAMEBUFFER,buf.first);
		
	//产生render buffer
	glGenRenderbuffers(1,&buf.second);
	//绑定render buffer
	glBindFramebuffer(GL_RENDERBUFFER,buf.second);

	//指明缓冲区存储内容
	glRenderbufferStorage(GL_RENDERBUFFER,GL_DEPTH_COMPONENT16,width,height);
	//关闭render buffer
	glBindFramebuffer(GL_RENDERBUFFER,0);
	
	//关联
	glFramebufferRenderbuffer(GL_FRAMEBUFFER,GL_DEPTH_ATTACHMENT,GL_RENDERBUFFER,buf.second);
	//关闭frame buffer
	glBindFramebuffer(GL_FRAMEBUFFER,0);

	return buf;
 }

使用的伪代码

 createFBO();
 onrender
 {
	 beginFBO();
	 {
		 //所有的绘制都 绘制到了纹理上		 
	 }
	 endFBO();

	 shader.bgein();
	 //画FBO纹理
	 shader.end();
 }

猜你喜欢

转载自blog.csdn.net/hiwoshixiaoyu/article/details/83895668