Пример #1
0
void gfx::GraphicsEngine::Render( RenderQueue* drawQueue ){
	m_Camera.CalculateViewProjection();
	glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT );
	TextureHandle target = drawQueue->GetTargetTexture();
	m_FrameBuffer.SetTexture(target);
	RenderToTexture(drawQueue);
	RenderActiveTarget();
	RenderGeometry(drawQueue);
	RenderGizmos(drawQueue);
	RenderSprites(drawQueue);
	RenderLines(drawQueue);
	glUseProgram(0);
}
Пример #2
0
static void RenderSceneGBuffer()
{
	// Setup GBuffer pass //
	// Enables ZTest, ZWrites, and disables culling //
	float farClip = g_globalCam.GetFarClip();

	g_pShaderInterface->BindShader( g_gbufferShader );
	g_pShaderInterface->SetFloat( "g_farPlane", &farClip, 1 );

	// Bind GBuffer //
	// There is a known ATi/OpenGL bug in which bound color target clears take n * clear (n = number of targets)
	// time, which is ridiculously long. Therefore we will just clear the depth buffer before they are bound
	g_pTexInterface->BindRenderTarget(&g_normalDepthColor, 1, g_offscreenDepth);
	glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);


	// Render cornell box and enclosed boxes to GBuffer //
	RenderGeometry();

	g_pShaderInterface->UnbindShader();

	int def = DEFAULT_HANDLE;
	g_pTexInterface->BindRenderTarget(&def, 1, DEFAULT_HANDLE);
}
Пример #3
0
void Shadows::RenderScene()
{
	unsigned int i;

	glDepthFunc(GL_LESS);

	switch (eDisplayMode)
	{
	default:
	//case E_NO_SHADOWS:
	//	RenderGeometry(uiProgram[E_DIFFUSE]);
	//	break;
	//case E_SHADOW_VOLUMES:
	//	RenderGeometry(uiProgram[E_DIFFUSE]);
	//	for (i = 0; i < iNumLights; i++)
	//	{
	//		glEnable(GL_LIGHT0 + i);
	//		glLightfv(GL_LIGHT0 + i, GL_POSITION, light[i].fPos);
	//	}
	//	ShowShadowVolume();
	//	break;
	case E_SHADOW_VOLUMES:
	case E_SHADOWS:
		for (i = 0; i < iNumLights; i++)
		{
			glEnable(GL_LIGHT0 + i);
			glLightfv(GL_LIGHT0 + i, GL_POSITION, light[i].fPos);
		}
		/* First, render all geometry with color and depth write enabled */
		RenderGeometry(uiProgram[E_DIFFUSE]);


		/* Then, render the shadow volumes with color and depth write 
		   disabled. Use the Z-fail approach */
		for (i = 0; i < iNumLights; i++)
		{
			RenderShadowVolumes(i);

			/* Finally, render again all the geometry setting a uniform
			   transparency factor affecting only non-zero stencil pixels
			   (areas in shadow) */
			glDepthFunc(GL_EQUAL);

			// Enable Stencil Test
			glEnable(GL_STENCIL_TEST);

			// update the color only where the stencil value is 0
			glStencilFunc(GL_NOTEQUAL, 0, ~0);
			
			glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);

			glEnable(GL_BLEND);

			glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
			//RenderGeometry(uiProgram[E_DIFFUSE]);
			RenderGeometry(uiProgram[E_SHADOW]);

			glDisable(GL_STENCIL_TEST);
			glDisable(GL_BLEND);
			glDepthFunc(GL_LESS);
		}
		break;

	/* 
	  E_STENCIL is a debug mode used to render visually the values in the
	  stencil buffer.
	  Start with same approach as normal stencil rendering, then render 
	  multiple passes corresponding to different values in the stencil buffer.
	*/
	case E_STENCIL:
		for (i = 0; i < iNumLights; i++)
		{
			glEnable(GL_LIGHT0 + i);
			glLightfv(GL_LIGHT0 + i, GL_POSITION, light[i].fPos);
		}

		RenderGeometry(uiProgram[E_DIFFUSE]);

		for (i = 0; i < iNumLights; i++)
		{
			RenderShadowVolumes(i);

			// re-draw the model with the light enabled only where
			// it has previously been drawn
			glDisable(GL_DEPTH_TEST);

			// update the color only where the stencil value is 0
			glEnable(GL_STENCIL_TEST);

			glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);		
			glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);

			glEnable(GL_BLEND);

			glDisable(GL_CULL_FACE);
			glUseProgram(uiProgram[E_PLANE]);
			for (unsigned int j = 1; j < 5; j++)
			{
				glStencilFunc(GL_EQUAL, j, ~0);

				RenderPlane(uiProgram[E_PLANE], Colors + (j-1) * 4);
			}
			glStencilFunc(GL_GEQUAL, 5, ~0);
			RenderPlane(uiProgram[E_PLANE], Colors + 16 * 4);

			glDisable(GL_STENCIL_TEST);
			glEnable(GL_CULL_FACE);
			glDisable(GL_BLEND);
			glEnable(GL_DEPTH_TEST);
		}
		break;
	}
}
Пример #4
0
void RenderScene()
{
    g_globalCam.Update();

	// Clear Depth and color buffers //
	glClearColor(0, 0, 0, 0);
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);


	

	// Enabled texturing and depth testing //
	glEnable(GL_TEXTURE_2D);				// Enable Texturing
	glEnable(GL_DEPTH_TEST);				// Enable Depth tests
	glDepthFunc(GL_LEQUAL);					// LESSEQUAL depth test

	glEnable( GL_CULL_FACE );
	glCullFace( GL_BACK );
	glFrontFace( GL_CCW );

	// Do a depth only pass //
	int rtColor = (g_bMSAA) ? g_msaaColor : DEFAULT_HANDLE;
	int rtDepth = (g_bMSAA) ? g_msaaDepth : DEFAULT_HANDLE;
	g_pTexInterface->BindRenderTarget(&rtColor, 1, rtDepth);
	glColorMask(0, 0, 0, 0);
	if(g_bMSAA)
		glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	RenderGeometry( );
	int def = DEFAULT_HANDLE;

	glColorMask(1, 1, 1, 1);
	// Render the gbuffer to non-msaa targets //
	RenderSceneGBuffer();
	RenderLightBuffer();


	rtColor = (g_bMSAA) ? g_msaaColor : DEFAULT_HANDLE;
	rtDepth = (g_bMSAA) ? g_msaaDepth : DEFAULT_HANDLE;
	g_pTexInterface->BindRenderTarget(&rtColor, 1, rtDepth);

	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

	rtColor = (g_bMSAA) ? g_normalDepthColor : g_lightBuffer;

	vec2 viewDims = {(float)GetScreenWidth(), (float)GetScreenHeight()};
	g_pShaderInterface->BindShader( g_compositeShader );
	g_pShaderInterface->SetFloat( "g_viewDims", viewDims, 2 );
	g_pShaderInterface->SetStateMatrix( "g_matWorldViewProj", MATRIX_MODELVIEW | MATRIX_PROJECTION );
	g_pShaderInterface->SetTexture( "g_lightBuffer", rtColor );
	g_pShaderInterface->SetTexture("g_diffuseTexture", g_groundTexture);

	int textured = 1;
	g_pShaderInterface->SetInt( "g_bIsTextured", &textured, 0 );

	glDepthFunc(GL_LEQUAL);
	RenderGeometry();

	g_pShaderInterface->UnbindShader();
	

	if(g_bMSAA)
	{
		g_pTexInterface->BindTexture(g_lightBuffer);
		RenderTexturedFullscreenQuad();

		// Rebind default backbuffer //
		g_pTexInterface->ResolveMSAATarget(g_resolveTexture);
		g_pTexInterface->BindRenderTarget(&def, 1, DEFAULT_HANDLE);

		glDisable(GL_DEPTH_TEST);
		g_pTexInterface->BindTexture(g_resolveTexture);        // resolve tex
		RenderTexturedFullscreenQuad();
	}


	g_pTexInterface->EvictTextures();

#ifdef RENDER_DEBUG
	glDepthFunc(GL_ALWAYS);
	renderDebug();
	glDepthFunc(GL_LEQUAL);
#endif

	glFlush();
}