2
0
Эх сурвалжийг харах

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.

Areloch 6 жил өмнө
parent
commit
e72f04648a

+ 12 - 4
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;
    UINT depthstencilFlag = 0;
 
 
-   ID3D11RenderTargetView* rtView = NULL;
+   //TODO: current support is 5 render targets, clean this up
+   ID3D11RenderTargetView* rtView[5] = { NULL };
    ID3D11DepthStencilView* dsView = 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 };
    const FLOAT clearColor[4] = { color.red, color.green, color.blue, color.alpha };
 
 
    if (flags & GFXClearTarget && rtView)
    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)
    if (flags & GFXClearZBuffer)
       depthstencilFlag |= D3D11_CLEAR_DEPTH;
       depthstencilFlag |= D3D11_CLEAR_DEPTH;
@@ -959,7 +966,8 @@ void GFXD3D11Device::clear(U32 flags, const LinearColorF& color, F32 z, U32 sten
    if (depthstencilFlag && dsView)
    if (depthstencilFlag && dsView)
       mD3DDeviceContext->ClearDepthStencilView(dsView, depthstencilFlag, z, stencil);
       mD3DDeviceContext->ClearDepthStencilView(dsView, depthstencilFlag, z, stencil);
 
 
-   SAFE_RELEASE(rtView);
+   for (U32 i = 0; i < 5; i++)
+      SAFE_RELEASE(rtView[i]);
    SAFE_RELEASE(dsView);
    SAFE_RELEASE(dsView);
 }
 }
 
 

+ 42 - 13
Engine/source/lighting/advanced/advancedLightBinManager.cpp

