mirror of
https://github.com/TorqueGameEngines/Torque3D.git
synced 2026-02-13 11:43:49 +00:00
lighting single buffer
This commit is contained in:
parent
c4a4fe5304
commit
9e65e940d0
37 changed files with 309 additions and 813 deletions
|
|
@ -56,8 +56,6 @@ const String RenderDeferredMgr::BufferName("deferred");
|
|||
const RenderInstType RenderDeferredMgr::RIT_Deferred("Deferred");
|
||||
const String RenderDeferredMgr::ColorBufferName("color");
|
||||
const String RenderDeferredMgr::MatInfoBufferName("matinfo");
|
||||
const String RenderDeferredMgr::DiffuseLightBufferName("diffuseLighting");
|
||||
const String RenderDeferredMgr::SpecularLightBufferName("specularLighting");
|
||||
|
||||
IMPLEMENT_CONOBJECT(RenderDeferredMgr);
|
||||
|
||||
|
|
@ -104,8 +102,6 @@ RenderDeferredMgr::RenderDeferredMgr( bool gatherDepth,
|
|||
mNamedTarget.registerWithName( BufferName );
|
||||
mColorTarget.registerWithName( ColorBufferName );
|
||||
mMatInfoTarget.registerWithName( MatInfoBufferName );
|
||||
mDiffuseLightTarget.registerWithName( DiffuseLightBufferName );
|
||||
mSpecularLightTarget.registerWithName(SpecularLightBufferName);
|
||||
|
||||
_registerFeatures();
|
||||
}
|
||||
|
|
@ -116,8 +112,6 @@ RenderDeferredMgr::~RenderDeferredMgr()
|
|||
|
||||
mColorTarget.release();
|
||||
mMatInfoTarget.release();
|
||||
mDiffuseLightTarget.release();
|
||||
mSpecularLightTarget.release();
|
||||
_unregisterFeatures();
|
||||
SAFE_DELETE( mDeferredMatInstance );
|
||||
}
|
||||
|
|
@ -141,8 +135,6 @@ bool RenderDeferredMgr::setTargetSize(const Point2I &newTargetSize)
|
|||
mNamedTarget.setViewport( GFX->getViewport() );
|
||||
mColorTarget.setViewport( GFX->getViewport() );
|
||||
mMatInfoTarget.setViewport( GFX->getViewport() );
|
||||
mDiffuseLightTarget.setViewport( GFX->getViewport() );
|
||||
mSpecularLightTarget.setViewport(GFX->getViewport());
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
@ -183,35 +175,25 @@ bool RenderDeferredMgr::_updateTargets()
|
|||
mMatInfoTex.set(mTargetSize.x, mTargetSize.y, matInfoFormat,
|
||||
&GFXRenderTargetProfile, avar("%s() - (line %d)", __FUNCTION__, __LINE__),
|
||||
1, GFXTextureManager::AA_MATCH_BACKBUFFER);
|
||||
mMatInfoTarget.setTexture(mMatInfoTex);
|
||||
mMatInfoTarget.setTexture(mMatInfoTex);
|
||||
|
||||
for (U32 i = 0; i < mTargetChainLength; i++)
|
||||
mTargetChain[i]->attachTexture(GFXTextureTarget::Color2, mMatInfoTarget.getTexture());
|
||||
}
|
||||
|
||||
if (mDiffuseLightTex.getFormat() != GFXFormatR16G16B16A16F || mDiffuseLightTex.getWidthHeight() != mTargetSize || GFX->recentlyReset())
|
||||
//scene color target
|
||||
NamedTexTargetRef sceneColorTargetRef = NamedTexTarget::find("AL_FormatToken");
|
||||
if (sceneColorTargetRef.isValid())
|
||||
{
|
||||
mDiffuseLightTarget.release();
|
||||
mDiffuseLightTex.set(mTargetSize.x, mTargetSize.y, GFXFormatR16G16B16A16F,
|
||||
&GFXRenderTargetProfile, avar("%s() - (line %d)", __FUNCTION__, __LINE__),
|
||||
1, GFXTextureManager::AA_MATCH_BACKBUFFER);
|
||||
mDiffuseLightTarget.setTexture(mDiffuseLightTex);
|
||||
|
||||
for (U32 i = 0; i < mTargetChainLength; i++)
|
||||
mTargetChain[i]->attachTexture(GFXTextureTarget::Color3, mDiffuseLightTarget.getTexture());
|
||||
mTargetChain[i]->attachTexture(GFXTextureTarget::Color3, sceneColorTargetRef->getTexture(0));
|
||||
}
|
||||
else
|
||||
{
|
||||
Con::errorf("RenderDeferredMgr: Could not find AL_FormatToken");
|
||||
return false;
|
||||
}
|
||||
|
||||
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();
|
||||
|
||||
return ret;
|
||||
|
|
@ -337,12 +319,11 @@ void RenderDeferredMgr::render( SceneRenderState *state )
|
|||
const bool isRenderingToTarget = _onPreRender(state);
|
||||
|
||||
// Clear z-buffer and g-buffer.
|
||||
GFX->clear(GFXClearZBuffer | GFXClearStencil, ColorI::ZERO, 1.0f, 0);
|
||||
GFX->clear(GFXClearZBuffer | GFXClearStencil, LinearColorF::ZERO, 1.0f, 0);
|
||||
GFX->clearColorAttachment(0, LinearColorF::ONE);//normdepth
|
||||
GFX->clearColorAttachment(1, LinearColorF::ZERO);//albedo
|
||||
GFX->clearColorAttachment(2, LinearColorF::ZERO);//matinfo
|
||||
GFX->clearColorAttachment(3, LinearColorF::ZERO);//diffuse
|
||||
GFX->clearColorAttachment(4, LinearColorF::ZERO);//specular
|
||||
//AL_FormatToken is cleared by it's own class
|
||||
|
||||
// Restore transforms
|
||||
MatrixSet &matrixSet = getRenderPass()->getMatrixSet();
|
||||
|
|
@ -358,7 +339,7 @@ void RenderDeferredMgr::render( SceneRenderState *state )
|
|||
mDeferredMatInstance->setTransforms(matrixSet, state);
|
||||
}
|
||||
|
||||
// Signal start of pre-pass
|
||||
// Signal start of deferred
|
||||
getRenderSignal().trigger( state, this, true );
|
||||
|
||||
// First do a loop and render all the terrain... these are
|
||||
|
|
@ -751,8 +732,11 @@ void ProcessedDeferredMaterial::_determineFeatures( U32 stageNum,
|
|||
}
|
||||
else
|
||||
{
|
||||
// If this object isn't lightmapped, add a zero-output feature to it
|
||||
newFeatures.addFeature( MFT_RenderTarget3_Zero );
|
||||
// If this object isn't lightmapped or emissive, add a zero-output feature for render target 3
|
||||
if (fd.features.hasFeature(MFT_IsEmissive))
|
||||
newFeatures.addFeature(MFT_DeferredEmissive);
|
||||
else
|
||||
newFeatures.addFeature( MFT_RenderTarget3_Zero );
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -46,8 +46,6 @@ public:
|
|||
// andremwac: Deferred Rendering
|
||||
static const String ColorBufferName;
|
||||
static const String MatInfoBufferName;
|
||||
static const String DiffuseLightBufferName;
|
||||
static const String SpecularLightBufferName;
|
||||
|
||||
// Generic Deferred Render Instance Type
|
||||
static const RenderInstType RIT_Deferred;
|
||||
|
|
@ -106,8 +104,6 @@ protected:
|
|||
// Deferred Shading
|
||||
NamedTexTarget mColorTarget;
|
||||
NamedTexTarget mMatInfoTarget;
|
||||
NamedTexTarget mDiffuseLightTarget;
|
||||
NamedTexTarget mSpecularLightTarget;
|
||||
GFXTexHandle mColorTex;
|
||||
GFXTexHandle mMatInfoTex;
|
||||
GFXTexHandle mDiffuseLightTex;
|
||||
|
|
|
|||
|
|
@ -222,15 +222,12 @@ void RenderFormatToken::_updateTargets()
|
|||
if( !mTargetColorTexture[i] || mTargetColorTexture[i].getFormat() != mColorFormat
|
||||
|| mTargetColorTexture[i].getWidthHeight() != rtSize)
|
||||
{
|
||||
mTargetColorTexture[i].set( rtSize.x, rtSize.y, mColorFormat,
|
||||
&GFXRenderTargetSRGBProfile, avar( "%s() - (line %d)", __FUNCTION__, __LINE__ ),
|
||||
1, mTargetAALevel );
|
||||
mTargetChain[i]->attachTexture( GFXTextureTarget::Color0, mTargetColorTexture[i] );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
mTargetColorTexture[i].set( rtSize.x, rtSize.y, mColorFormat,
|
||||
&GFXRenderTargetSRGBProfile, avar( "%s() - (line %d)", __FUNCTION__, __LINE__ ),
|
||||
1, mTargetAALevel );
|
||||
mTargetChain[i]->attachTexture( GFXTextureTarget::Color0, mTargetColorTexture[i] );
|
||||
}
|
||||
}
|
||||
|
||||
// Update depth target
|
||||
if(mDepthFormat != GFXFormat_COUNT)
|
||||
|
|
@ -239,15 +236,16 @@ void RenderFormatToken::_updateTargets()
|
|||
if( !mTargetDepthStencilTexture[i] || mTargetDepthStencilTexture[i].getFormat() != mColorFormat
|
||||
|| mTargetDepthStencilTexture[i].getWidthHeight() != rtSize)
|
||||
{
|
||||
mTargetDepthStencilTexture[i].set( rtSize.x, rtSize.y, mDepthFormat,
|
||||
&GFXZTargetProfile, avar( "%s() - (line %d)", __FUNCTION__, __LINE__ ),
|
||||
1, mTargetAALevel );
|
||||
mTargetDepthStencilTexture[i].set( rtSize.x, rtSize.y, mDepthFormat,
|
||||
&GFXZTargetProfile, avar( "%s() - (line %d)", __FUNCTION__, __LINE__ ),
|
||||
1, mTargetAALevel );
|
||||
mTargetChain[i]->attachTexture( GFXTextureTarget::DepthStencil, mTargetDepthStencilTexture[i] );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
//set the texture for now as the first color target texture
|
||||
mTarget.setTexture(mTargetColorTexture[0]);
|
||||
}
|
||||
|
||||
void RenderFormatToken::_teardownTargets()
|
||||
|
|
|
|||
|
|
@ -156,12 +156,6 @@ void RenderProbeMgr::_setupPerFrameParameters(const SceneRenderState *state)
|
|||
PlaneF farPlane(wsFrustumPoints[Frustum::FarBottomLeft], wsFrustumPoints[Frustum::FarTopLeft], wsFrustumPoints[Frustum::FarTopRight]);
|
||||
PlaneF vsFarPlane(verts[0].normal, verts[1].normal, verts[2].normal);
|
||||
|
||||
MatrixSet &matrixSet = getRenderPass()->getMatrixSet();
|
||||
matrixSet.restoreSceneViewProjection();
|
||||
|
||||
const MatrixF &worldToCameraXfm = matrixSet.getCameraToWorld();
|
||||
|
||||
MatrixF inverseViewMatrix = worldToCameraXfm;
|
||||
|
||||
// Parameters calculated, assign them to the materials
|
||||
ProbeManager::SkylightMaterialInfo* skylightMat = PROBEMGR->getSkylightMaterial();
|
||||
|
|
@ -198,9 +192,6 @@ void RenderProbeMgr::render( SceneRenderState *state )
|
|||
if (!ProbeRenderInst::all.size())
|
||||
return;
|
||||
|
||||
if (PROBEMGR->mRegisteredProbes.empty())
|
||||
return;
|
||||
|
||||
if (!ProbeManager::smRenderReflectionProbes)
|
||||
return;
|
||||
|
||||
|
|
@ -208,14 +199,8 @@ void RenderProbeMgr::render( SceneRenderState *state )
|
|||
|
||||
GFXDEBUGEVENT_SCOPE(RenderProbeMgr_render, ColorI::WHITE);
|
||||
|
||||
NamedTexTargetRef diffuseLightingTarget = NamedTexTarget::find("diffuseLighting");
|
||||
|
||||
if (diffuseLightingTarget.isNull())
|
||||
return;
|
||||
|
||||
NamedTexTargetRef specularLightingTarget = NamedTexTarget::find("specularLighting");
|
||||
|
||||
if (specularLightingTarget.isNull())
|
||||
NamedTexTargetRef sceneColorTargetRef = NamedTexTarget::find("AL_FormatToken");
|
||||
if (sceneColorTargetRef.isNull())
|
||||
return;
|
||||
|
||||
GFXTextureTargetRef probeLightingTargetRef = GFX->allocRenderToTextureTarget();
|
||||
|
|
@ -226,14 +211,12 @@ void RenderProbeMgr::render( SceneRenderState *state )
|
|||
//Do a quick pass to update our probes if they're dirty
|
||||
PROBEMGR->updateDirtyProbes();
|
||||
|
||||
probeLightingTargetRef->attachTexture(GFXTextureTarget::Color0, specularLightingTarget->getTexture());
|
||||
probeLightingTargetRef->attachTexture(GFXTextureTarget::Color1, diffuseLightingTarget->getTexture());
|
||||
probeLightingTargetRef->attachTexture(GFXTextureTarget::Color0, sceneColorTargetRef->getTexture(0));
|
||||
|
||||
GFX->pushActiveRenderTarget();
|
||||
GFX->setActiveRenderTarget(probeLightingTargetRef);
|
||||
|
||||
GFX->setViewport(specularLightingTarget->getViewport());
|
||||
//GFX->setViewport(specularLightingTarget->getViewport());
|
||||
GFX->setViewport(sceneColorTargetRef->getViewport());
|
||||
|
||||
// Restore transforms
|
||||
MatrixSet &matrixSet = getRenderPass()->getMatrixSet();
|
||||
|
|
@ -258,9 +241,9 @@ void RenderProbeMgr::render( SceneRenderState *state )
|
|||
ProbeManager::SkylightMaterialInfo* skylightMat = PROBEMGR->getSkylightMaterial();
|
||||
ProbeManager::ReflectProbeMaterialInfo* reflProbeMat = PROBEMGR->getReflectProbeMaterial();
|
||||
|
||||
for (U32 i = 0; i < PROBEMGR->mRegisteredProbes.size(); i++)
|
||||
for (U32 i = 0; i < ProbeRenderInst::all.size(); i++)
|
||||
{
|
||||
ProbeRenderInst* curEntry = ProbeRenderInst::all[PROBEMGR->mRegisteredProbes[i]];
|
||||
ProbeRenderInst* curEntry = ProbeRenderInst::all[i];
|
||||
|
||||
if (!curEntry->mIsEnabled)
|
||||
continue;
|
||||
|
|
@ -324,10 +307,6 @@ void RenderProbeMgr::render( SceneRenderState *state )
|
|||
}
|
||||
}
|
||||
|
||||
//And clean us up
|
||||
PROBEMGR->mRegisteredProbes.clear();
|
||||
|
||||
probeLightingTargetRef->resolve();
|
||||
GFX->popActiveRenderTarget();
|
||||
|
||||
//PROBEMGR->unregisterAllProbes();
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue