From 53e4bf16ff34f150d03e210e524810ec201f71ce Mon Sep 17 00:00:00 2001 From: D-AIRY <admin@ds-servers.com> Date: Wed, 29 Apr 2020 22:29:06 +0300 Subject: [PATCH] Updated settings menu; fixed frustum culling for sun; some cleanup --- .../engine/textures/dev/dev_floor_normal.dds | Bin 262271 -> 262271 bytes .../engine/textures/dev/dev_floor_normal.psd | Bin 0 -> 128227 bytes build/gamesource/gui/menu/settings_video.html | 41 +-- .../gui/menu/settings_video_ex.html | 37 ++- source/anim/RenderableVisibility.cpp | 88 +++++- source/anim/RenderableVisibility.h | 12 +- source/common | 2 +- source/light/LightSystem.cpp | 198 ++++++------- source/light/LightSystem.h | 2 +- source/light/light.cpp | 261 ++++++++++++++++-- source/light/light.h | 47 +++- source/light/shadow.cpp | 167 +---------- source/light/shadow.h | 7 +- source/render/RenderableVisibility.cpp | 37 ++- source/render/RenderableVisibility.h | 13 +- source/xcommon/IXRenderable.h | 8 +- 16 files changed, 593 insertions(+), 327 deletions(-) create mode 100644 build/engine/textures/dev/dev_floor_normal.psd diff --git a/build/engine/textures/dev/dev_floor_normal.dds b/build/engine/textures/dev/dev_floor_normal.dds index 939ee60d6e58a9e0167f0c3754b1cecef0d878f5..6090c53fb7822e29f22685425b70a2bd465c72a3 100644 GIT binary patch delta 24073 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 delta 24007 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 diff --git a/build/engine/textures/dev/dev_floor_normal.psd b/build/engine/textures/dev/dev_floor_normal.psd new file mode 100644 index 0000000000000000000000000000000000000000..a32f6e496a8f49da035c3bb7618716c24bb483e4 GIT binary patch literal 128227 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≦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 literal 0 HcmV?d00001 diff --git a/build/gamesource/gui/menu/settings_video.html b/build/gamesource/gui/menu/settings_video.html index aaff1a2b9..1873829d2 100644 --- a/build/gamesource/gui/menu/settings_video.html +++ b/build/gamesource/gui/menu/settings_video.html @@ -9,12 +9,13 @@ <div id="title">Видео</div> <div id="left_menu"> <div class="menu-item">Разрешение</div> - <div class="menu-item">Во весь экран</div> - <div class="menu-item">Сглаживание</div> + <!-- <div class="menu-item">Во весь экран</div> --> + <!-- <div class="menu-item">Сглаживание</div> --> <div class="menu-item">Разрешение текстур</div> - <div class="menu-item">Контраст</div> - <div class="menu-item">Гамма</div> - <div class="menu-item">Яркость</div> + <div class="menu-item">Глобальное освещение</div> + <!-- <div class="menu-item">Контраст</div> --> + <!-- <div class="menu-item">Гамма</div> --> + <!-- <div class="menu-item">Яркость</div> --> <div class="menu-item" onclick="engine_command" args=" gui_load menu_settings_video_ex menu/settings_video_ex.html @@ -29,24 +30,30 @@ <option value="1">1920x1080</option> <option value="0">1366x768</option> </select> - <select class="set_item" cvar="r_win_windowed"> - <option value="0">Да</option> - <option value="1">Нет</option> - </select> - <select class="set_item" cvar="pp_dlaa|pp_nfaa"> - <option value="0|0">Нет</option> - <option value="1|0">DLAA</option> - <option value="0|1">NFAA</option> + <!-- <select class="set_item" cvar="r_win_windowed"> --> + <!-- <option value="0">Да</option> --> + <!-- <option value="1">Нет</option> --> + <!-- </select> --> + <!-- <select class="set_item" cvar="pp_dlaa|pp_nfaa"> --> + <!-- <option value="0|0">Нет</option> --> + <!-- <option value="1|0">DLAA</option> --> + <!-- <option value="0|1">NFAA</option> --> <!-- <option value="1|1">NFAA+DLAA</option> --> - </select> + <!-- </select> --> <select class="set_item" cvar="r_texfilter_max_miplevel"> <option value="0">Высокое</option> <option value="1">Среднее</option> <option value="2">Низкое</option> </select> - <div style="height: 40px; position: relative; top: 10px;"><range class="set_item" min="0" max="1" step="0.01" format="%.2f" cvar="pp_contrast" /></div> - <div style="height: 40px; position: relative; top: 10px;"><range class="set_item" min="0" max="1" step="0.01" format="%.2f" cvar="pp_gamma" /></div> - <div style="height: 40px; position: relative; top: 10px;"><range class="set_item" min="0" max="1" step="0.01" format="%.2f" cvar="pp_bright" /></div> + <select class="set_item" cvar="lpv_cascades_count"> + <option value="0">Нет</option> + <option value="1">Низкое</option> + <option value="2">Среднее</option> + <option value="3">Высокое</option> + </select> + <!-- <div style="height: 40px; position: relative; top: 10px;"><range class="set_item" min="0" max="1" step="0.01" format="%.2f" cvar="pp_contrast" /></div> --> + <!-- <div style="height: 40px; position: relative; top: 10px;"><range class="set_item" min="0" max="1" step="0.01" format="%.2f" cvar="pp_gamma" /></div> --> + <!-- <div style="height: 40px; position: relative; top: 10px;"><range class="set_item" min="0" max="1" step="0.01" format="%.2f" cvar="pp_bright" /></div> --> <div class="menu-item bottom" onclick="settings_commit" style="text-align: right;">Применить</div> </div> diff --git a/build/gamesource/gui/menu/settings_video_ex.html b/build/gamesource/gui/menu/settings_video_ex.html index ded330006..e1e667924 100644 --- a/build/gamesource/gui/menu/settings_video_ex.html +++ b/build/gamesource/gui/menu/settings_video_ex.html @@ -9,13 +9,14 @@ <div id="title">Расширенные</div> <div id="left_menu"> <div class="menu-item">Фильтрация текстур</div> - <div class="menu-item">Эффект bloom</div> - <div class="menu-item">Эффект lensflare</div> - <div class="menu-item">Эффект SSAO</div> + <!-- <div class="menu-item">Эффект bloom</div> --> + <!-- <div class="menu-item">Эффект lensflare</div> --> + <!-- <div class="menu-item">Эффект SSAO</div> --> <div class="menu-item">Глобальные тени</div> - <div class="menu-item">Локальные тени</div> - <div class="menu-item">Размытие теней</div> - <div class="menu-item">Размытие в движении</div> + <div class="menu-item">Точечные тени</div> + <div class="menu-item">Направленные тени</div> + <!-- <div class="menu-item">Размытие теней</div> --> + <!-- <div class="menu-item">Размытие в движении</div> --> <div class="menu-item bottom" onclick="on_cancel">Назад</div> </div> @@ -29,7 +30,7 @@ <option value="2|8">Анизотропная 8X</option> <option value="2|16">Анизотропная 16X</option> </select> - <select class="set_item" cvar="pp_bloom"> + <!-- <select class="set_item" cvar="pp_bloom"> <option value="1">Включить</option> <option value="0">Выключить</option> </select> @@ -40,13 +41,19 @@ <select class="set_item" cvar="pp_ssao"> <option value="1">Включить</option> <option value="0">Выключить</option> + </select> --> + <select class="set_item" cvar="r_pssm_quality"> + <!-- <option value="0|0.500000">Нет</option> --> + <option value="0.500000">Низкое</option> + <option value="1.000000">Среднее</option> + <option value="2.000000">Высокое</option> + <option value="4.000000">Очень высокое</option> </select> - <select class="set_item" cvar="r_pssm_shadowed|r_pssm_quality"> - <option value="0|0.500000">Нет</option> - <option value="1|0.500000">Низкое</option> - <option value="1|1.000000">Среднее</option> - <option value="1|2.000000">Высокое</option> - <option value="1|4.000000">Очень высокое</option> + <select class="set_item" cvar="r_psm_quality"> + <option value="0.500000">Низкое</option> + <option value="1.000000">Среднее</option> + <option value="2.000000">Высокое</option> + <option value="4.000000">Очень высокое</option> </select> <select class="set_item" cvar="r_lsm_quality"> <option value="0.500000">Низкое</option> @@ -54,7 +61,7 @@ <option value="2.000000">Высокое</option> <option value="4.000000">Очень высокое</option> </select> - <select class="set_item" cvar="r_shadow_soft"> + <!-- <select class="set_item" cvar="r_shadow_soft"> <option value="0">Нет</option> <option value="1">1 проход</option> <option value="2">2 прохода</option> @@ -62,7 +69,7 @@ <select class="set_item" cvar="pp_motionblur"> <option value="1">Включить</option> <option value="0">Выключить</option> - </select> + </select> --> <div class="menu-item bottom" onclick="settings_commit" style="text-align: right;">Применить</div> </div> diff --git a/source/anim/RenderableVisibility.cpp b/source/anim/RenderableVisibility.cpp index ca01c54d0..7f15e413e 100644 --- a/source/anim/RenderableVisibility.cpp +++ b/source/anim/RenderableVisibility.cpp @@ -10,7 +10,7 @@ CRenderableVisibility::CRenderableVisibility(ID idPlugin, CAnimatedModelProvider { } -ID CRenderableVisibility::getPluginId() +ID CRenderableVisibility::getPluginId() const { return(m_idPlugin); } @@ -30,7 +30,7 @@ void CRenderableVisibility::updateForFrustum(const IFrustum *pFrustum, const IXR CRenderableVisibility *pRef = NULL; if(pReference) { - assert(((IXRenderableVisibility*)pReference)->getPluginId() == -1); + assert(((IXRenderableVisibility*)pReference)->getPluginId() == getPluginId()); pRef = (CRenderableVisibility*)pReference; } @@ -38,6 +38,90 @@ void CRenderableVisibility::updateForFrustum(const IFrustum *pFrustum, const IXR m_pProviderDynamic->computeVisibility(pFrustum, this, pRef); } +void CRenderableVisibility::append(const IXRenderableVisibility *pOther_) +{ + assert(((IXRenderableVisibility*)pOther_)->getPluginId() == getPluginId()); + const CRenderableVisibility *pOther = (const CRenderableVisibility*)pOther_; + + item_s *pItem; + const item_s *pOtherItem; + for(UINT i = 0, l = pOther->m_aItems.size(); i < l; ++i) + { + pOtherItem = &pOther->m_aItems[i]; + if(pOtherItem->isVisible) + { + pItem = &m_aItems[i]; + if(pItem->isVisible) + { + if(pOtherItem->uLod < pItem->uLod) + { + pItem->uLod = pOtherItem->uLod; + } + } + else + { + pItem->isTransparent = pOtherItem->isTransparent; + pItem->isVisible = true; + pItem->uLod = pOtherItem->uLod; + } + } + } + + for(UINT i = 0, l = pOther->m_aItemsDynamic.size(); i < l; ++i) + { + pOtherItem = &pOther->m_aItemsDynamic[i]; + if(pOtherItem->isVisible) + { + pItem = &m_aItemsDynamic[i]; + if(pItem->isVisible) + { + if(pOtherItem->uLod < pItem->uLod) + { + pItem->uLod = pOtherItem->uLod; + } + } + else + { + pItem->isTransparent = pOtherItem->isTransparent; + pItem->isVisible = true; + pItem->uLod = pOtherItem->uLod; + } + } + } + + //! @todo implement for transparency too! +} + +void CRenderableVisibility::substract(const IXRenderableVisibility *pOther_) +{ + assert(((IXRenderableVisibility*)pOther_)->getPluginId() == getPluginId()); + const CRenderableVisibility *pOther = (const CRenderableVisibility*)pOther_; + + item_s *pItem; + const item_s *pOtherItem; + for(UINT i = 0, l = pOther->m_aItems.size(); i < l; ++i) + { + pOtherItem = &pOther->m_aItems[i]; + pItem = &m_aItems[i]; + if(pItem->isVisible && pOtherItem->isVisible) + { + pItem->isVisible = false; + } + } + + for(UINT i = 0, l = pOther->m_aItemsDynamic.size(); i < l; ++i) + { + pOtherItem = &pOther->m_aItemsDynamic[i]; + pItem = &m_aItemsDynamic[i]; + if(pItem->isVisible && pOtherItem->isVisible) + { + pItem->isVisible = false; + } + } + + //! @todo implement for transparency too! +} + void CRenderableVisibility::setItemCount(UINT uCount) { if(m_aItems.GetAllocSize() > uCount * 2) diff --git a/source/anim/RenderableVisibility.h b/source/anim/RenderableVisibility.h index f890ae178..d0d4112e1 100644 --- a/source/anim/RenderableVisibility.h +++ b/source/anim/RenderableVisibility.h @@ -11,14 +11,18 @@ class CRenderableVisibility: public IXRenderableVisibility public: CRenderableVisibility(ID idPlugin, CAnimatedModelProvider *m_pProviderAnimated, CDynamicModelProvider *m_pProviderDynamic); - ID getPluginId(); + ID getPluginId() const override; - void setOcclusionCuller(IXOcclusionCuller *pOcclusionCuller); + void setOcclusionCuller(IXOcclusionCuller *pOcclusionCuller) override; - void updateForCamera(ICamera *pCamera, const IXRenderableVisibility *pReference = NULL); + void updateForCamera(ICamera *pCamera, const IXRenderableVisibility *pReference = NULL) override; - void updateForFrustum(const IFrustum *pFrustum, const IXRenderableVisibility *pReference = NULL); + void updateForFrustum(const IFrustum *pFrustum, const IXRenderableVisibility *pReference = NULL) override; + void append(const IXRenderableVisibility *pOther) override; + + void substract(const IXRenderableVisibility *pOther) override; + struct item_s { bool isVisible = false; diff --git a/source/common b/source/common index cc34760a0..a887a31b4 160000 --- a/source/common +++ b/source/common @@ -1 +1 @@ -Subproject commit cc34760a0f9dc08eaa9db29930f96c9697a7e975 +Subproject commit a887a31b4b9541a0997e9fa8ac34ad62977813fc diff --git a/source/light/LightSystem.cpp b/source/light/LightSystem.cpp index 519ca34ff..24615237e 100644 --- a/source/light/LightSystem.cpp +++ b/source/light/LightSystem.cpp @@ -32,6 +32,11 @@ private: CLightSystem::CLightSystem(IXCore *pCore): m_pCore(pCore) { + Core_0RegisterCVarFloat("lpv_size_0", 1.0f, "Коэфициент размера первого каскада LPV"); + Core_0RegisterCVarFloat("lpv_size_1", 2.0f, "Коэфициент размера второго каскада LPV"); + Core_0RegisterCVarFloat("lpv_size_2", 4.0f, "Коэфициент размера третьего каскада LPV"); + Core_0RegisterCVarInt("lpv_cascades_count", 3, "Количество активных каскадов LPV [0;3]"); + m_pLevelListener = new CLevelLoadListener(this, pCore); m_pLevelChannel = pCore->getEventChannel<XEventLevel>(EVENT_LEVEL_GUID); @@ -198,7 +203,13 @@ CLightSystem::CLightSystem(IXCore *pCore): m_idComLightingSpotShadow = SGCore_ShaderCreateKit(idResPos, SGCore_ShaderLoad(SHADER_TYPE_PIXEL, "lighting_com.ps", "lighting_com_spot_shadow.ps", Defines_IS_SPOT_SHADOWED)); m_idComLightingPSSMShadow = SGCore_ShaderCreateKit(idResPos, SGCore_ShaderLoad(SHADER_TYPE_PIXEL, "lighting_com.ps", "lighting_com_pssm_shadow.ps", Defines_IS_PSSM_SHADOWED)); - m_idComLightingGI = SGCore_ShaderCreateKit(idResPos, SGCore_ShaderLoad(SHADER_TYPE_PIXEL, "lighting_gi.ps")); + // LPV_CASCADES_COUNT - iCascades + GXMacro Defines_LPV_CASCADE_3[] = {{"LPV_START_CASCADE", "0"}, {0, 0}}; + m_idComLightingGI[2] = SGCore_ShaderCreateKit(idResPos, SGCore_ShaderLoad(SHADER_TYPE_PIXEL, "lighting_gi.ps", 0, Defines_LPV_CASCADE_3)); + GXMacro Defines_LPV_CASCADE_2[] = {{"LPV_START_CASCADE", "1"}, {0, 0}}; + m_idComLightingGI[1] = SGCore_ShaderCreateKit(idResPos, SGCore_ShaderLoad(SHADER_TYPE_PIXEL, "lighting_gi.ps", 0, Defines_LPV_CASCADE_2)); + GXMacro Defines_LPV_CASCADE_1[] = {{"LPV_START_CASCADE", "2"}, {0, 0}}; + m_idComLightingGI[0] = SGCore_ShaderCreateKit(idResPos, SGCore_ShaderLoad(SHADER_TYPE_PIXEL, "lighting_gi.ps", 0, Defines_LPV_CASCADE_1)); m_idHDRinitLuminance = SGCore_ShaderCreateKit(idScreenOut, SGCore_ShaderLoad(SHADER_TYPE_PIXEL, "hdr_luminance.ps")); m_idHDRAdaptLuminance = SGCore_ShaderCreateKit(idScreenOut, SGCore_ShaderLoad(SHADER_TYPE_PIXEL, "hdr_adapt.ps")); @@ -351,7 +362,6 @@ void CLightSystem::destroySun(IXLightSun *pLight) { assert(m_pSun == pLight); _deleteLight(m_pSun); - mem_delete(m_pSun); } void CLightSystem::destroyPoint(IXLightPoint *_pLight) { @@ -404,16 +414,37 @@ void XMETHODCALLTYPE CLightSystem::updateVisibility() float3 vCamPos; m_pMainCamera->getPosition(&vCamPos); + float3 vCamDir; + m_pMainCamera->getLook(&vCamDir); - //! @todo fix this values! - float3 vLPVmin = float3(-16.0f, -16.0f, -16.0f) + vCamPos; - float3 vLPVmax = float3(16.0f, 16.0f, 16.0f) + vCamPos; + static const float *lpv_size_2 = GET_PCVAR_FLOAT("lpv_size_2"); + static const int *lpv_cascades_count = GET_PCVAR_INT("lpv_cascades_count"); + + int iCascades = *lpv_cascades_count; + if(iCascades < 0) + { + iCascades = 0; + } + if(iCascades > LPV_CASCADES_COUNT) + { + iCascades = LPV_CASCADES_COUNT; + } + + float3 vLPVmin; + float3 vLPVmax; + if(iCascades) + { + vLPVmin = vLPVmax = vCamPos + vCamDir * (LPV_GRID_SIZE / 2 - LPV_STEP_COUNT) * *lpv_size_2; + + vLPVmin += float3(-16.0f, -16.0f, -16.0f) * *lpv_size_2; + vLPVmax += float3(16.0f, 16.0f, 16.0f) * *lpv_size_2; + } for(UINT i = 0, l = m_aLights.size(); i < l; ++i) { if(m_aLights[i]->isEnabled()) { - m_aLights[i]->updateVisibility(m_pMainCamera, vLPVmin, vLPVmax); + m_aLights[i]->updateVisibility(m_pMainCamera, vLPVmin, vLPVmax, iCascades > 0); } } } @@ -423,14 +454,24 @@ void XMETHODCALLTYPE CLightSystem::setFrameObserverCamera(ICamera *pMainCamera) //! @todo uncomment me! // pMainCamera->AddRef(); m_pMainCamera = pMainCamera; + if(m_pSun) + { + m_pSun->setCamera(pMainCamera); + } } void XMETHODCALLTYPE CLightSystem::setGBuffer(IGXTexture2D *pColor, IGXTexture2D *pNormals, IGXTexture2D *pParams, IGXTexture2D *pDepth) { + mem_release(m_pGBufferColor); + mem_release(m_pGBufferNormals); + mem_release(m_pGBufferParams); + mem_release(m_pGBufferDepth); + pColor->AddRef(); pNormals->AddRef(); pParams->AddRef(); pDepth->AddRef(); + m_pGBufferColor = pColor; m_pGBufferNormals = pNormals; m_pGBufferParams = pParams; @@ -476,7 +517,7 @@ void XMETHODCALLTYPE CLightSystem::renderGI(IGXTexture2D *pLightTotal, IGXTextur //очищаем рт и стенсил pCtx->clear(GX_CLEAR_COLOR); // pCtx->clear(GX_CLEAR_COLOR | GX_CLEAR_STENCIL); - + m_pRenderPipeline->renderGI(); float3 vCamDir; @@ -484,15 +525,25 @@ void XMETHODCALLTYPE CLightSystem::renderGI(IGXTexture2D *pLightTotal, IGXTextur float3 vCamPos; m_pMainCamera->getPosition(&vCamPos); + static const float *lpv_size_0 = GET_PCVAR_FLOAT("lpv_size_0"); + static const float *lpv_size_1 = GET_PCVAR_FLOAT("lpv_size_1"); + static const float *lpv_size_2 = GET_PCVAR_FLOAT("lpv_size_2"); + static const int *lpv_cascades_count = GET_PCVAR_INT("lpv_cascades_count"); - const float c_aLPVsizes[] = { - //0.5f, - //1.0f, - //2.0f + int iCascades = *lpv_cascades_count; + if(iCascades < 0) + { + iCascades = 0; + } + if(iCascades > LPV_CASCADES_COUNT) + { + iCascades = LPV_CASCADES_COUNT; + } - 1.0f, - 2.0f, - 4.0f + const float c_aLPVsizes[] = { + *lpv_size_0, + *lpv_size_1, + *lpv_size_2 }; m_lpvCentersShaderData.vs.vCenterSize[0] = float4(vCamPos + vCamDir * (LPV_GRID_SIZE / 2 - LPV_STEP_COUNT) * c_aLPVsizes[0], c_aLPVsizes[0]); @@ -500,31 +551,6 @@ void XMETHODCALLTYPE CLightSystem::renderGI(IGXTexture2D *pLightTotal, IGXTextur m_lpvCentersShaderData.vs.vCenterSize[2] = float4(vCamPos + vCamDir * (LPV_GRID_SIZE / 2 - LPV_STEP_COUNT) * c_aLPVsizes[2], c_aLPVsizes[2]); m_pLPVcentersShaderData->update(&m_lpvCentersShaderData.vs); - /* - vs: - cbuffer0: (per light) - - g_mW - cbuffer1: (per frame) - - g_mVP - - g_mViewInv - - g_vNearFar - - g_vParamProj - - ps: - cbuffer0: (per light) - - g_vLightPos - - g_vLightColor - - g_vLightPowerDistShadow - cbuffer1: (per frame) - - g_vViewPos - - - { - render shadowmaps - render direct light with shadows - inject VPLs into LPV grid - } - */ // Определим список лампочек, которые будут участвовать в текущем кадре CXLight *pLight; @@ -550,25 +576,9 @@ void XMETHODCALLTYPE CLightSystem::renderGI(IGXTexture2D *pLightTotal, IGXTextur static const float *r_near = GET_PCVAR_FLOAT("r_near"); static const float *r_far = GET_PCVAR_FLOAT("r_far"); - // float4x4 &mCamView = gdata::mCamView; - // // Core_RMatrixGet(G_RI_MATRIX_OBSERVER_VIEW, &mCamView); - // m_shadowShaderData.vs.mViewInv = SMMatrixTranspose(SMMatrixInverse(NULL, mCamView)); - // m_shadowShaderData.vs.vNearFar = gdata::vNearFar; // float2(*r_near, *r_far); - // m_shadowShaderData.vs.vParamProj = float3((float)m_uOutWidth, (float)m_uOutHeight, gdata::fProjFov); // *r_default_fov); - // m_pShadowShaderDataVS->update(&m_shadowShaderData.vs); - - //@TODO: убрать это - //Core_RFloat3Get(G_RI_FLOAT3_OBSERVER_POSITION, &m_shadowShaderData.ps.vPosCam); - //m_pShadowShaderDataPS->update(&m_shadowShaderData.ps); - - - //m_pDevice->setPixelShaderConstant(m_pShadowShaderDataPS, 7); pCtx->setRasterizerState(m_pRasterizerConservative); - //pCtx->setVSConstant(m_pCameraShaderDataVS, 8); - //pCtx->setPSConstant(m_pCameraShaderDataVS, 8); - UINT uShadowCount = 0; while((uShadowCount = m_pShadowCache->processNextBunch())) { @@ -576,9 +586,6 @@ void XMETHODCALLTYPE CLightSystem::renderGI(IGXTexture2D *pLightTotal, IGXTextur pCtx->setDepthStencilSurface(pOldDSSurface); pCtx->setBlendState(m_pBlendAlphaOneOne); - // pCtx->setVSConstant(m_pLightingShaderDataVS, 1); - // pCtx->setPSConstant(m_pLightingShaderDataPS, 1); - IBaseShadowMap *pShadow = NULL; //render direct light with shadows @@ -611,10 +618,6 @@ void XMETHODCALLTYPE CLightSystem::renderGI(IGXTexture2D *pLightTotal, IGXTextur pCtx->setRasterizerState(NULL); - - //pCtx->setVSConstant(m_pShadowShaderDataVS, 1); - // pCtx->setVSConstant(m_pLightingShaderDataVS, 1); - pCtx->setBlendState(m_pBlendRed); pShadow->genShadow(m_pGBufferDepth, m_pGBufferNormals); pCtx->setBlendState(m_pBlendAlphaOneOne); @@ -638,8 +641,6 @@ void XMETHODCALLTYPE CLightSystem::renderGI(IGXTexture2D *pLightTotal, IGXTextur assert(!"Unknown light type!"); } - // pCtx->setVSConstant(m_pLightingShaderDataVS, 1); - //теперь когда будем считать освещение надо сбросить значения в стенсил буфере, чтобы каждый кадр не чистить //если стенсил тест прошел успешно, устанавливаем значнеие в нуль if(pLight->getType() != LIGHT_TYPE_SUN) @@ -663,17 +664,13 @@ void XMETHODCALLTYPE CLightSystem::renderGI(IGXTexture2D *pLightTotal, IGXTextur SGCore_ScreenQuadDraw(); } - - - //pCtx->setSamplerState(gdata::rstates::pSamplerLinearWrap, 0); - //pCtx->setSamplerState(gdata::rstates::pSamplerLinearWrap, 1); } pCtx->setVSConstant(m_pLPVcentersShaderData, 9); pCtx->setPSConstant(m_pLPVcentersShaderData, 9); bool isFirstRun[3] = {true, true, true}; - while((uShadowCount = m_pShadowCache->processNextRSMBunch())) + while(iCascades && (uShadowCount = m_pShadowCache->processNextRSMBunch())) { pCtx->setVSConstant(m_pLPVcurrentCascadeShaderData, 10); pCtx->setPSConstant(m_pLPVcurrentCascadeShaderData, 10); @@ -681,15 +678,15 @@ void XMETHODCALLTYPE CLightSystem::renderGI(IGXTexture2D *pLightTotal, IGXTextur pCtx->setDepthStencilSurface(pOldDSSurface); pCtx->setBlendState(m_pBlendAlphaOneOne); - // pCtx->setVSConstant(m_pLightingShaderDataVS, 1); - // pCtx->setPSConstant(m_pLightingShaderDataPS, 1); + // pCtx->setVSConstant(m_pLightingShaderDataVS, 1); + // pCtx->setPSConstant(m_pLightingShaderDataPS, 1); IGXDepthStencilSurface *pOldSurface = pCtx->getDepthStencilSurface(); pCtx->unsetDepthStencilSurface(); IBaseReflectiveShadowMap *pShadow = NULL; - for(UINT i = 0; i < 3; ++i) + for(UINT i = LPV_CASCADES_COUNT - iCascades; i < LPV_CASCADES_COUNT; ++i) { float4_t vTmp((float)i + 0.5f); // just to be sure m_pLPVcurrentCascadeShaderData->update(&vTmp); @@ -744,38 +741,42 @@ void XMETHODCALLTYPE CLightSystem::renderGI(IGXTexture2D *pLightTotal, IGXTextur //break; } - for(UINT i = 0; i < 3; ++i) + + bool isClean[3] = {0}; + if(iCascades) { - if(isFirstRun[i]) + for(UINT i = 0; i < 3; ++i) { - IGXSurface *pLPVRed = m_aLPVs[i].pGIAccumRed->asRenderTarget(); - IGXSurface *pLPVGreen = m_aLPVs[i].pGIAccumGreen->asRenderTarget(); - IGXSurface *pLPVBlue = m_aLPVs[i].pGIAccumBlue->asRenderTarget(); + if(isFirstRun[i]) + { + IGXSurface *pLPVRed = m_aLPVs[i].pGIAccumRed->asRenderTarget(); + IGXSurface *pLPVGreen = m_aLPVs[i].pGIAccumGreen->asRenderTarget(); + IGXSurface *pLPVBlue = m_aLPVs[i].pGIAccumBlue->asRenderTarget(); - pCtx->setColorTarget(pLPVRed); - pCtx->setColorTarget(pLPVGreen, 1); - pCtx->setColorTarget(pLPVBlue, 2); + pCtx->setColorTarget(pLPVRed); + pCtx->setColorTarget(pLPVGreen, 1); + pCtx->setColorTarget(pLPVBlue, 2); - mem_release(pLPVRed); - mem_release(pLPVGreen); - mem_release(pLPVBlue); + mem_release(pLPVRed); + mem_release(pLPVGreen); + mem_release(pLPVBlue); - pCtx->clear(GX_CLEAR_COLOR); - isFirstRun[i] = false; + pCtx->clear(GX_CLEAR_COLOR); + isFirstRun[i] = false; - pCtx->setColorTarget(NULL); - pCtx->setColorTarget(NULL, 1); - pCtx->setColorTarget(NULL, 2); + pCtx->setColorTarget(NULL); + pCtx->setColorTarget(NULL, 1); + pCtx->setColorTarget(NULL, 2); + + isClean[i] = true; + } } } - SGCore_ShaderUnBind(); mem_release(pOldDSSurface); - //pCtx->setVSConstant(m_pLightingShaderDataVS, 1); - //pCtx->setPSConstant(m_pLightingShaderDataPS, 1); - + if(iCascades) { SGCore_ShaderBind(m_idLPVPropagateShader); UINT uStepCount[] = {4, 6, 8}; @@ -784,6 +785,10 @@ void XMETHODCALLTYPE CLightSystem::renderGI(IGXTexture2D *pLightTotal, IGXTextur //{ for(UINT j = 0; j < 3; ++j) { + if(isClean[j]) + { + continue; + } for(UINT i = 0; i < uStepCount[j]; ++i) { pCtx->setCSTexture(m_aLPVs[j].pGIAccumRed, 0); @@ -830,6 +835,7 @@ void XMETHODCALLTYPE CLightSystem::renderGI(IGXTexture2D *pLightTotal, IGXTextur } + if(iCascades) { pCtx->setColorTarget(pAmbientSurf); //gdata::pDXDevice->setRasterizerState(NULL); @@ -837,13 +843,7 @@ void XMETHODCALLTYPE CLightSystem::renderGI(IGXTexture2D *pLightTotal, IGXTextur pCtx->setBlendState(m_pBlendAlphaOneOne); pCtx->setDepthStencilState(m_pDepthStencilStateLightShadowGlobal); - //pCtx->setPSConstant(m_pLightingShaderDataPS, 1); - - ID idshaderkit = m_idComLightingGI; - - //SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, idshader, "g_vViewPos", &gdata::vConstCurrCamPos); - - // pCtx->setPSConstant(m_pCameraShaderDataVS, 8); + ID idshaderkit = m_idComLightingGI[iCascades - 1]; SGCore_ShaderBind(idshaderkit); diff --git a/source/light/LightSystem.h b/source/light/LightSystem.h index bc33f45a6..ce108a9c8 100644 --- a/source/light/LightSystem.h +++ b/source/light/LightSystem.h @@ -114,7 +114,7 @@ protected: ID m_idComLightingShadow = -1; ID m_idComLightingSpotShadow = -1; ID m_idComLightingPSSMShadow = -1; - ID m_idComLightingGI = -1; + ID m_idComLightingGI[LPV_CASCADES_COUNT]; ID m_idHDRinitLuminance = -1; ID m_idHDRAdaptLuminance = -1; diff --git a/source/light/light.cpp b/source/light/light.cpp index bdf07c8c2..ea4275b63 100644 --- a/source/light/light.cpp +++ b/source/light/light.cpp @@ -181,11 +181,11 @@ float CXLight::getMaxDistance() return(SMVector3Length2(m_vColor)); } -void CXLight::updateVisibility(ICamera *pMainCamera, const float3 &vLPVmin, const float3 &vLPVmax) +void CXLight::updateVisibility(ICamera *pMainCamera, const float3 &vLPVmin, const float3 &vLPVmax, bool useLPV) { updateFrustum(); - if(m_pFrustum->boxInFrustum(&vLPVmin, &vLPVmax)) + if(useLPV && m_pFrustum->boxInFrustum(&vLPVmin, &vLPVmax)) { m_renderType |= LRT_LPV; } @@ -250,7 +250,7 @@ void CXLightPoint::updateFrustum() m_pFrustum->update(planes, true); } -void CXLightPoint::updateVisibility(ICamera *pMainCamera, const float3 &vLPVmin, const float3 &vLPVmax) +void CXLightPoint::updateVisibility(ICamera *pMainCamera, const float3 &vLPVmin, const float3 &vLPVmax, bool useLPV) { m_renderType = LRT_NONE; @@ -260,7 +260,7 @@ void CXLightPoint::updateVisibility(ICamera *pMainCamera, const float3 &vLPVmin, m_renderType |= LRT_LIGHT; } - CXLight::updateVisibility(pMainCamera, vLPVmin, vLPVmax); + CXLight::updateVisibility(pMainCamera, vLPVmin, vLPVmax, useLPV); } //########################################################################## @@ -269,15 +269,33 @@ CXLightSun::CXLightSun(CLightSystem *pLightSystem): CXLight(pLightSystem) { m_type = LIGHT_TYPE_SUN; + + IXRenderPipeline *pPipeline; + Core_GetIXCore()->getRenderPipeline(&pPipeline); + pPipeline->newVisData(&m_pReflectiveVisibility); + pPipeline->newVisData(&m_pTempVisibility); + mem_release(pPipeline); + + m_pReflectiveFrustum = SGCore_CrFrustum(); + + for(UINT i = 0; i < PSSM_MAX_SPLITS; ++i) + { + m_pPSSMFrustum[i] = SGCore_CrFrustum(); + } } -void CXLightSun::Release() +CXLightSun::~CXLightSun() { - --m_uRefCount; - if(!m_uRefCount) + mem_release(m_pReflectiveFrustum); + mem_release(m_pReflectiveVisibility); + mem_release(m_pTempVisibility); + + for(UINT i = 0; i < PSSM_MAX_SPLITS; ++i) { - m_pLightSystem->destroySun(this); + mem_release(m_pPSSMFrustum[i]); } + + m_pLightSystem->destroySun(this); } SMQuaternion CXLightSun::getDirection() @@ -301,6 +319,7 @@ void CXLightSun::updatePSConstants(IGXDevice *pDevice) { m_pPSData = pDevice->createConstantBuffer(sizeof(m_dataPS)); } + m_dataPS.vLightColor = float4(m_vColor, SMVector3Length2(m_vColor)); m_dataPS.vLightPos = float4(m_qDirection * -LIGHTS_DIR_BASE, m_fShadowIntensity); m_pPSData->update(&m_dataPS); @@ -316,19 +335,225 @@ void CXLightSun::setMaxDistance(float fMax) m_fMaxDistance = fMax; } -void CXLightSun::updateVisibility(ICamera *pMainCamera, const float3 &vLPVmin, const float3 &vLPVmax) +void CXLightSun::updateVisibility(ICamera *pMainCamera, const float3 &vLPVmin, const float3 &vLPVmax, bool useLPV) { m_renderType = LRT_LIGHT | LRT_LPV; -#if 0 - m_renderType = LRT_NONE; - float3 vOrigin = getPosition(); - if(pMainCamera->getFrustum()->sphereInFrustum(&vOrigin, getMaxDistance())) + CXLight::updateVisibility(pMainCamera, vLPVmin, vLPVmax, useLPV); + + static const int *lpv_cascades_count = GET_PCVAR_INT("lpv_cascades_count"); + + if(lpv_cascades_count > 0) { - m_renderType |= LRT_LIGHT; + m_pReflectiveVisibility->updateForFrustum(m_pReflectiveFrustum); } -#endif - CXLight::updateVisibility(pMainCamera, vLPVmin, vLPVmax); + + static const int *r_pssm_splits = GET_PCVAR_INT("r_pssm_splits"); + + for(UINT i = 1; i < *r_pssm_splits; ++i) + { + m_pTempVisibility->updateForFrustum(m_pPSSMFrustum[i - 1]); + m_pVisibility->append(m_pTempVisibility); + } +} + +void CXLightSun::updateFrustum() +{ + assert(m_pCamera); + + float3 vLightDir = getDirection() * LIGHTS_DIR_BASE; + float3 vUpDir = getDirection() * float3(1.0f, 0.0f, 0.0f); + + float3 vStart; + m_pCamera->getPosition(&vStart); + float3 vDir; + m_pCamera->getLook(&vDir); + vDir = SMVector3Normalize(vDir); + float3 vRight; + m_pCamera->getRight(&vRight); + float3 vUp; + m_pCamera->getUp(&vUp); + + static const int *r_win_width = GET_PCVAR_INT("r_win_width"); + static const int *r_win_height = GET_PCVAR_INT("r_win_height"); + static const float *r_effective_fov = GET_PCVAR_FLOAT("r_default_fov"); + + float fAspectRatio = (float)*r_win_width / (float)*r_win_height; + float fFovTan = tanf(*r_effective_fov * 0.5f); + + { + static const float *s_pfRPSSMQuality = GET_PCVAR_FLOAT("r_pssm_quality"); + const float fSize = 512.0f * *s_pfRPSSMQuality; + + + + static const float *r_near = GET_PCVAR_FLOAT("r_near"); + static const float *r_far = GET_PCVAR_FLOAT("r_far"); + static const float *r_pssm_max_distance = GET_PCVAR_FLOAT("r_pssm_max_distance"); + + static const int *r_pssm_splits = GET_PCVAR_INT("r_pssm_splits"); + if(*r_pssm_splits < 1) + { + Core_0SetCVarInt("r_pssm_splits", 1); + } + else if(*r_pssm_splits > PSSM_MAX_SPLITS) + { + Core_0SetCVarInt("r_pssm_splits", PSSM_MAX_SPLITS); + } + + float fSplitWeight = 0.8f; + float fShadowDistance = min(*r_pssm_max_distance, *r_far); + + float fMaxDistanceSun = getMaxDistance(); + if(fShadowDistance > fMaxDistanceSun) + { + fShadowDistance = fMaxDistanceSun; + } + + float aSplitDistances[PSSM_MAX_SPLITS]; + for(int i = 0; i < *r_pssm_splits; ++i) + { + float f = (i + 1.0f) / *r_pssm_splits; + float fLogDistance = *r_near * pow(fShadowDistance / *r_near, f); + float fUniformDistance = *r_near + (fShadowDistance - *r_near) * f; + aSplitDistances[i] = lerpf(fUniformDistance, fLogDistance, fSplitWeight); + + if(i == 0) + { + m_splits[i].vNearFar = float2(*r_near, aSplitDistances[i]); + } + else + { + m_splits[i].vNearFar = float2(aSplitDistances[i - 1], aSplitDistances[i]); + } + } + + + + for(int i = 0; i < *r_pssm_splits; ++i) + { + Split &split = m_splits[i]; + + float3 vNearCenter = vStart + vDir * split.vNearFar.x; + float3 vFarCenter = vStart + vDir * split.vNearFar.y; + + float fNearHalfHeight = fFovTan * split.vNearFar.x; + float fFarHalfHeight = fFovTan * split.vNearFar.y; + + float fNearHalfWidth = fNearHalfHeight * fAspectRatio; + float fFarHalfWidth = fFarHalfHeight * fAspectRatio; + + float3 vA = vNearCenter - vUp * fNearHalfHeight + vRight * fNearHalfWidth; + float3 vB = vFarCenter + vUp * fFarHalfHeight - vRight * fFarHalfWidth; + float3 vC = vFarCenter - vUp * fFarHalfHeight + vRight * fFarHalfWidth; + + float3 vCenter = SMTriangleCircumcenter3(vA, vB, vC); + + + float fRadius = SMVector3Length(vCenter - vA); + + SMMATRIX mLight(SMMatrixTranspose(SMMATRIX( + float4(SMVector3Cross(vUpDir, vLightDir)), + float4(vUpDir), + float4(vLightDir), + float4(0.0f, 0.0f, 0.0f, 1.0f) + ))); + SMMATRIX mLightInv = SMMatrixInverse(NULL, mLight); + + vCenter = SMVector3Transform(vCenter, mLight); + float fStep = (fRadius * 2.0f / fSize); + vCenter.x -= fmodf(vCenter.x, fStep); + vCenter.y -= fmodf(vCenter.y, fStep); + + vCenter = SMVector3Transform(vCenter, mLightInv); + + float fMaxDistance = PSSM_LIGHT_FAR; + + split.mProj = SMMatrixOrthographicLH(fRadius * 2.0f, fRadius * 2.0f, PSSM_LIGHT_NEAR, fMaxDistance); + split.mView = SMMatrixLookToLH(vCenter - vLightDir * (fMaxDistance /*- fRadius * 2*/ * 0.5f), vLightDir, vUpDir); + + m_mVPs[i] = SMMatrixTranspose(split.mView * split.mProj); + + if(i == 0) + { + m_pFrustum->update(&split.mView, &split.mProj); + } + else + { + m_pPSSMFrustum[i - 1]->update(&split.mView, &split.mProj); + } + } + } + + static const int *lpv_cascades_count = GET_PCVAR_INT("lpv_cascades_count"); + int iCascades = *lpv_cascades_count; + if(iCascades < 0) + { + iCascades = 0; + } + if(iCascades > LPV_CASCADES_COUNT) + { + iCascades = LPV_CASCADES_COUNT; + } + + if(iCascades) + { + static const float *lpv_size_2 = GET_PCVAR_FLOAT("lpv_size_2"); + + float3 vGridCenter = vStart + vDir * (LPV_GRID_SIZE / 2 - LPV_STEP_COUNT) * *lpv_size_2; + //float fGridRadius = sqrtf(16.0f * 16.0f * 3.0f); + float fDim = 16.0f * *lpv_size_2; + float fGridRadius = sqrtf(fDim * fDim * 3.0f); + + + SMMATRIX mLight(SMMatrixTranspose(SMMATRIX( + float4(SMVector3Cross(vUpDir, vLightDir)), + float4(vUpDir), + float4(vLightDir), + float4(0.0f, 0.0f, 0.0f, 1.0f) + ))); + SMMATRIX mLightInv = SMMatrixInverse(NULL, mLight); + + vGridCenter = SMVector3Transform(vGridCenter, mLight); + float fStep = (fGridRadius * 2.0f / (float)RSM_SUN_SIZE); + vGridCenter.x -= fmodf(vGridCenter.x, fStep); + vGridCenter.y -= fmodf(vGridCenter.y, fStep); + + vGridCenter = SMVector3Transform(vGridCenter, mLightInv); + + float fMaxDistance = PSSM_LIGHT_FAR; + + m_mReflectiveProj = SMMatrixOrthographicLH(fGridRadius * 2.0f, fGridRadius * 2.0f, PSSM_LIGHT_NEAR, fMaxDistance); + m_mReflectiveView = SMMatrixLookToLH(vGridCenter - vLightDir * (fMaxDistance /*- fRadius * 2*/ * 0.5f), vLightDir, vUpDir); + + m_pReflectiveFrustum->update(&m_mReflectiveView, &m_mReflectiveProj); + } +} + +void CXLightSun::setCamera(ICamera *pCamera) +{ + m_pCamera = pCamera; +} + +const SMMATRIX* CXLightSun::getPSSMVPs() const +{ + return(m_mVPs); +} + +const CXLightSun::Split* CXLightSun::getPSSMsplits() const +{ + return(m_splits); +} + +IXRenderableVisibility* CXLightSun::getReflectiveVisibility() +{ + return(m_pReflectiveVisibility); +} + +void CXLightSun::getReflectiveVP(SMMATRIX *pView, SMMATRIX *pProj) const +{ + *pView = m_mReflectiveView; + *pProj = m_mReflectiveProj; } //########################################################################## @@ -425,7 +650,7 @@ void CXLightSpot::updateFrustum() m_pFrustum->update(&mView, &mProj); } -void CXLightSpot::updateVisibility(ICamera *pMainCamera, const float3 &vLPVmin, const float3 &vLPVmax) +void CXLightSpot::updateVisibility(ICamera *pMainCamera, const float3 &vLPVmin, const float3 &vLPVmax, bool useLPV) { m_renderType = LRT_NONE; @@ -436,5 +661,5 @@ void CXLightSpot::updateVisibility(ICamera *pMainCamera, const float3 &vLPVmin, m_renderType |= LRT_LIGHT; } - CXLight::updateVisibility(pMainCamera, vLPVmin, vLPVmax); + CXLight::updateVisibility(pMainCamera, vLPVmin, vLPVmax, useLPV); } diff --git a/source/light/light.h b/source/light/light.h index c5952cd50..b67b0c18b 100644 --- a/source/light/light.h +++ b/source/light/light.h @@ -19,6 +19,10 @@ See the license in LICENSE #include "IXLight.h" +#define PSSM_MAX_SPLITS 6 +#define PSSM_LIGHT_NEAR 0.1f +#define PSSM_LIGHT_FAR 5000.0f + class CLightSystem; class CXLight: public virtual IXLight { @@ -52,7 +56,7 @@ public: float getMaxDistance(); - virtual void updateVisibility(ICamera *pMainCamera, const float3 &vLPVmin, const float3 &vLPVmax); + virtual void updateVisibility(ICamera *pMainCamera, const float3 &vLPVmin, const float3 &vLPVmax, bool useLPV); IXRenderableVisibility *getVisibility() override; LIGHT_RENDER_TYPE getRenderType() { @@ -126,7 +130,7 @@ public: void updateFrustum() override; - void updateVisibility(ICamera *pMainCamera, const float3 &vLPVmin, const float3 &vLPVmax) override; + void updateVisibility(ICamera *pMainCamera, const float3 &vLPVmin, const float3 &vLPVmax, bool useLPV) override; protected: void updatePSConstants(IGXDevice *pDevice); @@ -140,7 +144,7 @@ public: SX_ALIGNED_OP_MEM2(); CXLightSun(CLightSystem *pLightSystem); - void XMETHODCALLTYPE Release(); + ~CXLightSun(); SMQuaternion getDirection(); void setDirection(const SMQuaternion &qDirection); @@ -148,7 +152,27 @@ public: float getMaxDistance(); void setMaxDistance(float fMax); - void updateVisibility(ICamera *pMainCamera, const float3 &vLPVmin, const float3 &vLPVmax) override; + void updateVisibility(ICamera *pMainCamera, const float3 &vLPVmin, const float3 &vLPVmax, bool useLPV) override; + + void updateFrustum() override; + + void setCamera(ICamera *pCamera); + + const SMMATRIX* getPSSMVPs() const; + void getReflectiveVP(SMMATRIX *pView, SMMATRIX *pProj) const; + + IXRenderableVisibility* getReflectiveVisibility(); + + struct Split + { + SX_ALIGNED_OP_MEM2(); + + float2 vNearFar; + float4x4 mView; + float4x4 mProj; + }; + + const Split* getPSSMsplits() const; protected: void updatePSConstants(IGXDevice *pDevice); @@ -157,6 +181,19 @@ protected: SMQuaternion m_qDirection; float m_fMaxDistance = 1000.0f; + + ICamera *m_pCamera = NULL; + + Split m_splits[PSSM_MAX_SPLITS]; + + SMMATRIX m_mVPs[PSSM_MAX_SPLITS]; + SMMATRIX m_mReflectiveView; + SMMATRIX m_mReflectiveProj; + + IFrustum *m_pPSSMFrustum[PSSM_MAX_SPLITS - 1]; + IFrustum *m_pReflectiveFrustum = NULL; + IXRenderableVisibility *m_pReflectiveVisibility = NULL; + IXRenderableVisibility *m_pTempVisibility = NULL; }; class CXLightSpot: public CXLight, public virtual IXLightSpot @@ -174,7 +211,7 @@ public: SMMATRIX getWorldTM(); - void updateVisibility(ICamera *pMainCamera, const float3 &vLPVmin, const float3 &vLPVmax) override; + void updateVisibility(ICamera *pMainCamera, const float3 &vLPVmin, const float3 &vLPVmax, bool useLPV) override; protected: void updatePSConstants(IGXDevice *pDevice); void updateFrustum() override; diff --git a/source/light/shadow.cpp b/source/light/shadow.cpp index e15b175b7..20bdaa838 100644 --- a/source/light/shadow.cpp +++ b/source/light/shadow.cpp @@ -547,7 +547,7 @@ void CShadowPSSM::init(IGXDevice *pContext, UINT uSize) m_pShaderDataPS = m_pDevice->createConstantBuffer(sizeof(m_shaderData.ps)); - m_pShaderDataGS = m_pDevice->createConstantBuffer(sizeof(m_shaderData.gs)); + m_pShaderDataGS = m_pDevice->createConstantBuffer(sizeof(SMMATRIX) * PSSM_MAX_SPLITS); m_pCameraShaderDataVS = m_pDevice->createConstantBuffer(sizeof(m_cameraShaderData.vs)); } @@ -602,7 +602,7 @@ void CShadowPSSM::process(IXRenderPipeline *pRenderPipeline) mem_release(pLightConstants); pRenderPipeline->renderShadows(); - pRenderPipeline->renderStage(XRS_SHADOWS, NULL); // m_pLight->getVisibility()); + pRenderPipeline->renderStage(XRS_SHADOWS, m_pLight->getVisibility()); pCtx->setColorTarget(NULL); @@ -612,122 +612,11 @@ void CShadowPSSM::process(IXRenderPipeline *pRenderPipeline) }*/ } -#define PSSM_LIGHT_NEAR 0.1f -#define PSSM_LIGHT_FAR 5000.0f - void CShadowPSSM::updateFrustums() { - assert(m_pCamera); - CXLightSun *pSunLight = (CXLightSun*)m_pLight; - float3 vLightDir = pSunLight->getDirection() * LIGHTS_DIR_BASE; - float3 vUpDir = pSunLight->getDirection() * float3(1.0f, 0.0f, 0.0f); - - static const float *r_near = GET_PCVAR_FLOAT("r_near"); - static const float *r_far = GET_PCVAR_FLOAT("r_far"); - static const float *r_pssm_max_distance = GET_PCVAR_FLOAT("r_pssm_max_distance"); - static const int *r_win_width = GET_PCVAR_INT("r_win_width"); - static const int *r_win_height = GET_PCVAR_INT("r_win_height"); - static const float *r_effective_fov = GET_PCVAR_FLOAT("r_default_fov"); - static const int *r_pssm_splits = GET_PCVAR_INT("r_pssm_splits"); - if(*r_pssm_splits < 1) - { - Core_0SetCVarInt("r_pssm_splits", 1); - } - else if(*r_pssm_splits > PSSM_MAX_SPLITS) - { - Core_0SetCVarInt("r_pssm_splits", PSSM_MAX_SPLITS); - } - - float fSplitWeight = 0.8f; - float fShadowDistance = min(*r_pssm_max_distance, *r_far); - - float fMaxDistanceSun = pSunLight->getMaxDistance(); - if(fShadowDistance > fMaxDistanceSun) - { - fShadowDistance = fMaxDistanceSun; - } - - float aSplitDistances[PSSM_MAX_SPLITS]; - for(int i = 0; i < *r_pssm_splits; ++i) - { - float f = (i + 1.0f) / *r_pssm_splits; - float fLogDistance = *r_near * pow(fShadowDistance / *r_near, f); - float fUniformDistance = *r_near + (fShadowDistance - *r_near) * f; - aSplitDistances[i] = lerpf(fUniformDistance, fLogDistance, fSplitWeight); - - if(i == 0) - { - m_splits[i].vNearFar = float2(*r_near, aSplitDistances[i]); - } - else - { - m_splits[i].vNearFar = float2(aSplitDistances[i - 1], aSplitDistances[i]); - } - } - - - float3 vStart; - m_pCamera->getPosition(&vStart); - float3 vDir; - m_pCamera->getLook(&vDir); - vDir = SMVector3Normalize(vDir); - float3 vRight; - m_pCamera->getRight(&vRight); - float3 vUp; - m_pCamera->getUp(&vUp); - float fAspectRatio = (float)*r_win_width / (float)*r_win_height; - float fFovTan = tanf(*r_effective_fov * 0.5f); - for(int i = 0; i < *r_pssm_splits; ++i) - { - Split &split = m_splits[i]; - - float3 vNearCenter = vStart + vDir * split.vNearFar.x; - float3 vFarCenter = vStart + vDir * split.vNearFar.y; - - float fNearHalfHeight = fFovTan * split.vNearFar.x; - float fFarHalfHeight = fFovTan * split.vNearFar.y; - - float fNearHalfWidth = fNearHalfHeight * fAspectRatio; - float fFarHalfWidth = fFarHalfHeight * fAspectRatio; - - float3 vA = vNearCenter - vUp * fNearHalfHeight + vRight * fNearHalfWidth; - float3 vB = vFarCenter + vUp * fFarHalfHeight - vRight * fFarHalfWidth; - float3 vC = vFarCenter - vUp * fFarHalfHeight + vRight * fFarHalfWidth; - - float3 vCenter = SMTriangleCircumcenter3(vA, vB, vC); - - - float fRadius = SMVector3Length(vCenter - vA); - //float fRadius1 = SMVector3Length(vCenter - vB); - //float fRadius2 = SMVector3Length(vCenter - vC); - - // vCenter.mmv = _mm_round_ps(vCenter, _MM_ROUND_NEAREST); - - SMMATRIX mLight(SMMatrixTranspose(SMMATRIX( - float4(SMVector3Cross(vUpDir, vLightDir)), - float4(vUpDir), - float4(vLightDir), - float4(0.0f, 0.0f, 0.0f, 1.0f) - ))); - SMMATRIX mLightInv = SMMatrixInverse(NULL, mLight); - - vCenter = SMVector3Transform(vCenter, mLight); - float fStep = (fRadius * 2.0f / m_fSize); - vCenter.x -= fmodf(vCenter.x, fStep); - vCenter.y -= fmodf(vCenter.y, fStep); - - vCenter = SMVector3Transform(vCenter, mLightInv); - - float fMaxDistance = PSSM_LIGHT_FAR; - - split.mProj = SMMatrixOrthographicLH(fRadius * 2.0f, fRadius * 2.0f, PSSM_LIGHT_NEAR, fMaxDistance); - split.mView = SMMatrixLookToLH(vCenter - vLightDir * (fMaxDistance /*- fRadius * 2*/ * 0.5f), vLightDir, vUpDir); - - m_shaderData.gs.mVP[i] = SMMatrixTranspose(split.mView * split.mProj); - } - m_pShaderDataGS->update(&m_shaderData.gs); + m_pShaderDataGS->update(pSunLight->getPSSMVPs()); } void CShadowPSSM::genShadow(IGXTexture2D *pGBufferDepth, IGXTexture2D *pGBufferNormals) @@ -741,6 +630,8 @@ void CShadowPSSM::genShadow(IGXTexture2D *pGBufferDepth, IGXTexture2D *pGBufferN // static const float *r_near = GET_PCVAR_FLOAT("r_near"); // static const float *r_far = GET_PCVAR_FLOAT("r_far"); + CXLightSun *pSunLight = (CXLightSun*)m_pLight; + IGXContext *pCtx = m_pDevice->getThreadContext(); // const float c_fTexWidth = (float)pShadowMap->getWidth(); @@ -764,12 +655,14 @@ void CShadowPSSM::genShadow(IGXTexture2D *pGBufferDepth, IGXTexture2D *pGBufferN //pCtx->setPSTexture(ms_pRandomTexture, 2); pCtx->setPSTexture(pGBufferNormals, 3); + const CXLightSun::Split *pSplits = pSunLight->getPSSMsplits(); + SMMATRIX tmp = SMMatrixTranspose(m_mScaleBiasMat); for(int i = 0; i < PSSM_MAX_SPLITS; ++i) { //m_shaderData.ps.mMatrixTextureV[i] = tmp * m_shaderData.gs.mVP[i]; - m_shaderData.ps.mMatrixTextureV[i] = SMMatrixTranspose(m_splits[i].mView); - m_shaderData.ps.mMatrixTextureP[i] = SMMatrixTranspose(m_splits[i].mProj * m_mScaleBiasMat); + m_shaderData.ps.mMatrixTextureV[i] = SMMatrixTranspose(pSplits[i].mView); + m_shaderData.ps.mMatrixTextureP[i] = SMMatrixTranspose(pSplits[i].mProj * m_mScaleBiasMat); } //m_shaderData.ps.vPixelMapSizeBias = float3(m_fBlurPixel / m_fSize, m_fSize, m_fBias); m_shaderData.ps.vSizeBoundNearFar = float4(m_fSize, PSSM_LIGHT_NEAR * tanf(0.001f), PSSM_LIGHT_NEAR, PSSM_LIGHT_FAR); @@ -937,61 +830,27 @@ void CReflectiveShadowSun::process(IXRenderPipeline *pRenderPipeline) //m_pLight->setPSConstants(m_pDevice, 5); pRenderPipeline->renderShadows(); - pRenderPipeline->renderStage(XRS_SHADOWS, NULL); // m_pLight->getVisibility()); + pRenderPipeline->renderStage(XRS_SHADOWS, ((CXLightSun*)m_pLight)->getReflectiveVisibility()); pCtx->setColorTarget(NULL); pCtx->setColorTarget(NULL, 1); pCtx->setColorTarget(NULL, 2); + /* if(GetAsyncKeyState('U') < 0) { m_pDevice->saveTextureToFile("sm_depth.dds", m_pDepthMap); m_pDevice->saveTextureToFile("sm_normal.dds", m_pNormalMap); m_pDevice->saveTextureToFile("sm_flux.dds", m_pFluxMap); } + */ } void CReflectiveShadowSun::updateFrustum() { - assert(m_pCamera); - - CXLightSun *pSunLight = (CXLightSun*)m_pLight; - float3 vLightDir = pSunLight->getDirection() * LIGHTS_DIR_BASE; - float3 vUpDir = pSunLight->getDirection() * float3(1.0f, 0.0f, 0.0f); - - float3 vStart; - m_pCamera->getPosition(&vStart); - float3 vDir; - m_pCamera->getLook(&vDir); - vDir = SMVector3Normalize(vDir); - - //! @todo: fix grid center pos! - float3 vGridCenter = vStart; - //float fGridRadius = sqrtf(16.0f * 16.0f * 3.0f); - float fGridRadius = sqrtf(64.0f * 64.0f * 3.0f); - - SMMATRIX mLight(SMMatrixTranspose(SMMATRIX( - float4(SMVector3Cross(vUpDir, vLightDir)), - float4(vUpDir), - float4(vLightDir), - float4(0.0f, 0.0f, 0.0f, 1.0f) - ))); - SMMATRIX mLightInv = SMMatrixInverse(NULL, mLight); - - vGridCenter = SMVector3Transform(vGridCenter, mLight); - float fStep = (fGridRadius * 2.0f / m_fSize); - vGridCenter.x -= fmodf(vGridCenter.x, fStep); - vGridCenter.y -= fmodf(vGridCenter.y, fStep); - - vGridCenter = SMVector3Transform(vGridCenter, mLightInv); - - float fMaxDistance = PSSM_LIGHT_FAR; - - m_mProj = SMMatrixOrthographicLH(fGridRadius * 2.0f, fGridRadius * 2.0f, PSSM_LIGHT_NEAR, fMaxDistance); - m_mView = SMMatrixLookToLH(vGridCenter - vLightDir * (fMaxDistance /*- fRadius * 2*/ * 0.5f), vLightDir, vUpDir); + ((CXLightSun*)m_pLight)->getReflectiveVP(&m_mView, &m_mProj); } - void CReflectiveShadowSun::genLPV(bool isDebug) { if(!m_pDevice || !(m_pLight->getRenderType() & LRT_LPV)) diff --git a/source/light/shadow.h b/source/light/shadow.h index 8c6411b2c..dd2850b06 100644 --- a/source/light/shadow.h +++ b/source/light/shadow.h @@ -182,7 +182,6 @@ private: //########################################################################## -#define PSSM_MAX_SPLITS 6 class CShadowPSSM: public IBaseShadowMap { public: @@ -215,6 +214,7 @@ private: IGXTextureCube *m_pDepthMap = NULL; +#if 0 struct Split { SX_ALIGNED_OP_MEM2(); @@ -224,6 +224,7 @@ private: float4x4 mProj; }; Split m_splits[PSSM_MAX_SPLITS]; +#endif float4x4 m_mScaleBiasMat; float m_fBias = 0.0001f; @@ -235,10 +236,6 @@ private: struct { - struct - { - SMMATRIX mVP[PSSM_MAX_SPLITS]; - } gs; struct { SMMATRIX mMatrixTextureV[PSSM_MAX_SPLITS]; diff --git a/source/render/RenderableVisibility.cpp b/source/render/RenderableVisibility.cpp index 5238e9dc5..c4dbf10e7 100644 --- a/source/render/RenderableVisibility.cpp +++ b/source/render/RenderableVisibility.cpp @@ -17,7 +17,7 @@ CRenderableVisibility::~CRenderableVisibility() mem_delete_a(m_ppVisibilities); } -ID CRenderableVisibility::getPluginId() +ID CRenderableVisibility::getPluginId() const { return(m_idPlugin); } @@ -76,6 +76,13 @@ IXRenderableVisibility *CRenderableVisibility::getVisibility(ID id) return(m_ppVisibilities[id]); } +const IXRenderableVisibility *CRenderableVisibility::getVisibility(ID id) const +{ + assert(ID_VALID(id) && (UINT)id < m_uRenderSystems); + + return(m_ppVisibilities[id]); +} + void CRenderableVisibility::setVisibility(ID id, IXRenderableVisibility *pVisibility) { assert(ID_VALID(id) && (UINT)id < m_uRenderSystems); @@ -89,3 +96,31 @@ void CRenderableVisibility::setVisibility(ID id, IXRenderableVisibility *pVisibi pVisibility->AddRef(); } } + +void CRenderableVisibility::append(const IXRenderableVisibility *pOther_) +{ + assert(pOther_->getPluginId() == getPluginId()); + const CRenderableVisibility *pOther = (const CRenderableVisibility*)pOther_; + + for(UINT i = 0; i < m_uRenderSystems; ++i) + { + if(m_ppVisibilities[i]) + { + m_ppVisibilities[i]->append(pOther->getVisibility(i)); + } + } +} + +void CRenderableVisibility::substract(const IXRenderableVisibility *pOther_) +{ + assert(pOther_->getPluginId() == getPluginId()); + const CRenderableVisibility *pOther = (const CRenderableVisibility*)pOther_; + + for(UINT i = 0; i < m_uRenderSystems; ++i) + { + if(m_ppVisibilities[i]) + { + m_ppVisibilities[i]->substract(pOther->getVisibility(i)); + } + } +} diff --git a/source/render/RenderableVisibility.h b/source/render/RenderableVisibility.h index 7da8d03dd..8dc72ff49 100644 --- a/source/render/RenderableVisibility.h +++ b/source/render/RenderableVisibility.h @@ -9,17 +9,22 @@ public: CRenderableVisibility(ID idPlugin, UINT uRenderSystems); ~CRenderableVisibility(); - ID getPluginId(); + ID getPluginId() const override; - void setOcclusionCuller(IXOcclusionCuller *pOcclusionCuller); + void setOcclusionCuller(IXOcclusionCuller *pOcclusionCuller) override; - void updateForCamera(ICamera *pCamera, const IXRenderableVisibility *pReference = NULL); + void updateForCamera(ICamera *pCamera, const IXRenderableVisibility *pReference = NULL) override; - void updateForFrustum(const IFrustum *pFrustum, const IXRenderableVisibility *pReference = NULL); + void updateForFrustum(const IFrustum *pFrustum, const IXRenderableVisibility *pReference = NULL) override; IXRenderableVisibility *getVisibility(ID id); + const IXRenderableVisibility *getVisibility(ID id) const; void setVisibility(ID id, IXRenderableVisibility *pVisibility); + void append(const IXRenderableVisibility *pOther) override; + + void substract(const IXRenderableVisibility *pOther) override; + protected: IXRenderableVisibility **m_ppVisibilities; UINT m_uRenderSystems; diff --git a/source/xcommon/IXRenderable.h b/source/xcommon/IXRenderable.h index b1938bb1c..eea46c646 100644 --- a/source/xcommon/IXRenderable.h +++ b/source/xcommon/IXRenderable.h @@ -21,7 +21,7 @@ class IFrustum; class IXRenderableVisibility: public IXUnknown { public: - virtual ID getPluginId() = 0; + virtual ID getPluginId() const = 0; //! Установка отсекателя по перекрытию virtual void setOcclusionCuller(IXOcclusionCuller *pOcclusionCuller) = 0; @@ -36,6 +36,12 @@ public: Возвращает ID задачи из менеджера задач для отслеживания завершения внутренних задач */ // virtual ID updateForCameraThreaded(ICamera *pCamera) = 0; + + //! Добввление к текущему набору видимости другого набора + virtual void append(const IXRenderableVisibility *pOther) = 0; + + //! Вычитание из текущего набора видимости другого набора + virtual void substract(const IXRenderableVisibility *pOther) = 0; }; struct XTransparentObject -- GitLab