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
This commit is contained in:
Azaezel 2018-10-25 14:30:12 -05:00
commit 8fadf880a3
9 changed files with 92 additions and 45 deletions

View file

@ -952,7 +952,7 @@ void GFXD3D11Device::clear(U32 flags, const LinearColorF& color, F32 z, U32 sten
{ {
for (U32 i = 0; i < 5; i++) for (U32 i = 0; i < 5; i++)
{ {
if(rtView[i]) if (rtView[i])
mD3DDeviceContext->ClearRenderTargetView(rtView[i], clearColor); 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++) for (U32 i = 0; i < 5; i++)
SAFE_RELEASE(rtView[i]); SAFE_RELEASE(rtView[i]);
SAFE_RELEASE(dsView); SAFE_RELEASE(dsView);
} }

View file

@ -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);
AdvancedLightBufferConditioner::RGB );
mNamedTarget.setConditioner( mConditioner );
mNamedTarget.registerWithName( smBufferName );
// We want a full-resolution buffer mConditioner = new AdvancedLightBufferConditioner(lightBufferFormat,
mTargetSizeType = RenderTexTargetBinManager::WindowSize; AdvancedLightBufferConditioner::RGB );
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,

View file

@ -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:

View file

@ -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 = new RenderDeferredMgr(true, blendTargetFormat);
deferredBin->assignName( "AL_DeferredBin" ); 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 );

View file

@ -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);
_registerFeatures(); _registerFeatures();
} }
@ -114,7 +116,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 );
} }
@ -138,7 +141,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;
} }
@ -185,16 +189,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(); mDiffuseLightTarget.release();
mLightMapTex.set(mTargetSize.x, mTargetSize.y, GFXFormatR16G16B16A16F, 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();

View file

@ -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;
@ -105,11 +106,13 @@ protected:
// Deferred Shading // Deferred Shading
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;
}; };
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------

View file

@ -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::Color0, specularLightingTarget->getTexture());
probeLightingTargetRef->attachTexture(GFXTextureTarget::Color1, 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

View file

@ -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; } );

View file

@ -98,8 +98,8 @@ float3 iblBoxSpecular(float3 normal,
struct PS_OUTPUT struct PS_OUTPUT
{ {
float4 diffuse: TORQUE_TARGET0; float4 diffuse: TORQUE_TARGET1;
float4 spec: 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)