@@ -116,20 +116,19 @@ ConsoleDocClass( AdvancedLightBinManager,
 AdvancedLightBinManager::AdvancedLightBinManager( AdvancedLightManager *lm /* = NULL */, 
 AdvancedLightBinManager::AdvancedLightBinManager( AdvancedLightManager *lm /* = NULL */, 
                                                  ShadowMapManager *sm /* = NULL */, 
                                                  ShadowMapManager *sm /* = NULL */, 
                                                  GFXFormat lightBufferFormat /* = GFXFormatR8G8B8A8 */ )
                                                  GFXFormat lightBufferFormat /* = GFXFormatR8G8B8A8 */ )
-   :  RenderTexTargetBinManager( RIT_LightInfo, 1.0f, 1.0f, lightBufferFormat ), 
+   :  RenderBinManager( RIT_LightInfo, 1.0f, 1.0f ), 
       mNumLightsCulled(0), 
       mNumLightsCulled(0), 
       mLightManager(lm), 
       mLightManager(lm), 
       mShadowManager(sm),
       mShadowManager(sm),
       mConditioner(NULL)
       mConditioner(NULL)
 {
 {
    // Create an RGB conditioner
    // Create an RGB conditioner
-   mConditioner = new AdvancedLightBufferConditioner( getTargetFormat(), 
+   NamedTexTarget* specLightTarg = NamedTexTarget::find(RenderDeferredMgr::SpecularLightBufferName);
+
+   mConditioner = new AdvancedLightBufferConditioner(lightBufferFormat,
                                                       AdvancedLightBufferConditioner::RGB );
                                                       AdvancedLightBufferConditioner::RGB );
-   mNamedTarget.setConditioner( mConditioner ); 
-   mNamedTarget.registerWithName( smBufferName );
 
 
-   // We want a full-resolution buffer
-   mTargetSizeType = RenderTexTargetBinManager::WindowSize;
+   specLightTarg->setConditioner( mConditioner );
 
 
    mMRTLightmapsDuringDeferred = true;
    mMRTLightmapsDuringDeferred = true;
 
 
@@ -173,17 +172,18 @@ void AdvancedLightBinManager::consoleInit()
 
 
 bool AdvancedLightBinManager::setTargetSize(const Point2I &newTargetSize)
 bool AdvancedLightBinManager::setTargetSize(const Point2I &newTargetSize)
 {
 {
-   bool ret = Parent::setTargetSize( newTargetSize );
+   /*bool ret = Parent::setTargetSize( newTargetSize );
 
 
    // We require the viewport to match the default.
    // We require the viewport to match the default.
    mNamedTarget.setViewport( GFX->getViewport() );
    mNamedTarget.setViewport( GFX->getViewport() );
 
 
-   return ret;
+   return ret;*/
+   return true;
 }
 }
 
 
 bool AdvancedLightBinManager::_updateTargets()
 bool AdvancedLightBinManager::_updateTargets()
 {
 {
-   PROFILE_SCOPE(AdvancedLightBinManager_updateTargets);
+  /* PROFILE_SCOPE(AdvancedLightBinManager_updateTargets);
 
 
    bool ret = Parent::_updateTargets();
    bool ret = Parent::_updateTargets();
 
 
@@ -198,7 +198,8 @@ bool AdvancedLightBinManager::_updateTargets()
 
 
    GFX->finalizeReset();
    GFX->finalizeReset();
 
 
-   return ret;
+   return ret;*/
+   return true;
 }
 }
 
 
 void AdvancedLightBinManager::addLight( LightInfo *light )
 void AdvancedLightBinManager::addLight( LightInfo *light )
@@ -270,10 +271,36 @@ void AdvancedLightBinManager::render( SceneRenderState *state )
    GFXDEBUGEVENT_SCOPE( AdvancedLightBinManager_Render, ColorI::RED );
    GFXDEBUGEVENT_SCOPE( AdvancedLightBinManager_Render, ColorI::RED );
 
 
    // Tell the superclass we're about to render
    // 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;
       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
    // Restore transforms
    MatrixSet &matrixSet = getRenderPass()->getMatrixSet();
    MatrixSet &matrixSet = getRenderPass()->getMatrixSet();
@@ -387,7 +414,9 @@ void AdvancedLightBinManager::render( SceneRenderState *state )
    getRenderSignal().trigger(state, this);
    getRenderSignal().trigger(state, this);
 
 
    // Finish up the rendering
    // Finish up the rendering
-   _onPostRender();
+   //_onPostRender();
+   lightingTargetRef->resolve();
+   GFX->popActiveRenderTarget();
 }
 }
 
 
 AdvancedLightBinManager::LightMaterialInfo* AdvancedLightBinManager::_getLightMaterial(   LightInfo::Type lightType, 
 AdvancedLightBinManager::LightMaterialInfo* AdvancedLightBinManager::_getLightMaterial(   LightInfo::Type lightType, 

+ 2 - 2
Engine/source/lighting/advanced/advancedLightBinManager.h

@@ -78,9 +78,9 @@ public:
    bool mSpecialLight;
    bool mSpecialLight;
 };
 };
 
 
-class AdvancedLightBinManager : public RenderTexTargetBinManager
+class AdvancedLightBinManager : public RenderBinManager
 {
 {
-   typedef RenderTexTargetBinManager Parent;
+   typedef RenderBinManager Parent;
 
 
 public:
 public:
 
 

+ 8 - 8
Engine/source/lighting/advanced/advancedLightManager.cpp

@@ -115,22 +115,22 @@ void AdvancedLightManager::activate( SceneManager *sceneManager )
                                                          true,
                                                          true,
                                                          false );
                                                          false );
 
 
-   mLightBinManager = new AdvancedLightBinManager( this, SHADOWMGR, blendTargetFormat );
-   mLightBinManager->assignName( "AL_LightBinMgr" );
-
    // First look for the deferred bin...
    // First look for the deferred bin...
    RenderDeferredMgr *deferredBin = _findDeferredRenderBin();
    RenderDeferredMgr *deferredBin = _findDeferredRenderBin();
 
 
    // If we didn't find the deferred bin then add one.
    // 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();
       deferredBin->registerObject();
-      getSceneManager()->getDefaultRenderPass()->addManager( deferredBin );
+      getSceneManager()->getDefaultRenderPass()->addManager(deferredBin);
       mDeferredRenderBin = deferredBin;
       mDeferredRenderBin = deferredBin;
    }
    }
 
 
+   mLightBinManager = new AdvancedLightBinManager( this, SHADOWMGR, blendTargetFormat );
+   mLightBinManager->assignName( "AL_LightBinMgr" );
+
    // Tell the material manager that deferred is enabled.
    // Tell the material manager that deferred is enabled.
    MATMGR->setDeferredEnabled( true );
    MATMGR->setDeferredEnabled( true );
 
 
@@ -138,7 +138,7 @@ void AdvancedLightManager::activate( SceneManager *sceneManager )
    mLightBinManager->setRenderOrder( deferredBin->getRenderOrder() + 0.01f );
    mLightBinManager->setRenderOrder( deferredBin->getRenderOrder() + 0.01f );
    getSceneManager()->getDefaultRenderPass()->addManager( mLightBinManager );
    getSceneManager()->getDefaultRenderPass()->addManager( mLightBinManager );
 
 
