diff --git a/Engine/source/gfx/D3D11/gfxD3D11Device.cpp b/Engine/source/gfx/D3D11/gfxD3D11Device.cpp index 8a96ed125..e2fec68e8 100644 --- a/Engine/source/gfx/D3D11/gfxD3D11Device.cpp +++ b/Engine/source/gfx/D3D11/gfxD3D11Device.cpp @@ -952,7 +952,7 @@ void GFXD3D11Device::clear(U32 flags, const LinearColorF& color, F32 z, U32 sten { for (U32 i = 0; i < 5; i++) { - if(rtView[i]) + if (rtView[i]) mD3DDeviceContext->ClearRenderTargetView(rtView[i], clearColor); } } @@ -968,7 +968,6 @@ void GFXD3D11Device::clear(U32 flags, const LinearColorF& color, F32 z, U32 sten 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 8ed519232..1c68d3590 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); _registerFeatures(); } @@ -114,7 +116,8 @@ RenderDeferredMgr::~RenderDeferredMgr() mColorTarget.release(); mMatInfoTarget.release(); - mLightMapTarget.release(); + mDiffuseLightTarget.release(); + mSpecularLightTarget.release(); _unregisterFeatures(); SAFE_DELETE( mDeferredMatInstance ); } @@ -138,7 +141,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; } @@ -185,16 +189,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(); diff --git a/Engine/source/renderInstance/renderDeferredMgr.h b/Engine/source/renderInstance/renderDeferredMgr.h index f487d4d78..cdfe2755a 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; @@ -105,11 +106,13 @@ protected: // Deferred Shading NamedTexTarget mColorTarget; NamedTexTarget mMatInfoTarget; - NamedTexTarget mLightMapTarget; + NamedTexTarget mDiffuseLightTarget; + NamedTexTarget mSpecularLightTarget; GFXTexHandle mColorTex; GFXTexHandle mMatInfoTex; - GFXTexHandle mLightMapTex; - + GFXTexHandle mDiffuseLightTex; + GFXTexHandle mSpecularLightTex; + GFXShaderConstBufferRef mShaderConsts; }; //------------------------------------------------------------------------------ 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)