进一步完善VBO

This commit is contained in:
hyzboy 2019-03-18 22:10:44 +08:00
parent 0663cd8de1
commit 8d2a4b33f0
2 changed files with 54 additions and 23 deletions

View File

@ -16,51 +16,77 @@ namespace hgl
GLuint buffer_index; GLuint buffer_index;
GLenum buffer_type; void * data;
GLenum data_type; void * data_end;
uint data_bytes;
uint data_comp; GLenum buffer_type; ///<缓冲区类型(GL_ARRAY_BUFFER,GL_ELEMENT_ARRAY_BUFFER等)
GLsizeiptr data_count; GLenum user_pattern; ///<数据存储区使用模式(GL_STATIC_DRAW,GL_DYNAMIC_DRAW等)
GLsizeiptr buffer_bytes;
GLenum user_pattern; ///<数据存储区使用模式 GLenum data_type; ///<单个数据类型 (GL_BYTE,GL_UNSIGNED_SHORT,GL_FLOAT等)
uint data_bytes; ///<单个数据字节数 (GL_BYTE为1,GL_UNSIGNED_SHORT为2GL_FLOAT为4等)
uint data_comp; ///<数据成员数 (1/2/3/4如2D纹理坐标用23D坐标/法线用3)
GLsizeiptr data_count; ///<数据数量
GLsizeiptr total_bytes; ///<数据总字节数
public: public:
VertexBufferObject(const GLuint index, VertexBufferObject(const GLuint index,
const GLenum &buf_type, const GLenum &buf_type,
const GLenum &dsup,
const uint &dt,const uint &dbytes,const uint &dcm, const uint &dt,const uint &dbytes,const uint &dcm,
const GLsizeiptr &count, const GLsizeiptr &count)
const GLenum &dsup)
{ {
buffer_index=index; buffer_index=index;
buffer_type=buf_type; buffer_type=buf_type;
user_pattern=dsup;
data_type=dt; data_type=dt;
data_bytes=dbytes; data_bytes=dbytes;
data_comp=dcm; data_comp=dcm;
data_count=count; data_count=count;
buffer_bytes=data_bytes*data_comp*data_count; total_bytes=data_bytes*data_comp*data_count;
user_pattern=dsup;
} }
virtual ~VertexBufferObject()=default; virtual ~VertexBufferObject()=default;
GLuint GetBuffer ()const{return buffer_index;} public:
GLsizeiptr GetBufferBytes ()const{return buffer_bytes;}
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;} ///<取数每一组数据中的数据数量
uint GetStride ()const {return data_comp*data_bytes;} ///<取得每一组数据字节数
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:
virtual void Update()=0; ///<向缓冲区提交所有数据
virtual void Change(const GLsizeiptr start,const GLsizeiptr size)=0; ///<向缓冲区提交部分数据
virtual void Change(const GLsizeiptr start,const GLsizeiptr size,const void *)=0; ///<向缓冲区提交部分数据
};//class VertexBufferObject };//class VertexBufferObject
/** /**
* VBO对象 * VBO对象
* @param buf_type (GL_ARRAY_BUFFER,GL_ELEMENT_ARRAY_BUFFER等) * @param buf_type (GL_ARRAY_BUFFER,GL_ELEMENT_ARRAY_BUFFER等)
* @param dsup 使(GL_STATIC_DRAW,GL_DYNAMIC_DRAW等)
* @param data_type (GL_BYTE,GL_UNSIGNED_SHORT,GL_FLOAT等) * @param data_type (GL_BYTE,GL_UNSIGNED_SHORT,GL_FLOAT等)
* @param data_bytes (GL_BYTE为1,GL_UNSIGNED_SHORT为2GL_FLOAT为4等) * @param data_bytes (GL_BYTE为1,GL_UNSIGNED_SHORT为2GL_FLOAT为4等)
* @param data_comp (1/2/3/42D纹理坐标用23D坐标/线3) * @param data_comp (1/2/3/42D纹理坐标用23D坐标/线3)
* @param size * @param size
* @param dsup 使(GL_STATIC_DRAW,GL_DYNAMIC_DRAW等)
*/ */
VertexBufferObject *CreateVBO( const GLenum &buf_type, VertexBufferObject *CreateVBO( const GLenum &buf_type,
const GLenum &dsup,
const uint &data_type,const uint &data_bytes,const uint &data_comp, const uint &data_type,const uint &data_bytes,const uint &data_comp,
const GLsizeiptr &size, const GLsizeiptr &size);
const GLenum &dsup);
}//namespace graph }//namespace graph
}//namespace hgl }//namespace hgl
#endif//HGL_GRAPH_VERTEX_BUFFER_OBJECT_INCLUDE #endif//HGL_GRAPH_VERTEX_BUFFER_OBJECT_INCLUDE

View File

@ -14,14 +14,19 @@ namespace hgl
glDeleteBuffers(1,&buffer_index); glDeleteBuffers(1,&buffer_index);
} }
void Set(GLsizei size,void *data) void Update() override
{ {
glNamedBufferData(buffer_index,size,data,user_pattern); glNamedBufferData(buffer_index,total_bytes,data,user_pattern);
} }
void Change(GLintptr start,GLsizei size,void *data) void Change(const GLsizeiptr start,const GLsizeiptr size) override
{ {
glNamedBufferSubData(buffer_index,start,size,data); glNamedBufferSubData(buffer_index,start,size,((char *)data)+start);
}
void Change(const GLsizeiptr start,const GLsizeiptr size,const void *new_data) override
{
glNamedBufferSubData(buffer_index,start,size,new_data);
} }
};//class VertexBufferControlDSA };//class VertexBufferControlDSA
@ -33,9 +38,9 @@ namespace hgl
} }
VertexBufferObject *CreateVBO(const GLenum &buf_type, VertexBufferObject *CreateVBO(const GLenum &buf_type,
const GLenum &dsup,
const uint &data_type,const uint &data_bytes,const uint &data_comp, const uint &data_type,const uint &data_bytes,const uint &data_comp,
const GLsizeiptr &size, const GLsizeiptr &size)
const GLenum &dsup)
{ {
} }
}//namespace graph }//namespace graph