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 726c748578
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++)
{
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);
}

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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