From e72f04648a04a33a168414deabc2b30607dc5acc Mon Sep 17 00:00:00 2001 From: Areloch Date: Wed, 24 Oct 2018 23:43:12 -0500 Subject: [PATCH] Adjusts the lightbin manager to be a regular bin, and shifts ownership of both lighting targets to the deferred manager. Probes now render ahead of lights to make the additive order jive. Also reordered the probe targets used so they match lights for consistency. --- Engine/source/gfx/D3D11/gfxD3D11Device.cpp | 16 ++++-- .../advanced/advancedLightBinManager.cpp | 57 ++++++++++++++----- .../advanced/advancedLightBinManager.h | 4 +- .../advanced/advancedLightManager.cpp | 16 +++--- .../renderInstance/renderDeferredMgr.cpp | 42 ++++++++++---- .../source/renderInstance/renderDeferredMgr.h | 9 ++- .../source/renderInstance/renderProbeMgr.cpp | 6 +- .../game/core/scripts/client/renderManager.cs | 2 +- .../lighting/advanced/reflectionProbeP.hlsl | 4 +- 9 files changed, 108 insertions(+), 48 deletions(-) diff --git a/Engine/source/gfx/D3D11/gfxD3D11Device.cpp b/Engine/source/gfx/D3D11/gfxD3D11Device.cpp index 5ecde9fb7..e2fec68e8 100644 --- a/Engine/source/gfx/D3D11/gfxD3D11Device.cpp +++ b/Engine/source/gfx/D3D11/gfxD3D11Device.cpp @@ -940,15 +940,22 @@ void GFXD3D11Device::clear(U32 flags, const LinearColorF& color, F32 z, U32 sten UINT depthstencilFlag = 0; - ID3D11RenderTargetView* rtView = NULL; + //TODO: current support is 5 render targets, clean this up + ID3D11RenderTargetView* rtView[5] = { NULL }; ID3D11DepthStencilView* dsView = NULL; - mD3DDeviceContext->OMGetRenderTargets(1, &rtView, &dsView); + mD3DDeviceContext->OMGetRenderTargets(5, rtView, &dsView); const FLOAT clearColor[4] = { color.red, color.green, color.blue, color.alpha }; if (flags & GFXClearTarget && rtView) - mD3DDeviceContext->ClearRenderTargetView(rtView, clearColor); + { + for (U32 i = 0; i < 5; i++) + { + if (rtView[i]) + mD3DDeviceContext->ClearRenderTargetView(rtView[i], clearColor); + } + } if (flags & GFXClearZBuffer) depthstencilFlag |= D3D11_CLEAR_DEPTH; @@ -959,7 +966,8 @@ void GFXD3D11Device::clear(U32 flags, const LinearColorF& color, F32 z, U32 sten if (depthstencilFlag && dsView) mD3DDeviceContext->ClearDepthStencilView(dsView, depthstencilFlag, z, stencil); - SAFE_RELEASE(rtView); + for (U32 i = 0; i < 5; i++) + SAFE_RELEASE(rtView[i]); SAFE_RELEASE(dsView); } diff --git a/Engine/source/lighting/advanced/advancedLightBinManager.cpp b/Engine/source/lighting/advanced/advancedLightBinManager.cpp index eb7a44bd4..cc3267b41 100644 --- a/Engine/source/lighting/advanced/advancedLightBinManager.cpp +++ b/Engine/source/lighting/advanced/advancedLightBinManager.cpp @@ -116,20 +116,19 @@ ConsoleDocClass( AdvancedLightBinManager, AdvancedLightBinManager::AdvancedLightBinManager( AdvancedLightManager *lm /* = NULL */, ShadowMapManager *sm /* = NULL */, GFXFormat lightBufferFormat /* = GFXFormatR8G8B8A8 */ ) - : RenderTexTargetBinManager( RIT_LightInfo, 1.0f, 1.0f, lightBufferFormat ), + : RenderBinManager( RIT_LightInfo, 1.0f, 1.0f ), mNumLightsCulled(0), mLightManager(lm), mShadowManager(sm), mConditioner(NULL) { // Create an RGB conditioner - mConditioner = new AdvancedLightBufferConditioner( getTargetFormat(), - AdvancedLightBufferConditioner::RGB ); - mNamedTarget.setConditioner( mConditioner ); - mNamedTarget.registerWithName( smBufferName ); + NamedTexTarget* specLightTarg = NamedTexTarget::find(RenderDeferredMgr::SpecularLightBufferName); - // We want a full-resolution buffer - mTargetSizeType = RenderTexTargetBinManager::WindowSize; + mConditioner = new AdvancedLightBufferConditioner(lightBufferFormat, + AdvancedLightBufferConditioner::RGB ); + + specLightTarg->setConditioner( mConditioner ); mMRTLightmapsDuringDeferred = true; @@ -173,17 +172,18 @@ void AdvancedLightBinManager::consoleInit() bool AdvancedLightBinManager::setTargetSize(const Point2I &newTargetSize) { - bool ret = Parent::setTargetSize( newTargetSize ); + /*bool ret = Parent::setTargetSize( newTargetSize ); // We require the viewport to match the default. mNamedTarget.setViewport( GFX->getViewport() ); - return ret; + return ret;*/ + return true; } bool AdvancedLightBinManager::_updateTargets() { - PROFILE_SCOPE(AdvancedLightBinManager_updateTargets); + /* PROFILE_SCOPE(AdvancedLightBinManager_updateTargets); bool ret = Parent::_updateTargets(); @@ -198,7 +198,8 @@ bool AdvancedLightBinManager::_updateTargets() GFX->finalizeReset(); - return ret; + return ret;*/ + return true; } void AdvancedLightBinManager::addLight( LightInfo *light ) @@ -270,10 +271,36 @@ void AdvancedLightBinManager::render( SceneRenderState *state ) GFXDEBUGEVENT_SCOPE( AdvancedLightBinManager_Render, ColorI::RED ); // Tell the superclass we're about to render - if ( !_onPreRender( state ) ) + //if ( !_onPreRender( state ) ) + // return; + + //GFX->clear(GFXClearTarget, ColorI(0, 0, 0, 0), 1.0f, 0); + + NamedTexTargetRef diffuseLightingTarget = NamedTexTarget::find("diffuseLighting"); + + if (diffuseLightingTarget.isNull()) return; - GFX->clear(GFXClearTarget, ColorI(0, 0, 0, 0), 1.0f, 0); + NamedTexTargetRef specularLightingTarget = NamedTexTarget::find("specularLighting"); + + if (specularLightingTarget.isNull()) + return; + + GFXTextureTargetRef lightingTargetRef = GFX->allocRenderToTextureTarget(); + + if (lightingTargetRef.isNull()) + return; + + //Do a quick pass to update our probes if they're dirty + PROBEMGR->updateDirtyProbes(); + + lightingTargetRef->attachTexture(GFXTextureTarget::Color0, specularLightingTarget->getTexture()); + lightingTargetRef->attachTexture(GFXTextureTarget::Color1, diffuseLightingTarget->getTexture()); + + GFX->pushActiveRenderTarget(); + GFX->setActiveRenderTarget(lightingTargetRef); + + GFX->setViewport(specularLightingTarget->getViewport()); // Restore transforms MatrixSet &matrixSet = getRenderPass()->getMatrixSet(); @@ -387,7 +414,9 @@ void AdvancedLightBinManager::render( SceneRenderState *state ) getRenderSignal().trigger(state, this); // Finish up the rendering - _onPostRender(); + //_onPostRender(); + lightingTargetRef->resolve(); + GFX->popActiveRenderTarget(); } AdvancedLightBinManager::LightMaterialInfo* AdvancedLightBinManager::_getLightMaterial( LightInfo::Type lightType, diff --git a/Engine/source/lighting/advanced/advancedLightBinManager.h b/Engine/source/lighting/advanced/advancedLightBinManager.h index 3ef926928..fe2515382 100644 --- a/Engine/source/lighting/advanced/advancedLightBinManager.h +++ b/Engine/source/lighting/advanced/advancedLightBinManager.h @@ -78,9 +78,9 @@ public: bool mSpecialLight; }; -class AdvancedLightBinManager : public RenderTexTargetBinManager +class AdvancedLightBinManager : public RenderBinManager { - typedef RenderTexTargetBinManager Parent; + typedef RenderBinManager Parent; public: diff --git a/Engine/source/lighting/advanced/advancedLightManager.cpp b/Engine/source/lighting/advanced/advancedLightManager.cpp index 3c851cf81..8097b3ef3 100644 --- a/Engine/source/lighting/advanced/advancedLightManager.cpp +++ b/Engine/source/lighting/advanced/advancedLightManager.cpp @@ -115,22 +115,22 @@ void AdvancedLightManager::activate( SceneManager *sceneManager ) true, false ); - mLightBinManager = new AdvancedLightBinManager( this, SHADOWMGR, blendTargetFormat ); - mLightBinManager->assignName( "AL_LightBinMgr" ); - // First look for the deferred bin... RenderDeferredMgr *deferredBin = _findDeferredRenderBin(); // If we didn't find the deferred bin then add one. - if ( !deferredBin ) + if (!deferredBin) { - deferredBin = new RenderDeferredMgr( true, blendTargetFormat ); - deferredBin->assignName( "AL_DeferredBin" ); + deferredBin = new RenderDeferredMgr(true, blendTargetFormat); + deferredBin->assignName("AL_DeferredBin"); deferredBin->registerObject(); - getSceneManager()->getDefaultRenderPass()->addManager( deferredBin ); + getSceneManager()->getDefaultRenderPass()->addManager(deferredBin); mDeferredRenderBin = deferredBin; } + mLightBinManager = new AdvancedLightBinManager( this, SHADOWMGR, blendTargetFormat ); + mLightBinManager->assignName( "AL_LightBinMgr" ); + // Tell the material manager that deferred is enabled. MATMGR->setDeferredEnabled( true ); @@ -138,7 +138,7 @@ void AdvancedLightManager::activate( SceneManager *sceneManager ) mLightBinManager->setRenderOrder( deferredBin->getRenderOrder() + 0.01f ); getSceneManager()->getDefaultRenderPass()->addManager( mLightBinManager ); - AdvancedLightingFeatures::registerFeatures(mDeferredRenderBin->getTargetFormat(), mLightBinManager->getTargetFormat()); + AdvancedLightingFeatures::registerFeatures(mDeferredRenderBin->getTargetFormat(), blendTargetFormat); // Last thing... let everyone know we're active. smActivateSignal.trigger( getId(), true ); diff --git a/Engine/source/renderInstance/renderDeferredMgr.cpp b/Engine/source/renderInstance/renderDeferredMgr.cpp index 4ceac2aca..3b24741ac 100644 --- a/Engine/source/renderInstance/renderDeferredMgr.cpp +++ b/Engine/source/renderInstance/renderDeferredMgr.cpp @@ -56,7 +56,8 @@ const String RenderDeferredMgr::BufferName("deferred"); const RenderInstType RenderDeferredMgr::RIT_Deferred("Deferred"); const String RenderDeferredMgr::ColorBufferName("color"); const String RenderDeferredMgr::MatInfoBufferName("matinfo"); -const String RenderDeferredMgr::LightMapBufferName("diffuseLighting"); +const String RenderDeferredMgr::DiffuseLightBufferName("diffuseLighting"); +const String RenderDeferredMgr::SpecularLightBufferName("specularLighting"); IMPLEMENT_CONOBJECT(RenderDeferredMgr); @@ -103,7 +104,8 @@ RenderDeferredMgr::RenderDeferredMgr( bool gatherDepth, mNamedTarget.registerWithName( BufferName ); mColorTarget.registerWithName( ColorBufferName ); mMatInfoTarget.registerWithName( MatInfoBufferName ); - mLightMapTarget.registerWithName( LightMapBufferName ); + mDiffuseLightTarget.registerWithName( DiffuseLightBufferName ); + mSpecularLightTarget.registerWithName(SpecularLightBufferName); mClearGBufferShader = NULL; @@ -116,7 +118,8 @@ RenderDeferredMgr::~RenderDeferredMgr() mColorTarget.release(); mMatInfoTarget.release(); - mLightMapTarget.release(); + mDiffuseLightTarget.release(); + mSpecularLightTarget.release(); _unregisterFeatures(); SAFE_DELETE( mDeferredMatInstance ); } @@ -140,7 +143,8 @@ bool RenderDeferredMgr::setTargetSize(const Point2I &newTargetSize) mNamedTarget.setViewport( GFX->getViewport() ); mColorTarget.setViewport( GFX->getViewport() ); mMatInfoTarget.setViewport( GFX->getViewport() ); - mLightMapTarget.setViewport( GFX->getViewport() ); + mDiffuseLightTarget.setViewport( GFX->getViewport() ); + mSpecularLightTarget.setViewport(GFX->getViewport()); return ret; } @@ -187,16 +191,28 @@ bool RenderDeferredMgr::_updateTargets() mTargetChain[i]->attachTexture(GFXTextureTarget::Color2, mMatInfoTarget.getTexture()); } - if (mLightMapTex.getFormat() != GFXFormatR16G16B16A16F || mLightMapTex.getWidthHeight() != mTargetSize || GFX->recentlyReset()) + if (mDiffuseLightTex.getFormat() != GFXFormatR16G16B16A16F || mDiffuseLightTex.getWidthHeight() != mTargetSize || GFX->recentlyReset()) { - mLightMapTarget.release(); - mLightMapTex.set(mTargetSize.x, mTargetSize.y, GFXFormatR16G16B16A16F, + mDiffuseLightTarget.release(); + mDiffuseLightTex.set(mTargetSize.x, mTargetSize.y, GFXFormatR16G16B16A16F, &GFXRenderTargetProfile, avar("%s() - (line %d)", __FUNCTION__, __LINE__), 1, GFXTextureManager::AA_MATCH_BACKBUFFER); - mLightMapTarget.setTexture(mLightMapTex); + mDiffuseLightTarget.setTexture(mDiffuseLightTex); for (U32 i = 0; i < mTargetChainLength; i++) - mTargetChain[i]->attachTexture(GFXTextureTarget::Color3, mLightMapTarget.getTexture()); + mTargetChain[i]->attachTexture(GFXTextureTarget::Color3, mDiffuseLightTarget.getTexture()); + } + + if (mSpecularLightTex.getFormat() != GFXFormatR16G16B16A16F || mSpecularLightTex.getWidthHeight() != mTargetSize || GFX->recentlyReset()) + { + mSpecularLightTarget.release(); + mSpecularLightTex.set(mTargetSize.x, mTargetSize.y, GFXFormatR16G16B16A16F, + &GFXRenderTargetProfile, avar("%s() - (line %d)", __FUNCTION__, __LINE__), + 1, GFXTextureManager::AA_MATCH_BACKBUFFER); + mSpecularLightTarget.setTexture(mSpecularLightTex); + + for (U32 i = 0; i < mTargetChainLength; i++) + mTargetChain[i]->attachTexture(GFXTextureTarget::Color4, mSpecularLightTarget.getTexture()); } GFX->finalizeReset(); _initShaders(); @@ -323,8 +339,12 @@ void RenderDeferredMgr::render( SceneRenderState *state ) // Tell the superclass we're about to render const bool isRenderingToTarget = _onPreRender(state); - // Clear all z-buffer, and g-buffer. - clearBuffers(); + // Clear z-buffer and g-buffer. + GFX->clear(GFXClearTarget | GFXClearZBuffer | GFXClearStencil, ColorI::ZERO, 1.0f, 0); + GFX->clearColorAttachment(0, LinearColorF::ONE); + GFX->clearColorAttachment(1, LinearColorF::ZERO); + GFX->clearColorAttachment(2, LinearColorF::ZERO); + GFX->clearColorAttachment(3, LinearColorF::ZERO); // Restore transforms MatrixSet &matrixSet = getRenderPass()->getMatrixSet(); diff --git a/Engine/source/renderInstance/renderDeferredMgr.h b/Engine/source/renderInstance/renderDeferredMgr.h index 35ff93406..77ad134dc 100644 --- a/Engine/source/renderInstance/renderDeferredMgr.h +++ b/Engine/source/renderInstance/renderDeferredMgr.h @@ -46,7 +46,8 @@ public: // andremwac: Deferred Rendering static const String ColorBufferName; static const String MatInfoBufferName; - static const String LightMapBufferName; + static const String DiffuseLightBufferName; + static const String SpecularLightBufferName; // Generic Deferred Render Instance Type static const RenderInstType RIT_Deferred; @@ -108,10 +109,12 @@ protected: GFXStateBlockRef mStateblock; NamedTexTarget mColorTarget; NamedTexTarget mMatInfoTarget; - NamedTexTarget mLightMapTarget; + NamedTexTarget mDiffuseLightTarget; + NamedTexTarget mSpecularLightTarget; GFXTexHandle mColorTex; GFXTexHandle mMatInfoTex; - GFXTexHandle mLightMapTex; + GFXTexHandle mDiffuseLightTex; + GFXTexHandle mSpecularLightTex; GFXShaderConstBufferRef mShaderConsts; public: diff --git a/Engine/source/renderInstance/renderProbeMgr.cpp b/Engine/source/renderInstance/renderProbeMgr.cpp index 199933e17..f75be6fd1 100644 --- a/Engine/source/renderInstance/renderProbeMgr.cpp +++ b/Engine/source/renderInstance/renderProbeMgr.cpp @@ -227,13 +227,13 @@ void RenderProbeMgr::render( SceneRenderState *state ) //Do a quick pass to update our probes if they're dirty PROBEMGR->updateDirtyProbes(); - probeLightingTargetRef->attachTexture(GFXTextureTarget::Color0, diffuseLightingTarget->getTexture()); - probeLightingTargetRef->attachTexture(GFXTextureTarget::Color1, specularLightingTarget->getTexture()); + probeLightingTargetRef->attachTexture(GFXTextureTarget::Color0, specularLightingTarget->getTexture()); + probeLightingTargetRef->attachTexture(GFXTextureTarget::Color1, diffuseLightingTarget->getTexture()); GFX->pushActiveRenderTarget(); GFX->setActiveRenderTarget(probeLightingTargetRef); - GFX->setViewport(diffuseLightingTarget->getViewport()); + GFX->setViewport(specularLightingTarget->getViewport()); //GFX->setViewport(specularLightingTarget->getViewport()); // Restore transforms diff --git a/Templates/Full/game/core/scripts/client/renderManager.cs b/Templates/Full/game/core/scripts/client/renderManager.cs index 34095c4d3..265c88508 100644 --- a/Templates/Full/game/core/scripts/client/renderManager.cs +++ b/Templates/Full/game/core/scripts/client/renderManager.cs @@ -51,7 +51,7 @@ function initRenderManager() // meshes... but that causes issues in reflections. DiffuseRenderPassManager.addManager( new RenderObjectMgr(SkyBin) { bintype = "Sky"; renderOrder = 0.015; processAddOrder = 0.015; } ); - DiffuseRenderPassManager.addManager( new RenderProbeMgr(ProbeBin) { bintype = "Probes"; renderOrder = 0.02; processAddOrder = 0.02; } ); + DiffuseRenderPassManager.addManager( new RenderProbeMgr(ProbeBin) { bintype = "Probes"; renderOrder = 0.019; processAddOrder = 0.02; } ); //DiffuseRenderPassManager.addManager( new RenderVistaMgr() { bintype = "Vista"; renderOrder = 0.15; processAddOrder = 0.15; } ); DiffuseRenderPassManager.addManager( new RenderObjectMgr(BeginBin) { bintype = "Begin"; renderOrder = 0.2; processAddOrder = 0.2; } ); diff --git a/Templates/Full/game/shaders/common/lighting/advanced/reflectionProbeP.hlsl b/Templates/Full/game/shaders/common/lighting/advanced/reflectionProbeP.hlsl index 08493a6f9..c572ff11f 100644 --- a/Templates/Full/game/shaders/common/lighting/advanced/reflectionProbeP.hlsl +++ b/Templates/Full/game/shaders/common/lighting/advanced/reflectionProbeP.hlsl @@ -98,8 +98,8 @@ float3 iblBoxSpecular(float3 normal, struct PS_OUTPUT { - float4 diffuse: TORQUE_TARGET0; - float4 spec: TORQUE_TARGET1; + float4 diffuse: TORQUE_TARGET1; + float4 spec: TORQUE_TARGET0; }; float defineSphereSpaceInfluence(float3 centroidPosVS, float rad, float2 atten, float3 surfPosVS, float3 norm)