mirror of
https://github.com/TorqueGameEngines/Torque3D.git
synced 2026-07-13 07:34:45 +00:00
Ongoing PostFX org rework.
This commit is contained in:
parent
ecad33c598
commit
a1b281cc5f
6 changed files with 221 additions and 178 deletions
|
|
@ -1434,6 +1434,11 @@ void PostEffect::_checkRequirements()
|
||||||
// properly, we can find all the input textures,
|
// properly, we can find all the input textures,
|
||||||
// and its formats are supported.
|
// and its formats are supported.
|
||||||
|
|
||||||
|
if (mShaderName == String("PFX_ReflectionProbeArray") || getName() == StringTable->insert("reflectionProbeArrayPostFX"))
|
||||||
|
{
|
||||||
|
bool derp = true;
|
||||||
|
}
|
||||||
|
|
||||||
mIsValid = false;
|
mIsValid = false;
|
||||||
mUpdateShader = false;
|
mUpdateShader = false;
|
||||||
mShader = NULL;
|
mShader = NULL;
|
||||||
|
|
@ -1473,9 +1478,11 @@ void PostEffect::_checkRequirements()
|
||||||
if ( texFilename.isNotEmpty() && texFilename[0] == '#' )
|
if ( texFilename.isNotEmpty() && texFilename[0] == '#' )
|
||||||
{
|
{
|
||||||
NamedTexTarget *namedTarget = NamedTexTarget::find( texFilename.c_str() + 1 );
|
NamedTexTarget *namedTarget = NamedTexTarget::find( texFilename.c_str() + 1 );
|
||||||
if ( !namedTarget )
|
if (!namedTarget)
|
||||||
|
{
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// Grab the macros for shader initialization.
|
// Grab the macros for shader initialization.
|
||||||
namedTarget->getShaderMacros( ¯os );
|
namedTarget->getShaderMacros( ¯os );
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -353,6 +353,10 @@ public:
|
||||||
bool isOneFrameOnly() { return mOneFrameOnly; }
|
bool isOneFrameOnly() { return mOneFrameOnly; }
|
||||||
|
|
||||||
F32 getAspectRatio() const;
|
F32 getAspectRatio() const;
|
||||||
|
|
||||||
|
GFXShaderRef getShader() { return mShader; }
|
||||||
|
Vector<GFXShaderMacro>* getShaderMacros() { return &mShaderMacros; }
|
||||||
|
GFXShaderConstBufferRef getShaderConstBuffer() { return mShaderConsts; }
|
||||||
|
|
||||||
|
|
||||||
enum PostEffectRequirements
|
enum PostEffectRequirements
|
||||||
|
|
|
||||||
|
|
@ -243,7 +243,6 @@ bool ReflectProbeMatInstance::setupPass(SceneRenderState *state, const SceneData
|
||||||
RenderProbeMgr::RenderProbeMgr()
|
RenderProbeMgr::RenderProbeMgr()
|
||||||
: RenderBinManager(RenderPassManager::RIT_Probes, 1.0f, 1.0f),
|
: RenderBinManager(RenderPassManager::RIT_Probes, 1.0f, 1.0f),
|
||||||
mReflectProbeMaterial(nullptr),
|
mReflectProbeMaterial(nullptr),
|
||||||
mSceneManager(nullptr),
|
|
||||||
mLastShader(nullptr),
|
mLastShader(nullptr),
|
||||||
mLastConstants(nullptr)
|
mLastConstants(nullptr)
|
||||||
{
|
{
|
||||||
|
|
@ -276,6 +275,12 @@ RenderProbeMgr::RenderProbeMgr()
|
||||||
|
|
||||||
irradMaps.setSize(MAXPROBECOUNT);
|
irradMaps.setSize(MAXPROBECOUNT);
|
||||||
irradMaps.fill(NULL);
|
irradMaps.fill(NULL);
|
||||||
|
|
||||||
|
mEffectiveProbeCount = 0;
|
||||||
|
|
||||||
|
mProbeArrayEffect = nullptr;
|
||||||
|
|
||||||
|
numProbesSC = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
RenderProbeMgr::RenderProbeMgr(RenderInstType riType, F32 renderOrder, F32 processAddOrder)
|
RenderProbeMgr::RenderProbeMgr(RenderInstType riType, F32 renderOrder, F32 processAddOrder)
|
||||||
|
|
@ -320,6 +325,21 @@ void RenderProbeMgr::registerProbe(U32 probeIdx)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
mRegisteredProbes.push_back_unique(probeIdx);
|
mRegisteredProbes.push_back_unique(probeIdx);
|
||||||
|
|
||||||
|
//rebuild our probe data
|
||||||
|
//_setupStaticParameters();
|
||||||
|
}
|
||||||
|
|
||||||
|
void RenderProbeMgr::unregisterProbe(U32 probeIdx)
|
||||||
|
{
|
||||||
|
//Mostly for consolidation, but also lets us sanity check or prep any other data we need for rendering this in one place at time of flagging for render
|
||||||
|
if (probeIdx >= ProbeRenderInst::all.size())
|
||||||
|
return;
|
||||||
|
|
||||||
|
mRegisteredProbes.remove(probeIdx);
|
||||||
|
|
||||||
|
//rebuild our probe data
|
||||||
|
//_setupStaticParameters();
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
|
|
@ -327,8 +347,12 @@ void RenderProbeMgr::registerProbe(U32 probeIdx)
|
||||||
PostEffect* RenderProbeMgr::getProbeArrayEffect()
|
PostEffect* RenderProbeMgr::getProbeArrayEffect()
|
||||||
{
|
{
|
||||||
if (!mProbeArrayEffect)
|
if (!mProbeArrayEffect)
|
||||||
|
{
|
||||||
mProbeArrayEffect = dynamic_cast<PostEffect*>(Sim::findObject("reflectionProbeArrayPostFX"));
|
mProbeArrayEffect = dynamic_cast<PostEffect*>(Sim::findObject("reflectionProbeArrayPostFX"));
|
||||||
|
|
||||||
|
if (!mProbeArrayEffect)
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
return mProbeArrayEffect;
|
return mProbeArrayEffect;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -339,7 +363,115 @@ PostEffect* RenderProbeMgr::getProbeArrayEffect()
|
||||||
|
|
||||||
void RenderProbeMgr::_setupStaticParameters()
|
void RenderProbeMgr::_setupStaticParameters()
|
||||||
{
|
{
|
||||||
|
mLastShader = mProbeArrayEffect->getShader();
|
||||||
|
|
||||||
|
if (mLastShader == nullptr)
|
||||||
|
return;
|
||||||
|
|
||||||
|
mLastConstants = mLastShader->allocConstBuffer();
|
||||||
|
|
||||||
|
numProbesSC = mLastShader->getShaderConstHandle("$numProbes");
|
||||||
|
|
||||||
|
probePositionSC = mLastShader->getShaderConstHandle("$inProbePosArray");
|
||||||
|
probeWorldToObjSC = mLastShader->getShaderConstHandle("$worldToObjArray");
|
||||||
|
probeBBMinSC = mLastShader->getShaderConstHandle("$bbMinArray");
|
||||||
|
probeBBMaxSC = mLastShader->getShaderConstHandle("$bbMaxArray");
|
||||||
|
probeUseSphereModeSC = mLastShader->getShaderConstHandle("$useSphereMode");
|
||||||
|
probeRadiusSC = mLastShader->getShaderConstHandle("$radius");
|
||||||
|
probeAttenuationSC = mLastShader->getShaderConstHandle("$attenuation");
|
||||||
|
|
||||||
|
//Array rendering
|
||||||
|
U32 probeCount = ProbeRenderInst::all.size();
|
||||||
|
|
||||||
|
mEffectiveProbeCount = 0;
|
||||||
|
|
||||||
|
for (U32 i = 0; i < probeCount; i++)
|
||||||
|
{
|
||||||
|
if (mEffectiveProbeCount >= MAXPROBECOUNT)
|
||||||
|
break;
|
||||||
|
|
||||||
|
ProbeRenderInst* curEntry = ProbeRenderInst::all[i];
|
||||||
|
if (!curEntry->mIsEnabled)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (curEntry->mCubemap.isNull() || curEntry->mIrradianceCubemap.isNull())
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (!curEntry->mCubemap->isInitialised())
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (curEntry->mIsSkylight)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
//Setup
|
||||||
|
const Point3F &probePos = curEntry->getPosition();
|
||||||
|
probePositions[i] = probePos + curEntry->mProbePosOffset;
|
||||||
|
|
||||||
|
MatrixF trans = curEntry->getTransform();
|
||||||
|
trans.inverse();
|
||||||
|
|
||||||
|
probeWorldToObj[i] = trans;
|
||||||
|
|
||||||
|
probeBBMin[i] = curEntry->mBounds.minExtents;
|
||||||
|
probeBBMax[i] = curEntry->mBounds.maxExtents;
|
||||||
|
|
||||||
|
probeUseSphereMode[i] = curEntry->mProbeShapeType == ProbeRenderInst::Sphere ? 1 : 0;
|
||||||
|
|
||||||
|
probeRadius[i] = curEntry->mRadius;
|
||||||
|
probeAttenuation[i] = 1;
|
||||||
|
|
||||||
|
cubeMaps[i] = curEntry->mCubemap;
|
||||||
|
irradMaps[i] = curEntry->mIrradianceCubemap;
|
||||||
|
|
||||||
|
mEffectiveProbeCount++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mEffectiveProbeCount != 0)
|
||||||
|
{
|
||||||
|
mCubemapArray = GFXCubemapArrayHandle(GFX->createCubemapArray());
|
||||||
|
mIrradArray = GFXCubemapArrayHandle(GFX->createCubemapArray());
|
||||||
|
|
||||||
|
mCubemapArray->initStatic(cubeMaps.address(), mEffectiveProbeCount);
|
||||||
|
mIrradArray->initStatic(irradMaps.address(), mEffectiveProbeCount);
|
||||||
|
|
||||||
|
/*NamedTexTarget *deferredTarget = NamedTexTarget::find(RenderDeferredMgr::BufferName);
|
||||||
|
if (deferredTarget)
|
||||||
|
GFX->setTexture(0, deferredTarget->getTexture());
|
||||||
|
else
|
||||||
|
GFX->setTexture(0, NULL);
|
||||||
|
|
||||||
|
NamedTexTarget *colorTarget = NamedTexTarget::find(RenderDeferredMgr::ColorBufferName);
|
||||||
|
if (colorTarget)
|
||||||
|
GFX->setTexture(1, colorTarget->getTexture());
|
||||||
|
else
|
||||||
|
GFX->setTexture(1, NULL);
|
||||||
|
|
||||||
|
NamedTexTarget *matinfoTarget = NamedTexTarget::find(RenderDeferredMgr::MatInfoBufferName);
|
||||||
|
if (matinfoTarget)
|
||||||
|
GFX->setTexture(2, matinfoTarget->getTexture());
|
||||||
|
else
|
||||||
|
GFX->setTexture(2, NULL);
|
||||||
|
|
||||||
|
if (mBrdfTexture)
|
||||||
|
{
|
||||||
|
GFX->setTexture(3, mBrdfTexture);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
GFX->setTexture(3, NULL);*/
|
||||||
|
|
||||||
|
//GFX->setCubeArrayTexture(4, mCubemapArray);
|
||||||
|
//GFX->setCubeArrayTexture(5, mIrradArray);
|
||||||
|
|
||||||
|
ProbeRenderInst* curEntry = ProbeRenderInst::all[0];
|
||||||
|
//count = MAXPROBECOUNT;
|
||||||
|
//Final packing
|
||||||
|
mProbePositions = AlignedArray<Point4F>(mEffectiveProbeCount, sizeof(Point4F), (U8*)probePositions.address(), false);
|
||||||
|
mProbeBBMin = AlignedArray<Point4F>(mEffectiveProbeCount, sizeof(Point4F), (U8*)probeBBMin.address(), false);
|
||||||
|
mProbeBBMax = AlignedArray<Point4F>(mEffectiveProbeCount, sizeof(Point4F), (U8*)probeBBMax.address(), false);
|
||||||
|
mProbeUseSphereMode = AlignedArray<float>(mEffectiveProbeCount, sizeof(float), (U8*)probeUseSphereMode.address(), false);
|
||||||
|
mProbeRadius = AlignedArray<float>(mEffectiveProbeCount, sizeof(float), (U8*)probeRadius.address(), false);
|
||||||
|
mProbeAttenuation = AlignedArray<float>(mEffectiveProbeCount, sizeof(float), (U8*)probeAttenuation.address(), false);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void RenderProbeMgr::_setupPerFrameParameters(const SceneRenderState *state)
|
void RenderProbeMgr::_setupPerFrameParameters(const SceneRenderState *state)
|
||||||
|
|
@ -432,27 +564,27 @@ ProbeShaderConstants* RenderProbeMgr::getProbeShaderConstants(GFXShaderConstBuff
|
||||||
ProbeConstantMap::Iterator iter = mConstantLookup.find(shader);
|
ProbeConstantMap::Iterator iter = mConstantLookup.find(shader);
|
||||||
if (iter != mConstantLookup.end())
|
if (iter != mConstantLookup.end())
|
||||||
{
|
{
|
||||||
mLastConstants = iter->value;
|
mLastForwardConstants = iter->value;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ProbeShaderConstants* psc = new ProbeShaderConstants();
|
ProbeShaderConstants* psc = new ProbeShaderConstants();
|
||||||
mConstantLookup[shader] = psc;
|
mConstantLookup[shader] = psc;
|
||||||
|
|
||||||
mLastConstants = psc;
|
mLastForwardConstants = psc;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set our new shader
|
// Set our new shader
|
||||||
mLastShader = shader;
|
mLastShader = shader;
|
||||||
}
|
}
|
||||||
|
|
||||||
mLastConstants = new ProbeShaderConstants();
|
mLastForwardConstants = new ProbeShaderConstants();
|
||||||
|
|
||||||
// Make sure that our current lighting constants are initialized
|
// Make sure that our current lighting constants are initialized
|
||||||
if (!mLastConstants->mInit)
|
if (!mLastForwardConstants->mInit)
|
||||||
mLastConstants->init(shader);
|
mLastForwardConstants->init(shader);
|
||||||
|
|
||||||
return mLastConstants;
|
return mLastForwardConstants;
|
||||||
}
|
}
|
||||||
|
|
||||||
void RenderProbeMgr::_update4ProbeConsts(const SceneData &sgData,
|
void RenderProbeMgr::_update4ProbeConsts(const SceneData &sgData,
|
||||||
|
|
@ -629,7 +761,9 @@ void RenderProbeMgr::setProbeInfo(ProcessedMaterial *pmat,
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
void RenderProbeMgr::render( SceneRenderState *state )
|
void RenderProbeMgr::render( SceneRenderState *state )
|
||||||
{
|
{
|
||||||
PROFILE_SCOPE(RenderProbeMgr_render);
|
//PROFILE_SCOPE(RenderProbeMgr_render);
|
||||||
|
if (getProbeArrayEffect() == nullptr)
|
||||||
|
return;
|
||||||
|
|
||||||
// Early out if nothing to draw.
|
// Early out if nothing to draw.
|
||||||
if (!ProbeRenderInst::all.size())
|
if (!ProbeRenderInst::all.size())
|
||||||
|
|
@ -638,129 +772,38 @@ void RenderProbeMgr::render( SceneRenderState *state )
|
||||||
if (!RenderProbeMgr::smRenderReflectionProbes)
|
if (!RenderProbeMgr::smRenderReflectionProbes)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if (mEffectiveProbeCount == 0)
|
||||||
|
_setupStaticParameters(); //return;
|
||||||
|
|
||||||
GFXTransformSaver saver;
|
GFXTransformSaver saver;
|
||||||
|
|
||||||
GFXDEBUGEVENT_SCOPE(RenderProbeMgr_render, ColorI::WHITE);
|
GFXDEBUGEVENT_SCOPE(RenderProbeMgr_render, ColorI::WHITE);
|
||||||
|
|
||||||
NamedTexTargetRef sceneColorTargetRef = NamedTexTarget::find("AL_FormatToken");
|
|
||||||
if (sceneColorTargetRef.isNull())
|
|
||||||
return;
|
|
||||||
|
|
||||||
GFXTextureTargetRef probeLightingTargetRef = GFX->allocRenderToTextureTarget();
|
|
||||||
|
|
||||||
if (probeLightingTargetRef.isNull())
|
|
||||||
return;
|
|
||||||
|
|
||||||
//Do a quick pass to update our probes if they're dirty
|
|
||||||
//PROBEMGR->updateDirtyProbes();
|
|
||||||
|
|
||||||
probeLightingTargetRef->attachTexture(GFXTextureTarget::Color0, sceneColorTargetRef->getTexture(0));
|
|
||||||
|
|
||||||
GFX->pushActiveRenderTarget();
|
|
||||||
GFX->setActiveRenderTarget(probeLightingTargetRef);
|
|
||||||
|
|
||||||
GFX->setViewport(sceneColorTargetRef->getViewport());
|
|
||||||
|
|
||||||
// Restore transforms
|
|
||||||
MatrixSet &matrixSet = getRenderPass()->getMatrixSet();
|
|
||||||
matrixSet.restoreSceneViewProjection();
|
|
||||||
|
|
||||||
const MatrixF &worldToCameraXfm = matrixSet.getWorldToCamera();
|
|
||||||
|
|
||||||
// Set up the SG Data
|
|
||||||
SceneData sgData;
|
|
||||||
sgData.init(state);
|
|
||||||
|
|
||||||
// Initialize and set the per-frame parameters after getting
|
// Initialize and set the per-frame parameters after getting
|
||||||
// the vector light material as we use lazy creation.
|
// the vector light material as we use lazy creation.
|
||||||
_setupPerFrameParameters(state);
|
//_setupPerFrameParameters(state);
|
||||||
|
|
||||||
//Order the probes by size, biggest to smallest
|
|
||||||
//dQsort(ProbeRenderInst::all.address(), ProbeRenderInst::all.size(), sizeof(const ProbeRenderInst*), AscendingReflectProbeInfluence);
|
|
||||||
|
|
||||||
//Specular
|
//Specular
|
||||||
PROFILE_START(RenderProbeManager_ReflectProbeRender);
|
//PROFILE_START(RenderProbeManager_ReflectProbeRender);
|
||||||
|
|
||||||
ReflectProbeMaterialInfo* reflProbeMat = getReflectProbeMaterial();
|
// If this is a non-diffuse pass or we have no objects to
|
||||||
|
// render then tell the effect to skip rendering.
|
||||||
if (reflProbeMat == nullptr || reflProbeMat->matInstance == nullptr)
|
if (!state->isDiffusePass()/* || binSize == 0*/|| !numProbesSC || !numProbesSC->isValid())
|
||||||
|
{
|
||||||
|
getProbeArrayEffect()->setSkip(true);
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
MaterialParameters *matParams = reflProbeMat->matInstance->getMaterialParameters();
|
|
||||||
|
|
||||||
MaterialParameterHandle *numProbesSC = reflProbeMat->matInstance->getMaterialParameterHandle("$numProbes");
|
|
||||||
|
|
||||||
MaterialParameterHandle *probePositionSC = reflProbeMat->matInstance->getMaterialParameterHandle("$inProbePosArray");
|
|
||||||
MaterialParameterHandle *probeWorldToObjSC = reflProbeMat->matInstance->getMaterialParameterHandle("$worldToObjArray");
|
|
||||||
MaterialParameterHandle *probeBBMinSC = reflProbeMat->matInstance->getMaterialParameterHandle("$bbMinArray");
|
|
||||||
MaterialParameterHandle *probeBBMaxSC = reflProbeMat->matInstance->getMaterialParameterHandle("$bbMaxArray");
|
|
||||||
MaterialParameterHandle *probeUseSphereModeSC = reflProbeMat->matInstance->getMaterialParameterHandle("$useSphereMode");
|
|
||||||
MaterialParameterHandle *probeRadiusSC = reflProbeMat->matInstance->getMaterialParameterHandle("$radius");
|
|
||||||
MaterialParameterHandle *probeAttenuationSC = reflProbeMat->matInstance->getMaterialParameterHandle("$attenuation");
|
|
||||||
|
|
||||||
//Array rendering
|
//Array rendering
|
||||||
U32 probeCount = ProbeRenderInst::all.size();
|
U32 probeCount = ProbeRenderInst::all.size();
|
||||||
|
|
||||||
if (probeCount == 0)
|
if (probeCount == 0)
|
||||||
return;
|
return;
|
||||||
MatrixF trans = MatrixF::Identity;
|
|
||||||
sgData.objTrans = &trans;
|
|
||||||
|
|
||||||
U32 effectiveProbeCount = 0;
|
|
||||||
|
|
||||||
for (U32 i = 0; i < probeCount; i++)
|
if (mEffectiveProbeCount != 0)
|
||||||
{
|
{
|
||||||
if (effectiveProbeCount >= MAXPROBECOUNT)
|
//These will in theory be set by the postFX
|
||||||
break;
|
/*NamedTexTarget *deferredTarget = NamedTexTarget::find(RenderDeferredMgr::BufferName);
|
||||||
|
|
||||||
ProbeRenderInst* curEntry = ProbeRenderInst::all[i];
|
|
||||||
if (!curEntry->mIsEnabled)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (curEntry->mCubemap.isNull() || curEntry->mIrradianceCubemap.isNull())
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (!curEntry->mCubemap->isInitialised())
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (curEntry->mIsSkylight)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
//Setup
|
|
||||||
const Point3F &probePos = curEntry->getPosition();
|
|
||||||
probePositions[i] = probePos + curEntry->mProbePosOffset;
|
|
||||||
|
|
||||||
MatrixF trans = curEntry->getTransform();
|
|
||||||
trans.inverse();
|
|
||||||
|
|
||||||
probeWorldToObj[i]=trans;
|
|
||||||
|
|
||||||
probeBBMin[i] = curEntry->mBounds.minExtents;
|
|
||||||
probeBBMax[i] = curEntry->mBounds.maxExtents;
|
|
||||||
|
|
||||||
probeUseSphereMode[i] = curEntry->mProbeShapeType == ProbeRenderInst::Sphere ? 1 : 0;
|
|
||||||
|
|
||||||
probeRadius[i] = curEntry->mRadius;
|
|
||||||
probeAttenuation[i] = 1;
|
|
||||||
|
|
||||||
cubeMaps[i] = curEntry->mCubemap;
|
|
||||||
irradMaps[i] = curEntry->mIrradianceCubemap;
|
|
||||||
|
|
||||||
effectiveProbeCount++;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (effectiveProbeCount != 0)
|
|
||||||
{
|
|
||||||
U32 count = effectiveProbeCount;
|
|
||||||
matParams->setSafe(numProbesSC, (float)effectiveProbeCount);
|
|
||||||
|
|
||||||
mCubemapArray = GFXCubemapArrayHandle(GFX->createCubemapArray());
|
|
||||||
mIrradArray = GFXCubemapArrayHandle(GFX->createCubemapArray());
|
|
||||||
|
|
||||||
mCubemapArray->initStatic(cubeMaps.address(), count);
|
|
||||||
mIrradArray->initStatic(irradMaps.address(), count);
|
|
||||||
|
|
||||||
NamedTexTarget *deferredTarget = NamedTexTarget::find(RenderDeferredMgr::BufferName);
|
|
||||||
if (deferredTarget)
|
if (deferredTarget)
|
||||||
GFX->setTexture(0, deferredTarget->getTexture());
|
GFX->setTexture(0, deferredTarget->getTexture());
|
||||||
else
|
else
|
||||||
|
|
@ -776,7 +819,7 @@ void RenderProbeMgr::render( SceneRenderState *state )
|
||||||
if (matinfoTarget)
|
if (matinfoTarget)
|
||||||
GFX->setTexture(2, matinfoTarget->getTexture());
|
GFX->setTexture(2, matinfoTarget->getTexture());
|
||||||
else
|
else
|
||||||
GFX->setTexture(2, NULL);
|
GFX->setTexture(2, NULL);*/
|
||||||
|
|
||||||
if (mBrdfTexture)
|
if (mBrdfTexture)
|
||||||
{
|
{
|
||||||
|
|
@ -785,54 +828,33 @@ void RenderProbeMgr::render( SceneRenderState *state )
|
||||||
else
|
else
|
||||||
GFX->setTexture(3, NULL);
|
GFX->setTexture(3, NULL);
|
||||||
|
|
||||||
//GFX->setCubeArrayTexture(4, mCubemapArray);
|
GFX->setCubeArrayTexture(4, mCubemapArray);
|
||||||
//GFX->setCubeArrayTexture(5, mIrradArray);
|
GFX->setCubeArrayTexture(5, mIrradArray);
|
||||||
|
|
||||||
ProbeRenderInst* curEntry = ProbeRenderInst::all[0];
|
if (numProbesSC->isValid())
|
||||||
count = MAXPROBECOUNT;
|
|
||||||
//Final packing
|
|
||||||
AlignedArray<Point4F> _probePositions(count, sizeof(Point4F), (U8*)probePositions.address(), false);
|
|
||||||
AlignedArray<Point4F> _probeBBMin(count, sizeof(Point4F), (U8*)probeBBMin.address(), false);
|
|
||||||
AlignedArray<Point4F> _probeBBMax(count, sizeof(Point4F), (U8*)probeBBMax.address(), false);
|
|
||||||
AlignedArray<float> _probeUseSphereMode(count, sizeof(float), (U8*)probeUseSphereMode.address(), false);
|
|
||||||
AlignedArray<float> _probeRadius(count, sizeof(float), (U8*)probeRadius.address(), false);
|
|
||||||
AlignedArray<float> _probeAttenuation(count, sizeof(float), (U8*)probeAttenuation.address(), false);
|
|
||||||
|
|
||||||
matParams->set(probePositionSC, _probePositions);
|
|
||||||
matParams->set(probeWorldToObjSC, probeWorldToObj.address(), count);
|
|
||||||
matParams->set(probeBBMinSC, _probeBBMin);
|
|
||||||
matParams->set(probeBBMaxSC, _probeBBMax);
|
|
||||||
matParams->set(probeUseSphereModeSC, _probeUseSphereMode);
|
|
||||||
matParams->set(probeRadiusSC, _probeRadius);
|
|
||||||
matParams->set(probeAttenuationSC, _probeAttenuation);
|
|
||||||
|
|
||||||
// Set geometry
|
|
||||||
GFX->setVertexBuffer(mFarFrustumQuadVerts);
|
|
||||||
GFX->setPrimitiveBuffer(NULL);
|
|
||||||
|
|
||||||
while (reflProbeMat->matInstance->setupPass(state, sgData))
|
|
||||||
{
|
{
|
||||||
// Set transforms
|
mLastConstants->set(numProbesSC, (float)mEffectiveProbeCount);
|
||||||
matrixSet.setWorld(*sgData.objTrans);
|
|
||||||
reflProbeMat->matInstance->setTransforms(matrixSet, state);
|
|
||||||
reflProbeMat->matInstance->setSceneInfo(state, sgData);
|
|
||||||
|
|
||||||
GFX->drawPrimitive(GFXTriangleStrip, 0, 2);
|
mLastConstants->set(probePositionSC, mProbePositions);
|
||||||
|
|
||||||
|
mLastConstants->set(probePositionSC, mProbePositions);
|
||||||
|
mLastConstants->set(probeWorldToObjSC, probeWorldToObj.address(), mEffectiveProbeCount);
|
||||||
|
mLastConstants->set(probeBBMinSC, mProbeBBMin);
|
||||||
|
mLastConstants->set(probeBBMaxSC, mProbeBBMax);
|
||||||
|
mLastConstants->set(probeUseSphereModeSC, mProbeUseSphereMode);
|
||||||
|
mLastConstants->set(probeRadiusSC, mProbeRadius);
|
||||||
|
mLastConstants->set(probeAttenuationSC, mProbeAttenuation);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
GFX->popActiveRenderTarget();
|
// Finish up.
|
||||||
|
//if (isRenderingToTarget)
|
||||||
|
// _onPostRender();
|
||||||
|
|
||||||
//PROBEMGR->unregisterAllProbes();
|
// Make sure the effect is gonna render.
|
||||||
//PROBEMGR->mRegisteredProbes.clear();
|
getProbeArrayEffect()->setSkip(false);
|
||||||
|
|
||||||
PROFILE_END();
|
//PROFILE_END();
|
||||||
|
|
||||||
GFX->setVertexBuffer(NULL);
|
|
||||||
GFX->setPrimitiveBuffer(NULL);
|
|
||||||
|
|
||||||
// Fire off a signal to let others know that light-bin rendering is ending now
|
|
||||||
//getRenderSignal().trigger(state, this);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
|
|
|
||||||
|
|
@ -268,12 +268,22 @@ class RenderProbeMgr : public RenderBinManager
|
||||||
|
|
||||||
ReflectProbeMaterialInfo* mReflectProbeMaterial;
|
ReflectProbeMaterialInfo* mReflectProbeMaterial;
|
||||||
|
|
||||||
|
GFXShaderConstHandle *numProbesSC;
|
||||||
|
GFXShaderConstHandle *probePositionSC;
|
||||||
|
GFXShaderConstHandle *probeWorldToObjSC;
|
||||||
|
GFXShaderConstHandle *probeBBMinSC;
|
||||||
|
GFXShaderConstHandle *probeBBMaxSC;
|
||||||
|
GFXShaderConstHandle *probeUseSphereModeSC;
|
||||||
|
GFXShaderConstHandle *probeRadiusSC;
|
||||||
|
GFXShaderConstHandle *probeAttenuationSC;
|
||||||
|
|
||||||
/// The scene graph the light manager is associated with.
|
/// The scene graph the light manager is associated with.
|
||||||
SceneManager *mSceneManager;
|
//SceneManager *mSceneManager;
|
||||||
|
|
||||||
ProbeConstantMap mConstantLookup;
|
ProbeConstantMap mConstantLookup;
|
||||||
GFXShaderRef mLastShader;
|
GFXShaderRef mLastShader;
|
||||||
ProbeShaderConstants* mLastConstants;
|
GFXShaderConstBufferRef mLastConstants;
|
||||||
|
ProbeShaderConstants* mLastForwardConstants;
|
||||||
|
|
||||||
//
|
//
|
||||||
//
|
//
|
||||||
|
|
@ -306,7 +316,7 @@ protected:
|
||||||
GFXTextureObject * mBrdfTexture;
|
GFXTextureObject * mBrdfTexture;
|
||||||
|
|
||||||
//Array rendering
|
//Array rendering
|
||||||
|
U32 mEffectiveProbeCount;
|
||||||
Vector<Point3F> probePositions;
|
Vector<Point3F> probePositions;
|
||||||
Vector<MatrixF> probeWorldToObj;
|
Vector<MatrixF> probeWorldToObj;
|
||||||
Vector<Point3F> probeBBMin;
|
Vector<Point3F> probeBBMin;
|
||||||
|
|
@ -317,6 +327,13 @@ protected:
|
||||||
Vector<GFXCubemapHandle> cubeMaps;
|
Vector<GFXCubemapHandle> cubeMaps;
|
||||||
Vector<GFXCubemapHandle> irradMaps;
|
Vector<GFXCubemapHandle> irradMaps;
|
||||||
|
|
||||||
|
AlignedArray<Point4F> mProbePositions;
|
||||||
|
AlignedArray<Point4F> mProbeBBMin;
|
||||||
|
AlignedArray<Point4F> mProbeBBMax;
|
||||||
|
AlignedArray<float> mProbeUseSphereMode;
|
||||||
|
AlignedArray<float> mProbeRadius;
|
||||||
|
AlignedArray<float> mProbeAttenuation;
|
||||||
|
|
||||||
GFXCubemapArrayHandle mCubemapArray;
|
GFXCubemapArrayHandle mCubemapArray;
|
||||||
GFXCubemapArrayHandle mIrradArray;
|
GFXCubemapArrayHandle mIrradArray;
|
||||||
public:
|
public:
|
||||||
|
|
@ -348,10 +365,7 @@ public:
|
||||||
|
|
||||||
void registerProbe(U32 probeIdx);
|
void registerProbe(U32 probeIdx);
|
||||||
|
|
||||||
// Returns the scene manager passed at activation.
|
void unregisterProbe(U32 probeIdx);
|
||||||
SceneManager* getSceneManager() { return mSceneManager; }
|
|
||||||
|
|
||||||
void setSceneManager(SceneManager* sceneManager) { mSceneManager = sceneManager; }
|
|
||||||
|
|
||||||
/// Debug rendering
|
/// Debug rendering
|
||||||
static bool smRenderReflectionProbes;
|
static bool smRenderReflectionProbes;
|
||||||
|
|
@ -363,15 +377,7 @@ RenderProbeMgr* RenderProbeMgr::getProbeManager()
|
||||||
{
|
{
|
||||||
RenderProbeMgr* probeManager = new RenderProbeMgr();
|
RenderProbeMgr* probeManager = new RenderProbeMgr();
|
||||||
|
|
||||||
if (gClientSceneGraph != nullptr)
|
smProbeManager = probeManager;
|
||||||
{
|
|
||||||
probeManager->setSceneManager(gClientSceneGraph);
|
|
||||||
smProbeManager = probeManager;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
delete probeManager;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return smProbeManager;
|
return smProbeManager;
|
||||||
|
|
|
||||||
|
|
@ -500,12 +500,12 @@ singleton PostEffect( reflectionProbeArrayPostFX )
|
||||||
//texture[0] = "#highlight";
|
//texture[0] = "#highlight";
|
||||||
//texture[1] = "$backBuffer";
|
//texture[1] = "$backBuffer";
|
||||||
|
|
||||||
texture[0] = "$deferredBuffer";
|
texture[0] = "#deferred";
|
||||||
texture[1] = "$colorBuffer";
|
texture[1] = "#color";
|
||||||
texture[2] = "$matInfoBuffer";
|
texture[2] = "#matinfo";
|
||||||
texture[3] = "$BRDFTexture";
|
texture[3] = "$BRDFTexture";
|
||||||
texture[4] = "$cubeMap";
|
texture[4] = "$cubeMap";
|
||||||
texture[5] = "$irradianceCubemap";
|
texture[5] = "$irradianceCubemap";
|
||||||
|
|
||||||
target = "$backBuffer";
|
target = "AL_FormatToken";
|
||||||
};
|
};
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
#include "../postFx.hlsl"
|
#include "../../postFx/postFx.hlsl"
|
||||||
|
#include "../../shaderModel.hlsl"
|
||||||
|
#include "../../shaderModelAutoGen.hlsl"
|
||||||
#include "../../lighting.hlsl"
|
#include "../../lighting.hlsl"
|
||||||
|
|
||||||
TORQUE_UNIFORM_SAMPLER2D(deferredBuffer, 0);
|
TORQUE_UNIFORM_SAMPLER2D(deferredBuffer, 0);
|
||||||
|
|
@ -146,6 +147,9 @@ float4 main( PFXVertToPix IN ) : SV_TARGET
|
||||||
|
|
||||||
float finalSum = blendSum;
|
float finalSum = blendSum;
|
||||||
|
|
||||||
|
return TORQUE_TEX2D(colorBuffer, IN.uv0.xy);
|
||||||
|
//return float4(surface.N,1);
|
||||||
|
//return float4(1,1,1, 1);
|
||||||
//return float4(finalSum,finalSum,finalSum, 1);
|
//return float4(finalSum,finalSum,finalSum, 1);
|
||||||
|
|
||||||
// Normalize blendVal
|
// Normalize blendVal
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue