From 59d9757177efb84b174fb729202091c721930616 Mon Sep 17 00:00:00 2001 From: SkyLoader Date: Sat, 10 Nov 2018 00:18:10 +0300 Subject: [PATCH] OpenGL: Fixed some blenders. And black fog is better than yellow I think :D --- src/Layers/xrRender/dxEnvironmentRender.h | 3 +++ src/Layers/xrRenderPC_GL/blender_combine.cpp | 12 +++++++---- .../xrRenderPC_GL/blender_deffer_flat.cpp | 8 ++++---- .../xrRenderPC_GL/blender_deffer_model.cpp | 8 ++++---- .../gl_rendertarget_phase_combine.cpp | 20 ++++++++++++++++++- 5 files changed, 38 insertions(+), 13 deletions(-) diff --git a/src/Layers/xrRender/dxEnvironmentRender.h b/src/Layers/xrRender/dxEnvironmentRender.h index 08036c8de05..95784b7163a 100644 --- a/src/Layers/xrRender/dxEnvironmentRender.h +++ b/src/Layers/xrRender/dxEnvironmentRender.h @@ -27,6 +27,9 @@ class CBlender_skybox : public IBlender C.r_Sampler_clf("s_sky0", "$null"); C.r_Sampler_clf("s_sky1", "$null"); C.r_Sampler_rtf("s_tonemap", "$user$tonemap"); //. hack +#ifdef USE_OGL + C.PassSET_ZB(FALSE, FALSE); +#endif // USE_OGL #endif // USE_DX10 C.r_End(); } diff --git a/src/Layers/xrRenderPC_GL/blender_combine.cpp b/src/Layers/xrRenderPC_GL/blender_combine.cpp index ccb22dd2ad7..07597117498 100644 --- a/src/Layers/xrRenderPC_GL/blender_combine.cpp +++ b/src/Layers/xrRenderPC_GL/blender_combine.cpp @@ -28,6 +28,8 @@ void CBlender_combine::Compile(CBlender_Compile& C) C.r_Sampler_clf("env_s1", r2_T_envs1); C.r_Sampler_clf("sky_s0", r2_T_sky0); C.r_Sampler_clf("sky_s1", r2_T_sky1); + C.r_Sampler_rtf("s_occ", r2_RT_ssao_temp); + C.r_Sampler_rtf("s_half_depth", r2_RT_half_depth); jitter(C); @@ -107,6 +109,8 @@ void CBlender_combine_msaa::Compile(CBlender_Compile& C) C.r_Sampler_clf("env_s1", r2_T_envs1); C.r_Sampler_clf("sky_s0", r2_T_sky0); C.r_Sampler_clf("sky_s1", r2_T_sky1); + C.r_Sampler_rtf("s_occ", r2_RT_ssao_temp); + C.r_Sampler_rtf("s_half_depth", r2_RT_half_depth); jitter(C); @@ -118,7 +122,7 @@ void CBlender_combine_msaa::Compile(CBlender_Compile& C) C.r_Sampler_rtf("s_normal", r2_RT_N); C.r_Sampler_clf("s_image", r2_RT_generic0); C.r_Sampler_clf("s_bloom", r2_RT_bloom1); - C.r_Sampler_clf("s_distort", r2_RT_generic1); + C.r_Sampler_clf("s_distort", r2_RT_generic1_r); C.r_End(); break; case 2: // non-AA @@ -128,7 +132,7 @@ void CBlender_combine_msaa::Compile(CBlender_Compile& C) C.r_Sampler_rtf("s_normal", r2_RT_N); C.r_Sampler_clf("s_image", r2_RT_generic0); C.r_Sampler_clf("s_bloom", r2_RT_bloom1); - C.r_Sampler_clf("s_distort", r2_RT_generic1); + C.r_Sampler_clf("s_distort", r2_RT_generic1_r); C.r_End(); break; case 3: // aa-edge-detection + AA :) + DISTORTION @@ -137,7 +141,7 @@ void CBlender_combine_msaa::Compile(CBlender_Compile& C) C.r_Sampler_rtf("s_normal", r2_RT_N); C.r_Sampler_clf("s_image", r2_RT_generic0); C.r_Sampler_clf("s_bloom", r2_RT_bloom1); - C.r_Sampler_clf("s_distort", r2_RT_generic1); + C.r_Sampler_clf("s_distort", r2_RT_generic1_r); C.r_End(); break; case 4: // non-AA + DISTORTION @@ -147,7 +151,7 @@ void CBlender_combine_msaa::Compile(CBlender_Compile& C) C.r_Sampler_rtf("s_normal", r2_RT_N); C.r_Sampler_clf("s_image", r2_RT_generic0); C.r_Sampler_clf("s_bloom", r2_RT_bloom1); - C.r_Sampler_clf("s_distort", r2_RT_generic1); + C.r_Sampler_clf("s_distort", r2_RT_generic1_r); C.r_End(); break; case 5: // post-processing diff --git a/src/Layers/xrRenderPC_GL/blender_deffer_flat.cpp b/src/Layers/xrRenderPC_GL/blender_deffer_flat.cpp index 89f3d7afac2..decabbe2ffb 100644 --- a/src/Layers/xrRenderPC_GL/blender_deffer_flat.cpp +++ b/src/Layers/xrRenderPC_GL/blender_deffer_flat.cpp @@ -21,16 +21,16 @@ void CBlender_deffer_flat::Save(IWriter& fs) xrPWRITE_PROP (fs,"Tessellation", xrPID_TOKEN, oTessellation); I.ID = 0; xr_strcpy(I.str, "NO_TESS"); - fs.w(&I, sizeof I); + fs.w(&I, sizeof(I)); I.ID = 1; xr_strcpy(I.str, "TESS_PN"); - fs.w(&I, sizeof I); + fs.w(&I, sizeof(I)); I.ID = 2; xr_strcpy(I.str, "TESS_HM"); - fs.w(&I, sizeof I); + fs.w(&I, sizeof(I)); I.ID = 3; xr_strcpy(I.str, "TESS_PN+HM"); - fs.w(&I, sizeof I); + fs.w(&I, sizeof(I)); } void CBlender_deffer_flat::Load(IReader& fs, u16 version) diff --git a/src/Layers/xrRenderPC_GL/blender_deffer_model.cpp b/src/Layers/xrRenderPC_GL/blender_deffer_model.cpp index 020f0fc0059..3fb5f4b93b2 100644 --- a/src/Layers/xrRenderPC_GL/blender_deffer_model.cpp +++ b/src/Layers/xrRenderPC_GL/blender_deffer_model.cpp @@ -27,16 +27,16 @@ void CBlender_deffer_model::Save(IWriter& fs) xrPWRITE_PROP (fs,"Tessellation", xrPID_TOKEN, oTessellation); I.ID = 0; xr_strcpy(I.str, "NO_TESS"); - fs.w(&I, sizeof I); + fs.w(&I, sizeof(I)); I.ID = 1; xr_strcpy(I.str, "TESS_PN"); - fs.w(&I, sizeof I); + fs.w(&I, sizeof(I)); I.ID = 2; xr_strcpy(I.str, "TESS_HM"); - fs.w(&I, sizeof I); + fs.w(&I, sizeof(I)); I.ID = 3; xr_strcpy(I.str, "TESS_PN+HM"); - fs.w(&I, sizeof I); + fs.w(&I, sizeof(I)); } void CBlender_deffer_model::Load(IReader& fs, u16 version) diff --git a/src/Layers/xrRenderPC_GL/gl_rendertarget_phase_combine.cpp b/src/Layers/xrRenderPC_GL/gl_rendertarget_phase_combine.cpp index fe8863d2640..67c08b47271 100644 --- a/src/Layers/xrRenderPC_GL/gl_rendertarget_phase_combine.cpp +++ b/src/Layers/xrRenderPC_GL/gl_rendertarget_phase_combine.cpp @@ -46,6 +46,20 @@ void CRenderTarget::phase_combine() //*** exposure-pipeline u32 gpu_id = Device.dwFrame % HW.Caps.iGPUNum; + // TODO: Uncomment this and test in the game + /* + if (Device.m_SecondViewport.IsSVPActive()) //--#SM+#-- +SecondVP+ + { + // clang-format off + gpu_id = (Device.dwFrame - 1) % HW.Caps.iGPUNum; // Фикс "мерцания" tonemapping (HDR) после выключения двойного рендера. + // Побочный эффект - при работе двойного рендера скорость изменения tonemapping (HDR) падает в два раза + // Мерцание связано с тем, что HDR для своей работы хранит уменьшенние копии "прошлых кадров" + // Эти кадры относительно похожи друг на друга, однако при включенном двойном рендере + // в половине кадров оказывается картинка из второго рендера, и поскольку она часто может отличатся по цвету\яркости + // то при попытке создания "плавного" перехода между ними получается эффект мерцания + // clang-format on + }*/ + { t_LUM_src->surface_set(GL_TEXTURE_2D, rt_LUM_pool[gpu_id * 2 + 0]->pRT); t_LUM_dest->surface_set(GL_TEXTURE_2D, rt_LUM_pool[gpu_id * 2 + 1]->pRT); @@ -67,12 +81,16 @@ void CRenderTarget::phase_combine() phase_ssao(); } + FLOAT ColorRGBA[4] = {0.0f, 0.0f, 0.0f, 0.0f}; // low/hi RTs if (!RImplementation.o.dx10_msaa) + { + HW.pDevice->ClearRenderTargetView(rt_Generic_0->pRT, ColorRGBA); + HW.pDevice->ClearRenderTargetView(rt_Generic_1->pRT, ColorRGBA); u_setrt(rt_Generic_0, rt_Generic_1, 0, HW.pBaseZB); + } else { - FLOAT ColorRGBA[4] = {0.0f, 0.0f, 0.0f, 0.0f}; HW.pDevice->ClearRenderTargetView(rt_Generic_0_r->pRT, ColorRGBA); HW.pDevice->ClearRenderTargetView(rt_Generic_1_r->pRT, ColorRGBA); u_setrt(rt_Generic_0_r, rt_Generic_1_r, 0, RImplementation.Target->rt_MSAADepth->pZRT);