Ejemplo n.º 1
0
	void VORApp::Display()
	{
#ifdef TEST
		_cpuTimer->Start();
		_gpuTimer->Start();
#endif
		_mirrorTransforms[0] *= IGLUMatrix4x4::Rotate(10,vec3(0,1,0));
		// Start timing this frame draw
		_frameRate->StartFrame();
		// Clear the screen
		glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
		
		
		size_t frustumSize = 0;
		size_t size = VirtualFrustumsCulling(frustumSize);

#ifdef TEST
		_cpuTimer->Tick();
		_gpuTimer->Tick();
		printf("VirtualFrustums Culling gpu: %lf cpu: %lf \n", _gpuTimer->Tick(), _cpuTimer->Tick());
#endif

		//size_t size = CPUVirtualFrustumsCulling(frustumSize);
		//draw stencil
		{
			_mirrorStencilFBO->Bind();
			_mirrorStencilFBO->Clear();
			_shaders[3]->Enable();
			_shaders[3]["project"]         = _camera->GetProjectionMatrix();
			_shaders[3]["model"]           = _mirrorTransforms[0];
			_shaders[3]["view"]            = _camera->GetViewMatrix();
			_mirrorObjs[0]->GetVertexArray()->Bind();
			_mirrorElementBuffer->Bind();
			//_mirrorObjs[0]->GetVertexArray()->GetElementArray()->Bind();
			glDrawElements(GL_TRIANGLES,frustumSize*3,GL_UNSIGNED_INT,0);
			//_mirrorObjs[0]->GetVertexArray()->GetElementArray()->Unbind();
			_mirrorElementBuffer->Unbind();
			_mirrorObjs[0]->GetVertexArray()->Unbind();
			_shaders[3]->Disable();
			_mirrorStencilFBO->Unbind();
		/*	IGLUDraw::Fullscreen( _mirrorStencilFBO[IGLU_COLOR0], 0 );
			return;		*/
		}
	
		_mirrorFBO->Bind();
		_mirrorFBO->Clear();
		glEnable(GL_DEPTH_TEST);	
		glEnable(GL_CULL_FACE);
		for(int i=0; i<_objReaders.size(); i++)
		{
			_shaders[2]->Enable();
			_shaders[2]["project"] = _camera->GetProjectionMatrix();	
			_shaders[2]["view"] = _camera->GetViewMatrix();
			_shaders[2]["model"]  = _objTransforms[i];
			_shaders[2]["mirrorModel"] = _mirrorTransforms[0];
			_shaders[2]["InstanceData"] = _instanceDataTex;
			_shaders[2]["lightIntensity" ] = float(1);
			_shaders[2]["matlInfoTex"]     = IGLUOBJMaterialReader::s_matlCoefBuf;
			_shaders[2]["matlTextures"]    = IGLUOBJMaterialReader::s_matlTexArray;
			_shaders[2]["lightColor"] = vec3(1.0);	
			_shaders[2]["resX"] = _camera->GetResX();
			_shaders[2]["resY"] = _camera->GetResY();
			_shaders[2]["stencilTexture"] = _mirrorStencilFBO[0];
			IGLUVertexArray::Ptr vao = _objReaders[i]->GetVertexArray();
			vao->Bind();			
			vao->GetElementArray()->Bind();			
			_indirectDrawBuffer->Bind();
			glMultiDrawElementsIndirect(	GL_TRIANGLES, 	GL_UNSIGNED_INT, 	NULL, 	size, 	0);
			_indirectDrawBuffer->Unbind();
			vao->GetElementArray()->Unbind();
			vao->Unbind();			
			_shaders[2]->Disable();			
		}
		_mirrorFBO->Unbind();
	/*	IGLUDraw::Fullscreen( _mirrorFBO[IGLU_COLOR0], 0 );
		return;*/
		_mirrorTexShader->Enable();
		_mirrorTexShader["project"]         = _camera->GetProjectionMatrix();
		_mirrorTexShader["modelview"]            = _camera->GetViewMatrix() *_mirrorTransforms[0];		
		_mirrorTexShader["mtexture"] = _mirrorFBO[0];

		_mirrorObjs[0]->GetVertexArray()->Bind();
		_mirrorElementBuffer->Bind();		
		glDrawElements(GL_TRIANGLES,frustumSize*3,GL_UNSIGNED_INT,0);		
		_mirrorElementBuffer->Unbind();
		_mirrorObjs[0]->GetVertexArray()->Unbind();

		_mirrorTexShader->Disable();

		for(int i=0; i<_objReaders.size(); i++)
		{
			_objShader->Enable();
			_objShader["project"]         = _camera->GetProjectionMatrix();
			_objShader["model"]           = _objTransforms[i];
			_objShader["view"]            = _camera->GetViewMatrix();
			_objShader["lightIntensity" ] = float(1);
			_objShader["matlInfoTex"]     = IGLUOBJMaterialReader::s_matlCoefBuf;
			_objShader["matlTextures"]    = IGLUOBJMaterialReader::s_matlTexArray;			
			_objShader["lightColor"] = _lightColor;
			_objReaders[i]->GetVertexArray()->Bind();
			_objReaders[i]->GetVertexArray()->GetElementArray()->Bind();
			glDrawElements(GL_TRIANGLES,_objReaders[i]->GetTriangleCount()*3,GL_UNSIGNED_INT,0);
			_objReaders[i]->GetVertexArray()->GetElementArray()->Unbind();
			_objReaders[i]->GetVertexArray()->Unbind();
			_objShader->Disable();
		}
		// Draw the framerate on the screen
		char buf[32];
		sprintf( buf, "%.1f fps", _frameRate->EndFrame() );
		IGLUDraw::DrawText( IGLU_FONT_VARIABLE, 0, 0, buf );
	}