From 8d2a4b33f0ebe27a421b95e2c884b6c6907737cb Mon Sep 17 00:00:00 2001 From: hyzboy Date: Mon, 18 Mar 2019 22:10:44 +0800 Subject: [PATCH] =?UTF-8?q?=E8=BF=9B=E4=B8=80=E6=AD=A5=E5=AE=8C=E5=96=84VB?= =?UTF-8?q?O?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- inc/hgl/graph/VertexBufferObject.h | 60 ++++++++++++++++++------- src/RenderDriver/VertexBufferObject.cpp | 17 ++++--- 2 files changed, 54 insertions(+), 23 deletions(-) diff --git a/inc/hgl/graph/VertexBufferObject.h b/inc/hgl/graph/VertexBufferObject.h index 8b350dd5..3e5d9435 100644 --- a/inc/hgl/graph/VertexBufferObject.h +++ b/inc/hgl/graph/VertexBufferObject.h @@ -16,51 +16,77 @@ namespace hgl GLuint buffer_index; - GLenum buffer_type; - GLenum data_type; - uint data_bytes; - uint data_comp; - GLsizeiptr data_count; - GLsizeiptr buffer_bytes; - GLenum user_pattern; ///<数据存储区使用模式 + 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等) + uint data_comp; ///<数据成员数 (1/2/3/4,如2D纹理坐标用2,3D坐标/法线用3) + + GLsizeiptr data_count; ///<数据数量 + GLsizeiptr total_bytes; ///<数据总字节数 public: VertexBufferObject(const GLuint index, const GLenum &buf_type, + const GLenum &dsup, const uint &dt,const uint &dbytes,const uint &dcm, - const GLsizeiptr &count, - const GLenum &dsup) + const GLsizeiptr &count) { buffer_index=index; buffer_type=buf_type; + user_pattern=dsup; + data_type=dt; data_bytes=dbytes; data_comp=dcm; + data_count=count; - buffer_bytes=data_bytes*data_comp*data_count; - user_pattern=dsup; + total_bytes=data_bytes*data_comp*data_count; } virtual ~VertexBufferObject()=default; - GLuint GetBuffer ()const{return buffer_index;} - GLsizeiptr GetBufferBytes ()const{return buffer_bytes;} + 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;} ///<取数每一组数据中的数据数量 + 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 /** * 创建一个VBO对象 * @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_bytes 单个数据字节数 (GL_BYTE为1,GL_UNSIGNED_SHORT为2GL_FLOAT为4等) * @param data_comp 数据成员数 (1/2/3/4,如2D纹理坐标用2,3D坐标/法线用3) * @param size 数据数量 - * @param dsup 数据存储区使用模式(GL_STATIC_DRAW,GL_DYNAMIC_DRAW等) */ VertexBufferObject *CreateVBO( const GLenum &buf_type, - const uint &data_type,const uint &data_bytes,const uint &data_comp, - const GLsizeiptr &size, - const GLenum &dsup); + const GLenum &dsup, + const uint &data_type,const uint &data_bytes,const uint &data_comp, + const GLsizeiptr &size); }//namespace graph }//namespace hgl #endif//HGL_GRAPH_VERTEX_BUFFER_OBJECT_INCLUDE diff --git a/src/RenderDriver/VertexBufferObject.cpp b/src/RenderDriver/VertexBufferObject.cpp index d16a98ac..eba67176 100644 --- a/src/RenderDriver/VertexBufferObject.cpp +++ b/src/RenderDriver/VertexBufferObject.cpp @@ -14,14 +14,19 @@ namespace hgl 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 @@ -33,9 +38,9 @@ namespace hgl } VertexBufferObject *CreateVBO(const GLenum &buf_type, + const GLenum &dsup, const uint &data_type,const uint &data_bytes,const uint &data_comp, - const GLsizeiptr &size, - const GLenum &dsup) + const GLsizeiptr &size) { } }//namespace graph