-   AdvancedLightingFeatures::registerFeatures(mDeferredRenderBin->getTargetFormat(), mLightBinManager->getTargetFormat());
+   AdvancedLightingFeatures::registerFeatures(mDeferredRenderBin->getTargetFormat(), blendTargetFormat);
 
 
    // Last thing... let everyone know we're active.
    // Last thing... let everyone know we're active.
    smActivateSignal.trigger( getId(), true );
    smActivateSignal.trigger( getId(), true );

+ 31 - 11
Engine/source/renderInstance/renderDeferredMgr.cpp

@@ -56,7 +56,8 @@ const String RenderDeferredMgr::BufferName("deferred");
 const RenderInstType RenderDeferredMgr::RIT_Deferred("Deferred");
 const RenderInstType RenderDeferredMgr::RIT_Deferred("Deferred");
 const String RenderDeferredMgr::ColorBufferName("color");
 const String RenderDeferredMgr::ColorBufferName("color");
 const String RenderDeferredMgr::MatInfoBufferName("matinfo");
 const String RenderDeferredMgr::MatInfoBufferName("matinfo");
-const String RenderDeferredMgr::LightMapBufferName("diffuseLighting");
+const String RenderDeferredMgr::DiffuseLightBufferName("diffuseLighting");
+const String RenderDeferredMgr::SpecularLightBufferName("specularLighting");
 
 
 IMPLEMENT_CONOBJECT(RenderDeferredMgr);
 IMPLEMENT_CONOBJECT(RenderDeferredMgr);
 
 
@@ -103,7 +104,8 @@ RenderDeferredMgr::RenderDeferredMgr( bool gatherDepth,
    mNamedTarget.registerWithName( BufferName );
    mNamedTarget.registerWithName( BufferName );
    mColorTarget.registerWithName( ColorBufferName );
    mColorTarget.registerWithName( ColorBufferName );
    mMatInfoTarget.registerWithName( MatInfoBufferName );
    mMatInfoTarget.registerWithName( MatInfoBufferName );
-   mLightMapTarget.registerWithName( LightMapBufferName );
+   mDiffuseLightTarget.registerWithName( DiffuseLightBufferName );
+   mSpecularLightTarget.registerWithName(SpecularLightBufferName);
 
 
    mClearGBufferShader = NULL;
    mClearGBufferShader = NULL;
 
 
@@ -116,7 +118,8 @@ RenderDeferredMgr::~RenderDeferredMgr()
 
 
    mColorTarget.release();
    mColorTarget.release();
    mMatInfoTarget.release();
    mMatInfoTarget.release();
-   mLightMapTarget.release();
+   mDiffuseLightTarget.release();
+   mSpecularLightTarget.release();
    _unregisterFeatures();
    _unregisterFeatures();
    SAFE_DELETE( mDeferredMatInstance );
    SAFE_DELETE( mDeferredMatInstance );
 }
 }
@@ -140,7 +143,8 @@ bool RenderDeferredMgr::setTargetSize(const Point2I &newTargetSize)
    mNamedTarget.setViewport( GFX->getViewport() );
    mNamedTarget.setViewport( GFX->getViewport() );
    mColorTarget.setViewport( GFX->getViewport() );
    mColorTarget.setViewport( GFX->getViewport() );
    mMatInfoTarget.setViewport( GFX->getViewport() );
    mMatInfoTarget.setViewport( GFX->getViewport() );
-   mLightMapTarget.setViewport( GFX->getViewport() );
+   mDiffuseLightTarget.setViewport( GFX->getViewport() );
+   mSpecularLightTarget.setViewport(GFX->getViewport());
    return ret;
    return ret;
 }
 }
 
 
@@ -187,16 +191,28 @@ bool RenderDeferredMgr::_updateTargets()
          mTargetChain[i]->attachTexture(GFXTextureTarget::Color2, mMatInfoTarget.getTexture());
          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__),
          &GFXRenderTargetProfile, avar("%s() - (line %d)", __FUNCTION__, __LINE__),
          1, GFXTextureManager::AA_MATCH_BACKBUFFER);
          1, GFXTextureManager::AA_MATCH_BACKBUFFER);
