Exemple #1
0
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();
}