Explorar el Código

Merge branch 'PBR_Bins_Reordered' of https://github.com/Areloch/Torque3D into PBR_PR

# Conflicts:
#	Engine/source/gfx/D3D11/gfxD3D11Device.cpp
#	Engine/source/renderInstance/renderDeferredMgr.h
Azaezel hace 6 años
padre
commit
8fadf880a3

+ 1 - 2
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);
 }
 

+ 42 - 13
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(), 
+   NamedTexTarget* specLightTarg = NamedTexTarget::find(RenderDeferredMgr::SpecularLightBufferName);
+
+   mConditioner = new AdvancedLightBufferConditioner(lightBufferFormat,
                                                       AdvancedLightBufferConditioner::RGB );
-   mNamedTarget.setConditioner( mConditioner ); 
-   mNamedTarget.registerWithName( smBufferName );
 
-   // We want a full-resolution buffer
-   mTargetSizeType = RenderTexTargetBinManager::WindowSize;
+   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, 

+ 2 - 2
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:
 

+ 8 - 8
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 );

+ 25 - 9
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();
 

+ 7 - 4
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; 
 };
 
 //------------------------------------------------------------------------------

+ 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
    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

+ 1 - 1
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; } );

+ 2 - 2
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)