void CRendererGL::render(class IDrawBuffer* buffer) { const IRenderBuffer *renderBuffer = buffer->getRenderBuffer(); /*std::cout << "Render: " << renderBuffer->getNumVertices() << " vertices, " << renderBuffer->getNumIndices() << " indices, " << buffer->getNumRenderBatches() << " batches" << std::endl;*/ const CVertex2D* vertices = renderBuffer->getVertices(); const uint16* indices = renderBuffer->getIndices(); glBindBuffer(GL_ARRAY_BUFFER, g_VBO); glBufferData(GL_ARRAY_BUFFER, renderBuffer->getNumVertices() * sizeof(CVertex2D), vertices, GL_STREAM_DRAW); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, g_IBO); glBufferData(GL_ELEMENT_ARRAY_BUFFER, renderBuffer->getNumIndices() * sizeof(uint16), indices, GL_STREAM_DRAW); glBindVertexArray(g_VAO); //initialize a fresh render state CRenderState state = CRenderState(); updateRenderState(0xFFFFFFFF, state); for ( uint32 i=0; i<buffer->getNumRenderBatches(); ++i ) { const CRenderBatch* batch = buffer->getRenderBatches() + i; const CRenderState& newState = batch->getRenderState(); uint32 changeFlags = newState.getStateChangeFlags(state); if ( changeFlags != ERenderStateChangeFlags::RSTATECHANGE_NONE ) { updateRenderState(changeFlags, newState); } renderBatch(batch); state = batch->getRenderState(); } glBindVertexArray(0); }
void OpenGL3DRenderer::renderFrame() { // Enable Z buffer for 3d z-order effecrt glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LEQUAL); // Depth function set to less or equal // Clear Z buffer buffer glClearDepth(1.0); glClear(GL_DEPTH_BUFFER_BIT); // Enable alpha blend for transparency effect glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); _default3DProgram->use(); if (_triangles3DBatch.sizeInBytes() > 0) renderBatch(GL_TRIANGLES, _triangles3DBatch); _default3DProgram->disable(); _default3DProgramSetup->tearDown(); }