EDIT: Adding code samples. Implementation of the layer class I am using:
RStaticLayer::RStaticLayer(RShaderComponent& shader) : m_Renderer(new RGuerrillaRendererComponent()), m_Shader(shader) { m_Shader.enableShader(); m_Shader.setUniformMat4("proj_matrix", (const RML::Matrix4) RML::Matrix4::orthographic(0.0f, 16.0f, 0.0f, 9.0f, -1.0f, 1.0f)); m_Shader.disableShader(); } RStaticLayer::~RStaticLayer() { delete m_Renderer; } RLayer & RStaticLayer::addGroup(std::string name, Group & group) { m_Groups[name] = &group; return *this; } void RStaticLayer::draw() { m_Shader.enableShader(); m_Renderer->begin(); for(auto group = m_Groups.begin(); group != m_Groups.end(); group++) { for(auto renderable = group->second->renderables.begin(); renderable != group->second->renderables.end(); ++renderable) { m_Renderer->submit(*renderable); } } m_Renderer->end(); m_Renderer->flush(); m_Shader.disableShader(); } void RStaticLayer::removeGroup(std::string name) { m_Groups.erase(name); } What the m_Renderer.submit(), begin(), end() and flush() do:
void RGuerrillaRendererComponent::begin() { GLCall(glBindBuffer(GL_ARRAY_BUFFER, m_VBO)); GLCall(m_Buffer = (VertexData *) glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY)); m_IndexCount = 0; } void RGuerrillaRendererComponent::submit(const RRenderableObject * renderable) { const RML::Vector3D & position = renderable->getPosition(); const RML::Vector2D & size = renderable->getSize(); const RML::Vector4D & color = renderable->getColor(); m_Buffer->vertex = position; m_Buffer->color = color; m_Buffer++; m_Buffer->vertex = RML::Vector3D(position.x, position.y + size.y, position.z); m_Buffer->color = color; m_Buffer++; m_Buffer->vertex = RML::Vector3D(position.x + size.x, position.y + size.y, position.z); m_Buffer->color = color; m_Buffer++; m_Buffer->vertex = RML::Vector3D(position.x + size.x, position.y, position.z); m_Buffer->color = color; m_Buffer++; m_IndexCount += 6; } void RGuerrillaRendererComponent::end() { GLCall(glUnmapBuffer(GL_ARRAY_BUFFER)); GLCall(glBindBuffer(GL_ARRAY_BUFFER, m_VBO)); } void RGuerrillaRendererComponent::flush() { GLCall(glBindVertexArray(m_VAO)); m_IBO->bindIndexBuffer(); GLCall(glDrawElements(GL_TRIANGLES, m_IndexCount, GL_UNSIGNED_SHORT, NULL)); m_IBO->unbindIndexBuffer(); GLCall(glBindVertexArray(0)); m_IndexCount = 0; } What my shader enable/disable functions look like:
void RShaderComponent::enableShader() const { GLCall(glUseProgram(m_ShaderID)); // m_ShaderID is acquired successfuly. It has been used in another project too. } void RShaderComponent::disableShader() const { GLCall(glUseProgram(0)); } Pardon the GLCall() macro. It's just a pre-v4 error checking macro.