void FoveatedRenderingApp::DefaultRender(izanagi::graph::CGraphicsDevice* device) { izanagi::sample::CSampleCamera& camera = GetCamera(); device->SetTexture(0, m_Img->GetTexture(m_Idx)); device->SetTexture(1, m_mask); auto shd = m_shdDrawCube.m_shd; device->SetShaderProgram(shd); auto hL2W = shd->GetHandleByName("g_mL2W"); shd->SetMatrix(device, hL2W, m_L2W); auto mtxW2C = camera.GetParam().mtxW2C; auto hW2C = shd->GetHandleByName("g_mW2C"); shd->SetMatrix(device, hW2C, mtxW2C); auto hEye = shd->GetHandleByName("g_vEye"); shd->SetVector(device, hEye, camera.GetParam().pos); auto hInvScr = shd->GetHandleByName("invScreen"); izanagi::math::CVector4 invScr(1.0f / SCREEN_WIDTH, 1.0f / SCREEN_HEIGHT, 0, 0); shd->SetVector(device, hInvScr, invScr); auto hCanFoveated = shd->GetHandleByName("canFoveated"); shd->SetBool(device, hCanFoveated, false); m_Cube->Render(device); }
void UpscaleGeometryRenderingApp::renderFinalPass(izanagi::graph::CGraphicsDevice* device) { device->SaveRenderState(); device->SetRenderState( izanagi::graph::E_GRAPH_RS_ZENABLE, IZ_FALSE); device->SetRenderState( izanagi::graph::E_GRAPH_RS_ZWRITEENABLE, IZ_FALSE); auto width = device->GetBackBufferWidth(); auto height = device->GetBackBufferHeight(); auto* shd = m_shdFinalPass.m_program; device->SetShaderProgram(shd); auto hInvScr = shd->GetHandleByName("invScreen"); izanagi::math::CVector4 invScr(1.0f / width, 1.0f / height, 0.0f, 1.0f); shd->SetVector(device, hInvScr, invScr); m_gbuffer.bindForFinalPass(device); m_screenFillPlane->Draw(device); device->LoadRenderState(); }
void FoveatedRenderingApp::FoveatedRender(izanagi::graph::CGraphicsDevice* device) { izanagi::sample::CSampleCamera& camera = GetCamera(); device->BeginScene( &m_mask, 1, izanagi::graph::E_GRAPH_CLEAR_FLAG_ALL); { // For rendering full screen quad without vertex buffer. device->SetRenderState( izanagi::graph::E_GRAPH_RS_CULLMODE, izanagi::graph::E_GRAPH_CULL_NONE); auto shd = m_shdMakeMask.m_shd; device->SetShaderProgram(shd); auto hInvScr = shd->GetHandleByName("invScreen"); izanagi::math::CVector4 invScr(1.0f / SCREEN_WIDTH, 1.0f / SCREEN_HEIGHT, 0, 0); shd->SetVector(device, hInvScr, invScr); auto hCenter = shd->GetHandleByName("center"); izanagi::math::CVector4 center(SCREEN_WIDTH * 0.5f, SCREEN_HEIGHT * 0.5f, 0, 0); shd->SetVector(device, hCenter, center); CALL_GL_API(glDrawArrays(GL_TRIANGLE_STRIP, 0, 4)); } device->EndScene(); device->BeginScene( &m_rt, 1, m_depth, izanagi::graph::E_GRAPH_CLEAR_FLAG_ALL); { device->SetTexture(0, m_Img->GetTexture(m_Idx)); device->SetTexture(1, m_mask); auto shd = m_shdDrawCube.m_shd; device->SetShaderProgram(shd); auto hL2W = shd->GetHandleByName("g_mL2W"); shd->SetMatrix(device, hL2W, m_L2W); auto mtxW2C = camera.GetParam().mtxW2C; auto hW2C = shd->GetHandleByName("g_mW2C"); shd->SetMatrix(device, hW2C, mtxW2C); auto hEye = shd->GetHandleByName("g_vEye"); shd->SetVector(device, hEye, camera.GetParam().pos); auto hInvScr = shd->GetHandleByName("invScreen"); izanagi::math::CVector4 invScr(1.0f / SCREEN_WIDTH, 1.0f / SCREEN_HEIGHT, 0, 0); shd->SetVector(device, hInvScr, invScr); auto hCanFoveated = shd->GetHandleByName("canFoveated"); shd->SetBool(device, hCanFoveated, true); m_Cube->Render(device); } device->EndScene(); device->SetRenderState( izanagi::graph::E_GRAPH_RS_ZWRITEENABLE, IZ_FALSE); device->SetRenderState( izanagi::graph::E_GRAPH_RS_ZENABLE, IZ_FALSE); { auto shd = m_shdFilter.m_shd; device->SetShaderProgram(shd); m_rt->SetFilter( izanagi::graph::E_GRAPH_TEX_FILTER_POINT, izanagi::graph::E_GRAPH_TEX_FILTER_POINT, izanagi::graph::E_GRAPH_TEX_FILTER_NONE); m_rt->SetAddress( izanagi::graph::E_GRAPH_TEX_ADDRESS_CLAMP, izanagi::graph::E_GRAPH_TEX_ADDRESS_CLAMP); device->SetTexture(0, m_rt); auto hTex0 = shd->GetHandleByName("s0"); CALL_GL_API(glUniform1i(hTex0, 0)); device->SetTexture(1, m_mask); auto hTex1 = shd->GetHandleByName("s1"); CALL_GL_API(glUniform1i(hTex1, 1)); auto hInvScr = shd->GetHandleByName("invScreen"); izanagi::math::CVector4 invScr(1.0f / SCREEN_WIDTH, 1.0f / SCREEN_HEIGHT, 0, 0); shd->SetVector(device, hInvScr, invScr); CALL_GL_API(glDrawArrays(GL_TRIANGLE_STRIP, 0, 4)); } }