void OGL4ShaderProgram::CollectUniformBlocks() { GLint count = 0; glGetProgramiv(m_program, GL_ACTIVE_UNIFORM_BLOCKS, &count); for(int i = 0; i < count; ++i) { char szName[1024]; glGetActiveUniformBlockName(m_program, i, 1024, 0, szName); GLint bytes = 0; glGetActiveUniformBlockiv(m_program, i, GL_UNIFORM_BLOCK_DATA_SIZE, &bytes); OGL4BufferPtr pBuffer = std::make_shared<OGL4Buffer>(); if(pBuffer->Create(BT_CONSTANT_BUFFER, bytes, nullptr, true) == false) { pBuffer->Release(); pBuffer.reset(); continue; } UniformBlock block; block.index = i; block.name = szName; block.pBuffer = pBuffer; m_uniformBlocks.push_back(block); } }
bool OGL4GeometryData::AllocIndexBuffer(uint32 bytes, void* initData, bool dynamic, G_FORMAT format) { OGL4BufferPtr pBuffer = std::make_shared<OGL4Buffer>(); if(pBuffer->Create(BT_INDEX_BUFFER, bytes, initData, dynamic) == false) { return false; } AttachIndexBuffer(pBuffer, format); return true; }
bool OGL4GeometryData::AllocVertexBuffer(uint32 bytes, void* initData, bool dynamic, const VertexLayout& layout) { OGL4BufferPtr pBuffer = std::make_shared<OGL4Buffer>(); if(pBuffer->Create(BT_VERTEX_BUFFER, bytes, initData, dynamic) == false) { return false; } AttachVertexBuffer(pBuffer, layout); return true; }