From b5b43bac50ad58949e70bcd1a34b1e6c4765fd51 Mon Sep 17 00:00:00 2001 From: chai Date: Wed, 10 Apr 2019 09:03:57 +0800 Subject: *misc --- source/modules/asura-core/graphics/gpu_buffer.h | 39 +++++++++++++++++++------ 1 file changed, 30 insertions(+), 9 deletions(-) (limited to 'source/modules/asura-core/graphics/gpu_buffer.h') diff --git a/source/modules/asura-core/graphics/gpu_buffer.h b/source/modules/asura-core/graphics/gpu_buffer.h index c79ed4b..f2e83fc 100644 --- a/source/modules/asura-core/graphics/gpu_buffer.h +++ b/source/modules/asura-core/graphics/gpu_buffer.h @@ -14,7 +14,7 @@ namespace AsuraEngine enum BufferType { - BUFFER_TYPE_VERTEX, ///< 顶点缓冲 + BUFFER_TYPE_VERTEX, ///< 顶点缓冲,保存position\tangent\normal\color\texcoord(n) BUFFER_TYPE_INDEX, ///< 索引缓冲 }; @@ -25,16 +25,22 @@ namespace AsuraEngine BUFFER_USAGE_STATIC, ///< 经常修改和使用 }; + enum BufferDataType + { + BUFFER_DATA_TYPE_INT, + BUFFER_DATA_TYPE_FLOAT, + BUFFER_DATA_TYPE_UNSIGNED_BYTE, + }; + /// - /// GPU缓冲,分顶点缓冲和索引缓冲两种,避免每次都从内存向显存上传数据。 + /// GPU缓冲,分顶点缓冲vbo和索引缓冲ebo两种,避免每次都从内存向显存上传数据。 /// - class GPUBuffer - : AEScripting::Portable + ASURA_ABSTRACT class GPUBuffer : public AEScripting::Object { public: - GPUBuffer(BufferType type, BufferUsage usage, size_t size); - ~GPUBuffer(); + GPUBuffer(BufferType type, BufferUsage usage, BufferDataType datatype, size_t size); + virtual ~GPUBuffer(); /// /// 初始化\更新缓存,如果没有gpu buffer资源,认为是初始化,否则认为是更新。 @@ -49,24 +55,39 @@ namespace AsuraEngine uint GetBufferSize(); + GLenum GetDataType(); + private: //----------------------------------------------------------------------------// - LUAX_DECL_FACTORY(GPUBuffer); + LUAX_DECL_ABSTRACT_FACTORY(GPUBuffer); LUAX_DECL_ENUM(BufferType, 1); LUAX_DECL_ENUM(BufferUsage, 1); + LUAX_DECL_ENUM(BufferDataType, 2); - LUAX_DECL_METHOD(_New); LUAX_DECL_METHOD(_Fill); LUAX_DECL_METHOD(_GetSize); + LUAX_DECL_METHOD(_GetCount); //----------------------------------------------------------------------------// + GLenum ConvertBufferType(BufferType type); + GLenum ConvertBufferUsage(BufferUsage type); + GLenum ConvertBufferDataType(BufferDataType type); + size_t GetDataTypeSize(); + GLenum mTarget; GLuint mBuffer; - GLuint mUsage; + /// + /// opengl的显存缓冲并没有对数据类型的要求,只在glVertexAttribPointer时会指定,并在 + /// drawcall 时根据给定的数据起始地址和类型从buffer中取各类顶点数据,所以不同的数据类型 + /// 可以保存在一个buffer中。但是为了保持接口的简洁,这里在初始化buffer时指明保存的数据 + /// 类型,并在整个周期内保持数据类型的一致,所以不同的数据类型分属不同的buffer。 + /// + GLenum mDataType; + GLuint mUsage; uint mSize; #if ASURA_DEBUG -- cgit v1.1-26-g67d0