-      mLightMapTarget.setTexture(mLightMapTex);
+      mDiffuseLightTarget.setTexture(mDiffuseLightTex);
 
 
       for (U32 i = 0; i < mTargetChainLength; i++)
       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();
    GFX->finalizeReset();
    _initShaders();
    _initShaders();
@@ -323,8 +339,12 @@ void RenderDeferredMgr::render( SceneRenderState *state )
    // Tell the superclass we're about to render
    // Tell the superclass we're about to render
    const bool isRenderingToTarget = _onPreRender(state);
    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
    // Restore transforms
    MatrixSet &matrixSet = getRenderPass()->getMatrixSet();
    MatrixSet &matrixSet = getRenderPass()->getMatrixSet();

+ 6 - 3
Engine/source/renderInstance/renderDeferredMgr.h

@@ -46,7 +46,8 @@ public:
    // andremwac: Deferred Rendering
    // andremwac: Deferred Rendering
    static const String ColorBufferName;
    static const String ColorBufferName;
    static const String MatInfoBufferName;
    static const String MatInfoBufferName;
-   static const String LightMapBufferName;
+   static const String DiffuseLightBufferName;
+   static const String SpecularLightBufferName;
 
 
    // Generic Deferred Render Instance Type
    // Generic Deferred Render Instance Type
    static const RenderInstType RIT_Deferred;
    static const RenderInstType RIT_Deferred;
@@ -108,10 +109,12 @@ protected:
    GFXStateBlockRef                    mStateblock;
    GFXStateBlockRef                    mStateblock;
    NamedTexTarget                      mColorTarget;
    NamedTexTarget                      mColorTarget;
    NamedTexTarget                      mMatInfoTarget;
    NamedTexTarget                      mMatInfoTarget;
-   NamedTexTarget                      mLightMapTarget;
+   NamedTexTarget                      mDiffuseLightTarget;
+   NamedTexTarget                      mSpecularLightTarget;
    GFXTexHandle                        mColorTex;
    GFXTexHandle                        mColorTex;
    GFXTexHandle                        mMatInfoTex;
    GFXTexHandle                        mMatInfoTex;
-   GFXTexHandle                        mLightMapTex;
+   GFXTexHandle                        mDiffuseLightTex;
+   GFXTexHandle                        mSpecularLightTex;
    GFXShaderConstBufferRef             mShaderConsts; 
    GFXShaderConstBufferRef             mShaderConsts; 
 
 
 public:
 public:

+ 3 - 3
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
    //Do a quick pass to update our probes if they're dirty
    PROBEMGR->updateDirtyProbes();
    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->pushActiveRenderTarget();
    GFX->setActiveRenderTarget(probeLightingTargetRef);
    GFX->setActiveRenderTarget(probeLightingTargetRef);
 
 
-   GFX->setViewport(diffuseLightingTarget->getViewport());
+   GFX->setViewport(specularLightingTarget->getViewport());
    //GFX->setViewport(specularLightingTarget->getViewport());
    //GFX->setViewport(specularLightingTarget->getViewport());
 
 
    // Restore transforms
    // Restore transforms

+ 1 - 1
Templates/Full/game/core/scripts/client/renderManager.cs

@@ -51,7 +51,7 @@ function initRenderManager()
    // meshes... but that causes issues in reflections.
    // meshes... but that causes issues in reflections.
    DiffuseRenderPassManager.addManager( new RenderObjectMgr(SkyBin) { bintype = "Sky"; renderOrder = 0.015; processAddOrder = 0.015; } );
    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 RenderVistaMgr()             { bintype = "Vista"; renderOrder = 0.15; processAddOrder = 0.15; } );
    
    
    DiffuseRenderPassManager.addManager( new RenderObjectMgr(BeginBin)      { bintype = "Begin"; renderOrder = 0.2; processAddOrder = 0.2; } );
    DiffuseRenderPassManager.addManager( new RenderObjectMgr(BeginBin)      { bintype = "Begin"; renderOrder = 0.2; processAddOrder = 0.2; } );

+ 2 - 2
Templates/Full/game/shaders/common/lighting/advanced/reflectionProbeP.hlsl

@@ -98,8 +98,8 @@ float3 iblBoxSpecular(float3 normal,
 
 
 struct PS_OUTPUT
 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)
 float defineSphereSpaceInfluence(float3 centroidPosVS, float rad, float2 atten, float3 surfPosVS, float3 norm)