예제 #1
0
void BaseApp::BlurHDR()
{
	glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, g_frameBuffer);
	glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, g_texHDR.GetID(), 0);
	glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, g_depthRenderBufferHDR);

	glViewport(0, 0, m_width / 1, m_height / 1);
	glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
	glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

	glBindTexture(GL_TEXTURE_2D, g_texFP16.GetID());
	m_shdHDR->enable();
	RenderScreenCoveringQuad();
	m_shdHDR->disable();

	glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, g_renderBufferBlurdHDR);
	glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, g_texHBluredHDR.GetID(), 0);
			
	glViewport(0, 0, m_width / 4, m_height / 4);

	m_shdBlur->enable();

	g_texHDR.Activate(0);
	m_shdBlur->sendUniform2f("blur_offset",  blurOffset, 0.0f);
	RenderScreenCoveringQuad();
	g_texHDR.Deactivate();

	glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, g_texVBluredHDR.GetID(), 0);

	g_texHBluredHDR.Activate(0);
	m_shdBlur->sendUniform2f("blur_offset", blurOffset/2.0f, 0.0f);
	RenderScreenCoveringQuad();
	g_texHBluredHDR.Deactivate();



	glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, g_texHBluredHDR.GetID(), 0);

	g_texVBluredHDR.Activate(0);
	m_shdBlur->sendUniform2f("blur_offset", 0.0f, blurOffset);
	RenderScreenCoveringQuad();
	g_texVBluredHDR.Deactivate();

	glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, g_texVBluredHDR.GetID(), 0);
	
	g_texHBluredHDR.Activate(0);
	m_shdBlur->sendUniform2f("blur_offset", 0.0f, blurOffset/2.0f);
	RenderScreenCoveringQuad();
	g_texHBluredHDR.Deactivate();


	m_shdBlur->disable();


	glBindFramebufferEXT( GL_FRAMEBUFFER_EXT, 0 );
	glViewport(0, 0, m_width, m_height);
}
예제 #2
0
void
TileBatch::Flush (const Texture& texture)
{
    // Sanity check the same VBO is bound throughout the draw call
    RDGE_ASSERT(m_vbo == static_cast<uint32>(opengl::GetInt(GL_ARRAY_BUFFER_BINDING)));

    opengl::ReleaseBufferPointer(GL_ARRAY_BUFFER);
    opengl::UnbindBuffers(GL_ARRAY_BUFFER);

    if (m_submissions > 0)
    {
        texture.Activate();
        this->blend.Apply();

        opengl::BindVertexArray(m_vao);
        opengl::BindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_ibo);

        opengl::DrawElements(GL_TRIANGLES, static_cast<uint32>(m_submissions * 6), GL_UNSIGNED_INT, nullptr);

        opengl::UnbindBuffers(GL_ELEMENT_ARRAY_BUFFER);
        opengl::UnbindVertexArrays();
    }
}
예제 #3
0
void BaseApp::RenderFrame()
{	
	m_fpsCounter.MarkFrameStart();

	POINT mousePos;
	GetCursorPos(&mousePos);

	m_mouseX = mousePos.x - m_winPosX;
	m_mouseY = mousePos.y - m_winPosY;

	if(lockMouse)
	{
		m_camera.SetViewByMouse( float(m_mouseLockedX - m_mouseX) * 0.2f , float(m_mouseLockedY - m_mouseY) * 0.2f);	
		CenterMouse();
	}

	float height = g_heightMap->GetInterpolatedHeight(m_camera.m_vEye.x, m_camera.m_vEye.z);

	//if( m_camera.m_vEye.y <= height + 2.0f )
	{
		float oldY = m_camera.m_vEye.y;
		m_camera.m_vEye.y = height + 12.0f;
		float newY = m_camera.m_vEye.y;
		m_camera.m_vCenter.y += newY - oldY;
	}

	glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, g_frameBuffer);
	glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, g_texFP16.GetID(), 0);
	glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, g_renderBuffer[0]);

	glClearColor(0.8f, 1.0f, 0.8f, 1.0f);
	glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);	

	m_camera.BuildViewMatrix(&modelViewMat);
	glLoadMatrixf(modelViewMat);


	if(!m_freezeFrustum)
		frustum.ComputeFrustum(projMat, modelViewMat);

	glPushMatrix();
	glTranslatef(m_camera.m_vEye.x, m_camera.m_vEye.y, m_camera.m_vEye.z);
	glDepthMask(GL_FALSE);
	m_shdSky->enable();
	m_shdSky->sendUniform3f("color1", 2.0f, 2.0f, 2.0f);
	m_shdSky->sendUniform3f("color2", 0.5f, 0.7f, 2.0f);
	m_skydome.Render();
	m_shdSky->disable();
	//glDepthMask(GL_TRUE);
	glPopMatrix();




	Vec3 sunPos = m_sunPos * 500.0f;
	glPopMatrix();
	glPushMatrix();
	glTranslatef(m_camera.m_vEye.x + sunPos.x, m_camera.m_vEye.y + sunPos.y, m_camera.m_vEye.z + sunPos.z);
	m_texSun.Activate(0);
	m_shdSimpleColor->enable();
	m_shdSimpleColor->sendUniform3f("color", 4.0f, 4.0f, 2.0f);
	glEnable(GL_BLEND );
	glBlendFunc(GL_SRC_COLOR, GL_ONE);
	RenderSprite(2000, &m_camera.m_vEye, modelViewMat);
	glDisable(GL_BLEND );
	m_shdSimpleColor->disable();
	m_texSun.Deactivate();


