diff options
Diffstat (limited to 'source/modules/asura-core/graphics/gpu_buffer.cpp')
-rw-r--r-- | source/modules/asura-core/graphics/gpu_buffer.cpp | 76 |
1 files changed, 57 insertions, 19 deletions
diff --git a/source/modules/asura-core/graphics/gpu_buffer.cpp b/source/modules/asura-core/graphics/gpu_buffer.cpp index 6e6aead..aecfa51 100644 --- a/source/modules/asura-core/graphics/gpu_buffer.cpp +++ b/source/modules/asura-core/graphics/gpu_buffer.cpp @@ -5,7 +5,7 @@ namespace AsuraEngine namespace Graphics { - GPUBuffer::GPUBuffer(BufferType type, BufferUsage usage, size_t size) + GPUBuffer::GPUBuffer(BufferType type, BufferUsage usage, BufferDataType dataType, size_t size) : mTarget(GL_ZERO) , mBuffer(GL_ZERO) , mSize(0) @@ -13,37 +13,56 @@ namespace AsuraEngine , mData(nullptr) #endif { + mTarget = ConvertBufferType(type); + mUsage = ConvertBufferUsage(usage); + mDataType = ConvertBufferDataType(dataType); + mSize = size; + } + + GPUBuffer::~GPUBuffer() + { +#if ASURA_DEBUG + if (mData) + free(mData); +#endif + glDeleteBuffers(1, &mBuffer); + } + + GLenum GPUBuffer::ConvertBufferType(BufferType type) + { switch (type) { case BUFFER_TYPE_VERTEX: - mTarget = GL_ARRAY_BUFFER; - break; + return GL_ARRAY_BUFFER; case BUFFER_TYPE_INDEX: - mTarget = GL_ELEMENT_ARRAY_BUFFER; - break; + return GL_ELEMENT_ARRAY_BUFFER; } + } + + GLenum GPUBuffer::ConvertBufferUsage(BufferUsage usage) + { switch (usage) { case BUFFER_USAGE_STREAM: - mUsage = GL_STREAM_DRAW; - break; + return GL_STREAM_DRAW; case BUFFER_USAGE_DYNAMIC: - mUsage = GL_DYNAMIC_DRAW; - break; + return GL_DYNAMIC_DRAW; case BUFFER_USAGE_STATIC: - mUsage = GL_STATIC_DRAW; - break; + return GL_STATIC_DRAW; } - mSize = size; } - GPUBuffer::~GPUBuffer() + GLenum GPUBuffer::ConvertBufferDataType(BufferDataType type) { -#if ASURA_DEBUG - if (mData) - free(mData); -#endif - glDeleteBuffers(1, &mBuffer); + switch (type) + { + case BUFFER_DATA_TYPE_INT: + return GL_INT; + case BUFFER_DATA_TYPE_FLOAT: + return GL_FLOAT; + case BUFFER_DATA_TYPE_UNSIGNED_BYTE: + return GL_UNSIGNED_BYTE; + } } bool GPUBuffer::Fill(const void * data, size_t size, uint offset) @@ -58,7 +77,7 @@ namespace AsuraEngine if (mBuffer == 0) throw Exception("OpenGL glGenBuffers failed."); glBindBuffer(mTarget, mBuffer); - glBufferData(mTarget, mSize, NULL, mUsage); // ʼСΪsizeĻ + glBufferData(mTarget, mSize, NULL, mUsage); // ʼСΪsizeĻ壬usageŵӦԴ if (gl.HasError()) { glBindBuffer(mTarget, 0); @@ -100,5 +119,24 @@ namespace AsuraEngine return mSize; } + GLenum GPUBuffer::GetDataType() + { + return mDataType; + } + + size_t GPUBuffer::GetDataTypeSize() + { + //https://blog.csdn.net/nklinux/article/details/16919017 + switch (mDataType) + { + case GL_UNSIGNED_BYTE: + return sizeof(GLbyte); + case GL_FLOAT : + return sizeof(GLfloat); + case GL_INT: + return sizeof(GLint); + } + } + } }
\ No newline at end of file |