建立独立的BufferObject,用于建立统一独立的缓冲区管理类,所有不管是VBO,还是UBO,SSBO,TBO,全部共用这一套代码。另需设计将Object与buffer manage分离。
This commit is contained in:
parent
8d2a4b33f0
commit
82ea3fbcbd
76
inc/hgl/graph/BufferObject.h
Normal file
76
inc/hgl/graph/BufferObject.h
Normal file
@ -0,0 +1,76 @@
|
||||
#ifndef HGL_GRAPH_BUFFER_OBJECT_INCLUDE
|
||||
#define HGL_GRAPH_BUFFER_OBJECT_INCLUDE
|
||||
|
||||
#include<GLEWCore/glew.h>
|
||||
#include<hgl/type/DataType.h>
|
||||
namespace hgl
|
||||
{
|
||||
namespace graph
|
||||
{
|
||||
/**
|
||||
* 显存数据缓冲区对象<br>
|
||||
* 负责对象与API的交接
|
||||
*/
|
||||
class BufferObject
|
||||
{
|
||||
GLuint buffer_index; ///<缓冲区索引
|
||||
GLenum buffer_type; ///<缓冲区类型(GL_ARRAY_BUFFER,GL_ELEMENT_ARRAY_BUFFER等)
|
||||
GLenum user_pattern; ///<数据存储区使用模式(GL_STATIC_DRAW,GL_DYNAMIC_DRAW等)
|
||||
|
||||
GLsizeiptr total_bytes; ///<数据总字节数
|
||||
void *local_data,*local_data_end; ///<本地数据内存指针
|
||||
bool self_alloc; ///<是否自身分配
|
||||
|
||||
protected:
|
||||
|
||||
BufferObject(GLenum type)
|
||||
{
|
||||
buffer_index=
|
||||
buffer_type=type;
|
||||
}
|
||||
|
||||
BufferObject(GLenum type,GLenum up)
|
||||
{
|
||||
buffer_type=type;
|
||||
user_pattern=up;
|
||||
}
|
||||
|
||||
BufferObject(GLuint index,GLenum type,GLenum up)
|
||||
{
|
||||
buffer_index=index;
|
||||
buffer_type=type;
|
||||
user_pattern=up;
|
||||
}
|
||||
|
||||
BufferObject(GLenum type,GLenum up,void *data,GLsizeiptr size,bool data_self_alloc)
|
||||
{
|
||||
buffer_index=index;
|
||||
buffer_type=type;
|
||||
user_pattern=up;
|
||||
|
||||
total_bytes=size;
|
||||
|
||||
local_data=data;
|
||||
local_data_end=((char *)data)+size;
|
||||
|
||||
self_alloc=data_self_alloc;
|
||||
}
|
||||
|
||||
virtual ~BufferObject()
|
||||
{
|
||||
if(self_alloc)
|
||||
if(local_data)delete[] local_data;
|
||||
}
|
||||
|
||||
GLuint GetBuffer ()const {return buffer_index;} ///<取得OpenGL缓冲区
|
||||
GLenum GetBufferType ()const {return buffer_type;} ///<取得缓冲区类型
|
||||
GLenum GetUserPattern ()const {return user_pattern;} ///<取得缓冲区使用方法
|
||||
GLsizeiptr GetTotalBytes ()const {return total_bytes;} ///<取得数据总字节数
|
||||
|
||||
void * GetData () {return data;} ///<取得数据指针
|
||||
void * GetData (const uint pos) {return ((char *)data)+data_bytes*pos;} ///<取得数据指针
|
||||
};//class BufferObject
|
||||
|
||||
}//namespace graph
|
||||
}//namespace hgl
|
||||
#endif//HGL_GRAPH_BUFFER_OBJECT_INCLUDE
|
@ -1,8 +1,7 @@
|
||||
#ifndef HGL_GRAPH_VERTEX_BUFFER_OBJECT_INCLUDE
|
||||
#define HGL_GRAPH_VERTEX_BUFFER_OBJECT_INCLUDE
|
||||
|
||||
#include<GLEWCore/glew.h>
|
||||
#include<hgl/type/DataType.h>
|
||||
#include<graph/BufferObject.h>
|
||||
namespace hgl
|
||||
{
|
||||
namespace graph
|
||||
@ -10,17 +9,10 @@ namespace hgl
|
||||
/**
|
||||
* 顶点缓冲区对象,对应OpenGL的VBO管理
|
||||
*/
|
||||
class VertexBufferObject
|
||||
class VertexBufferObject:public BufferObject
|
||||
{
|
||||
protected:
|
||||
|
||||
GLuint buffer_index;
|
||||
|
||||
void * data;
|
||||
void * data_end;
|
||||
|
||||
GLenum buffer_type; ///<缓冲区类型(GL_ARRAY_BUFFER,GL_ELEMENT_ARRAY_BUFFER等)
|
||||
GLenum user_pattern; ///<数据存储区使用模式(GL_STATIC_DRAW,GL_DYNAMIC_DRAW等)
|
||||
|
||||
GLenum data_type; ///<单个数据类型 (GL_BYTE,GL_UNSIGNED_SHORT,GL_FLOAT等)
|
||||
uint data_bytes; ///<单个数据字节数 (GL_BYTE为1,GL_UNSIGNED_SHORT为2GL_FLOAT为4等)
|
||||
@ -53,9 +45,6 @@ namespace hgl
|
||||
|
||||
public:
|
||||
|
||||
GLuint GetBuffer ()const {return buffer_index;} ///<取得OpenGL缓冲区
|
||||
GLenum GetBufferType ()const {return buffer_type;} ///<取得缓冲区类型
|
||||
GLenum GetUserPattern ()const {return user_pattern;} ///<取得缓冲区使用方法
|
||||
|
||||
GLenum GetDataType ()const {return data_type;} ///<取得数据类型
|
||||
uint GetComponent ()const {return data_comp;} ///<取数每一组数据中的数据数量
|
||||
@ -63,9 +52,6 @@ namespace hgl
|
||||
|
||||
GLsizeiptr GetCount ()const {return data_count;} ///<取得数据数量
|
||||
|
||||
GLsizeiptr GetTotalBytes ()const {return total_bytes;} ///<取得数据总字节数
|
||||
void * GetData () {return data;} ///<取得数据指针
|
||||
void * GetData (const uint pos) {return ((char *)data)+data_bytes*pos;} ///<取得数据指针
|
||||
|
||||
public:
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user