glDepthMask(GL_TRUE);
	glPopMatrix();



	g_quadtree->Render(frustum, m_camera.m_vEye);
/*
	glAlphaFunc(GL_GREATER,0.5f);
	glEnable(GL_ALPHA_TEST);
	Mat4 tmp;

	tmp.Identity();
	tmp.Translate(Vec3(0.0f, g_heightMap->GetInterpolatedHeight(0.0f, 0.0f), 0.0f));
	model.render(tmp, &frustum);

	tmp.Identity();
	tmp.Translate(Vec3(50.0f, g_heightMap->GetInterpolatedHeight(50.0f, 0.0f), 0.0f));
	model.render(tmp, &frustum);

	tmp.Identity();
	tmp.Translate(Vec3(0.0f, g_heightMap->GetInterpolatedHeight(0.0f, 100.0f), 100.0f));
	model.render(tmp, &frustum);

	tmp.Identity();
	tmp.Translate(Vec3(-50.0f, g_heightMap->GetInterpolatedHeight(-50.0f, -200.0f), -200.0f));
	model.render(tmp, &frustum);

	glDisable(GL_ALPHA_TEST);

*/

	RenderWaterReflection();

	glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, g_texFP16.GetID(), 0);
	glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, g_renderBuffer[0]);


	g_texFP162.Bind(0);
	glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0,0, 0, m_width, m_height);



	RenderWater();
	RenderWaterSpecular();

	


		RenderUnderwaterNormalMap();

	glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);

	// No wireframe
	glPushAttrib(GL_POLYGON_BIT);				
	glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);


	glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);	

	if(m_camera.m_vEye.y < 0)
	{

		m_shdUnderwater->enable();
		m_shdUnderwater->sendUniform1i("g_texViewport", 0);
		m_shdUnderwater->sendUniform1i("g_texNormalMap", 1);
		LARGE_INTEGER time;
		QueryPerformanceCounter(&time);
		m_shdUnderwater->sendUniform1f("g_waterTranslation", float(time.QuadPart) * 0.000000008f);
		g_texWaterReflect.Bind(1);
	}

	g_texFP16.Activate(0);
	RenderScreenCoveringQuad();
	g_texFP16.Deactivate();
/*
	g_texWaterReflect.Activate(0);
	RenderScreenCoveringQuad();
	g_texWaterReflect.Deactivate();
*/
	if(m_camera.m_vEye.y < 0)
	{
		m_shdUnderwater->disable();
	}

	BlurHDR();

	glEnable(GL_BLEND);
	glBlendFunc(GL_ONE, GL_ONE);
	g_texVBluredHDR.Activate(0);
	RenderScreenCoveringQuad();
	g_texVBluredHDR.Deactivate();
	glDisable(GL_BLEND);

	m_pGui->SetViewportDim(m_width, m_height);

	m_pGui->Render(m_mouseX, m_mouseY, this->m_mouseButton);

	m_pFont->Enable(m_width, m_height);
	m_pFont->SetAlignment(FONT_HORIZ_ALIGN_RIGHT, FONT_VERT_ALIGN_TOP);
	m_pFont->Print(m_width - 10, 10, "FPS: %d", (int)m_fpsCounter.GetFPS() );
	m_pFont->Print(m_width - 10, 30, "Camera eye: %f, %f, %f", m_camera.m_vEye.x, m_camera.m_vEye.y, m_camera.m_vEye.z);	
	m_pFont->Print(m_width - 10, 50, "Camera center: %f, %f, %f", m_camera.m_vCenter.x, m_camera.m_vCenter.y, m_camera.m_vCenter.z);	
	m_pFont->Print(m_width - 10, 70, "Triangles rendered: %d", g_quadtree->GetNumTrisLastRendered());	
	m_pFont->Print(m_width - 10, 90, "VBOs data size: %d bytes", g_quadtree->m_vboDataSize);
	//m_pFont->Print(m_width - 10, 110, "Mouse coords: (%d, %d)", m_mouseX, m_mouseY);	
	m_pFont->Disable();
/*
	RenderTexDebug(3, 3, 2, g_texVBluredHDR.GetID(), "Blured HDR");
	RenderTexDebug(2, 3, 2, g_texHDR.GetID(), "HDR");
	RenderTexDebug(1, 3, 2, g_texFP16.GetID(), "Water refraction");
	RenderTexDebug(0, 3, 2, g_texWaterReflect.GetID(), "Water reflection");
*/
	glPopAttrib();

	SwapBuffers(m_hDC);

	m_fpsCounter.MarkFrameEnd();
}