mirror of
https://github.com/TorqueGameEngines/Torque3D.git
synced 2026-02-13 03:33:48 +00:00
Update GFXTextureManager and GBitmap
GBitmap Changes: Added all other formats to gbitmap that we support gbitmap now supports cubemaps added converters for all these other formats added stb_image_resize for extrudemips so we can extrude mipmaps for all other formats GFXTextureManager Can now directly make cubemaps and texture arrays based on the GFXTextureProfile API implementations for all functions that cubemaps and arrays needed
This commit is contained in:
parent
975fc924cc
commit
3aef90a6bc
66 changed files with 4235 additions and 2590 deletions
|
|
@ -374,7 +374,7 @@ void RenderDeferredMgr::render( SceneRenderState *state )
|
|||
|
||||
// init loop data
|
||||
GFXTextureObject *lastLM = NULL;
|
||||
GFXCubemap *lastCubemap = NULL;
|
||||
GFXTexHandle lastCubemap = NULL;
|
||||
GFXTextureObject *lastReflectTex = NULL;
|
||||
GFXTextureObject *lastAccuTex = NULL;
|
||||
|
||||
|
|
|
|||
|
|
@ -113,7 +113,7 @@ void RenderMeshMgr::render(SceneRenderState * state)
|
|||
|
||||
// init loop data
|
||||
GFXTextureObject *lastLM = NULL;
|
||||
GFXCubemap *lastCubemap = NULL;
|
||||
GFXTexHandle lastCubemap = NULL;
|
||||
GFXTextureObject *lastReflectTex = NULL;
|
||||
GFXTextureObject *lastMiscTex = NULL;
|
||||
GFXTextureObject *lastAccuTex = NULL;
|
||||
|
|
|
|||
|
|
@ -382,7 +382,7 @@ struct MeshRenderInst : public RenderInst
|
|||
GFXTextureObject *reflectTex;
|
||||
GFXTextureObject *miscTex;
|
||||
GFXTextureObject *accuTex;
|
||||
GFXCubemap *cubemap;
|
||||
GFXTexHandle cubemap;
|
||||
|
||||
/// @name Hardware Skinning
|
||||
/// {
|
||||
|
|
|
|||
|
|
@ -221,6 +221,9 @@ RenderProbeMgr::~RenderProbeMgr()
|
|||
SAFE_DELETE(i->value);
|
||||
}
|
||||
mConstantLookup.clear();
|
||||
|
||||
mIrradianceArray.free();
|
||||
mPrefilterArray.free();
|
||||
}
|
||||
|
||||
bool RenderProbeMgr::onAdd()
|
||||
|
|
@ -228,13 +231,11 @@ bool RenderProbeMgr::onAdd()
|
|||
if (!Parent::onAdd())
|
||||
return false;
|
||||
|
||||
mIrradianceArray = GFXCubemapArrayHandle(GFX->createCubemapArray());
|
||||
mPrefilterArray = GFXCubemapArrayHandle(GFX->createCubemapArray());
|
||||
|
||||
U32 scaledSize = getProbeTexSize();
|
||||
//pre-allocate a few slots
|
||||
mIrradianceArray->init(PROBE_ARRAY_SLOT_BUFFER_SIZE, scaledSize, PROBE_FORMAT);
|
||||
mPrefilterArray->init(PROBE_ARRAY_SLOT_BUFFER_SIZE, scaledSize, PROBE_FORMAT);
|
||||
mIrradianceArray.set(scaledSize, scaledSize, PROBE_FORMAT, &GFXCubemapStaticTextureProfile, "RenderProbeMgr::mIrradianceArray", 0,0, PROBE_ARRAY_SLOT_BUFFER_SIZE);
|
||||
mPrefilterArray.set(scaledSize, scaledSize, PROBE_FORMAT, &GFXCubemapStaticTextureProfile, "RenderProbeMgr::mPrefilterArray", 0,0, PROBE_ARRAY_SLOT_BUFFER_SIZE);
|
||||
|
||||
mCubeSlotCount = PROBE_ARRAY_SLOT_BUFFER_SIZE;
|
||||
|
||||
String brdfTexturePath = GFXTextureManager::getBRDFTexturePath();
|
||||
|
|
@ -376,12 +377,12 @@ void RenderProbeMgr::registerProbe(ReflectionProbe::ProbeInfo* newProbe)
|
|||
if (cubeIndex >= mCubeSlotCount)
|
||||
{
|
||||
//alloc temp array handles
|
||||
GFXCubemapArrayHandle irr = GFXCubemapArrayHandle(GFX->createCubemapArray());
|
||||
GFXCubemapArrayHandle prefilter = GFXCubemapArrayHandle(GFX->createCubemapArray());
|
||||
GFXTexHandle irr;
|
||||
GFXTexHandle prefilter;
|
||||
|
||||
U32 scaledSize = getProbeTexSize();
|
||||
irr->init(mCubeSlotCount + PROBE_ARRAY_SLOT_BUFFER_SIZE, scaledSize, PROBE_FORMAT);
|
||||
prefilter->init(mCubeSlotCount + PROBE_ARRAY_SLOT_BUFFER_SIZE, scaledSize, PROBE_FORMAT);
|
||||
irr.set(scaledSize, scaledSize, PROBE_FORMAT, &GFXCubemapStaticTextureProfile, "RenderProbeMgr::mIrradianceArray_temp_expansion", 0, 0, mCubeSlotCount + PROBE_ARRAY_SLOT_BUFFER_SIZE);
|
||||
prefilter.set(scaledSize, scaledSize, PROBE_FORMAT, &GFXCubemapStaticTextureProfile, "RenderProbeMgr::mPrefilterArray_temp_expansion", 0, 0, mCubeSlotCount + PROBE_ARRAY_SLOT_BUFFER_SIZE);
|
||||
|
||||
mIrradianceArray->copyTo(irr);
|
||||
mPrefilterArray->copyTo(prefilter);
|
||||
|
|
@ -390,6 +391,9 @@ void RenderProbeMgr::registerProbe(ReflectionProbe::ProbeInfo* newProbe)
|
|||
mIrradianceArray = irr;
|
||||
mPrefilterArray = prefilter;
|
||||
|
||||
irr.free();
|
||||
prefilter.free();
|
||||
|
||||
mCubeSlotCount += PROBE_ARRAY_SLOT_BUFFER_SIZE;
|
||||
}
|
||||
|
||||
|
|
@ -466,15 +470,13 @@ void RenderProbeMgr::updateProbeTexture(ReflectionProbe::ProbeInfo* probeInfo)
|
|||
return;
|
||||
U32 scaledSize = getProbeTexSize();
|
||||
//Some basic sanity checking that we have valid cubemaps to work with
|
||||
if (probeInfo->mIrradianceCubemap.isNull() || !probeInfo->mIrradianceCubemap->isInitialized() ||
|
||||
probeInfo->mIrradianceCubemap->getSize() != scaledSize)
|
||||
if (probeInfo->mIrradianceCubemap.isNull() || probeInfo->mIrradianceCubemap->getWidth() != scaledSize)
|
||||
{
|
||||
Con::errorf("RenderProbeMgr::updateProbeTexture() - tried to update a probe's texture with an invalid or uninitialized irradiance map!");
|
||||
return;
|
||||
}
|
||||
|
||||
if (probeInfo->mPrefilterCubemap.isNull() || !probeInfo->mPrefilterCubemap->isInitialized() ||
|
||||
probeInfo->mPrefilterCubemap->getSize() != scaledSize)
|
||||
if (probeInfo->mPrefilterCubemap.isNull() || probeInfo->mPrefilterCubemap->getWidth() != scaledSize)
|
||||
{
|
||||
Con::errorf("RenderProbeMgr::updateProbeTexture() - tried to update a probe's texture with an invalid or uninitialized specular map!");
|
||||
return;
|
||||
|
|
@ -482,12 +484,13 @@ void RenderProbeMgr::updateProbeTexture(ReflectionProbe::ProbeInfo* probeInfo)
|
|||
|
||||
//Run the update on the array pair with the probe's cubemaps and index
|
||||
const U32 cubeIndex = probe->mCubemapIndex;
|
||||
mIrradianceArray->updateTexture(probeInfo->mIrradianceCubemap, cubeIndex);
|
||||
mPrefilterArray->updateTexture(probeInfo->mPrefilterCubemap, cubeIndex);
|
||||
mIrradianceArray->updateTextureSlot(probeInfo->mIrradianceCubemap, cubeIndex);
|
||||
|
||||
mPrefilterArray->updateTextureSlot(probeInfo->mPrefilterCubemap, cubeIndex);
|
||||
|
||||
#ifdef TORQUE_DEBUG
|
||||
Con::warnf("UpdatedProbeTexture - probe id: %u on cubeIndex %u, Irrad validity: %d, Prefilter validity: %d", probeInfo->mObject->getId(), cubeIndex,
|
||||
probeInfo->mIrradianceCubemap->isInitialized(), probeInfo->mPrefilterCubemap->isInitialized());
|
||||
probeInfo->mIrradianceCubemap.isValid(), probeInfo->mPrefilterCubemap.isValid());
|
||||
#endif
|
||||
}
|
||||
|
||||
|
|
@ -616,8 +619,8 @@ void RenderProbeMgr::bakeProbe(ReflectionProbe* probe)
|
|||
clientProbe->createClientResources();
|
||||
|
||||
//Prep it with whatever resolution we've dictated for our bake
|
||||
clientProbe->mIrridianceMap->mCubemap->initDynamic(resolution, reflectFormat);
|
||||
clientProbe->mPrefilterMap->mCubemap->initDynamic(resolution, reflectFormat);
|
||||
clientProbe->mIrridianceMap->mCubemap.set(resolution, resolution, reflectFormat, &GFXCubemapRenderTargetProfile, "ReflectionProbe::mIrridianceMap", 0);
|
||||
clientProbe->mPrefilterMap->mCubemap.set(resolution, resolution, reflectFormat, &GFXCubemapRenderTargetProfile, "ReflectionProbe::mPrefilterMap", 0);
|
||||
|
||||
GFXTextureTargetRef renderTarget = GFX->allocRenderToTextureTarget(false);
|
||||
clientProbe->mPrefilterMap->mCubemap = cubeRefl.getCubemap();
|
||||
|
|
@ -807,9 +810,9 @@ void RenderProbeMgr::_update4ProbeConsts(const SceneData& sgData,
|
|||
shaderConsts->setSafe(probeShaderConsts->mSkylightDampSC, (int)probeSet.skyLightDamp);
|
||||
|
||||
if (probeShaderConsts->mProbeSpecularCubemapArraySC->getSamplerRegister() != -1)
|
||||
GFX->setCubeArrayTexture(probeShaderConsts->mProbeSpecularCubemapArraySC->getSamplerRegister(), mPrefilterArray);
|
||||
GFX->setTexture(probeShaderConsts->mProbeSpecularCubemapArraySC->getSamplerRegister(), mPrefilterArray);
|
||||
if (probeShaderConsts->mProbeIrradianceCubemapArraySC->getSamplerRegister() != -1)
|
||||
GFX->setCubeArrayTexture(probeShaderConsts->mProbeIrradianceCubemapArraySC->getSamplerRegister(), mIrradianceArray);
|
||||
GFX->setTexture(probeShaderConsts->mProbeIrradianceCubemapArraySC->getSamplerRegister(), mIrradianceArray);
|
||||
|
||||
shaderConsts->setSafe(probeShaderConsts->mMaxProbeDrawDistanceSC, smMaxProbeDrawDistance);
|
||||
}
|
||||
|
|
@ -875,8 +878,8 @@ void RenderProbeMgr::render( SceneRenderState *state )
|
|||
mProbeArrayEffect->setShaderMacro("MAX_PROBES", probePerFrame);
|
||||
|
||||
mProbeArrayEffect->setTexture(3, mBRDFTexture);
|
||||
mProbeArrayEffect->setCubemapArrayTexture(4, mPrefilterArray);
|
||||
mProbeArrayEffect->setCubemapArrayTexture(5, mIrradianceArray);
|
||||
mProbeArrayEffect->setTexture(4, mPrefilterArray);
|
||||
mProbeArrayEffect->setTexture(5, mIrradianceArray);
|
||||
mProbeArrayEffect->setTexture(6, mWetnessTexture);
|
||||
//ssao mask
|
||||
if (AdvancedLightBinManager::smUseSSAOMask)
|
||||
|
|
@ -898,7 +901,7 @@ void RenderProbeMgr::render( SceneRenderState *state )
|
|||
mProbeArrayEffect->setShaderConst("$skylightCubemapIdx", (S32)mProbeData.skyLightIdx);
|
||||
mProbeArrayEffect->setShaderConst(ShaderGenVars::skylightDamp, mProbeData.skyLightDamp);
|
||||
|
||||
mProbeArrayEffect->setShaderConst("$cubeMips", (float)mPrefilterArray->getMipMapLevels());
|
||||
mProbeArrayEffect->setShaderConst("$cubeMips", (float)mPrefilterArray->getMipLevels());
|
||||
|
||||
//also set up some colors
|
||||
Vector<Point4F> contribColors;
|
||||
|
|
|
|||
|
|
@ -184,7 +184,6 @@ public:
|
|||
static F32 smMaxProbeDrawDistance;
|
||||
static S32 smMaxProbesPerFrame;
|
||||
static S32 smProbeBakeResolution;
|
||||
SceneRenderState *mState;
|
||||
private:
|
||||
/// <summary>
|
||||
/// List of registered probes. These are not necessarily rendered in a given frame
|
||||
|
|
@ -246,12 +245,12 @@ private:
|
|||
/// <summary>
|
||||
/// The prefilter cubemap array
|
||||
/// </summary>
|
||||
GFXCubemapArrayHandle mPrefilterArray;
|
||||
GFXTexHandle mPrefilterArray;
|
||||
|
||||
/// <summary>
|
||||
/// The irradiance cubemap array
|
||||
/// </summary>
|
||||
GFXCubemapArrayHandle mIrradianceArray;
|
||||
GFXTexHandle mIrradianceArray;
|
||||
|
||||
//Utilized in forward rendering
|
||||
|
||||
|
|
@ -291,11 +290,6 @@ private:
|
|||
/// </summary>
|
||||
bool mUseHDRCaptures;
|
||||
|
||||
/// <summary>
|
||||
/// holds the normal render state for light fade so we can capture them before and restore them after baking
|
||||
/// </summary>
|
||||
S32 mRenderMaximumNumOfLights;
|
||||
bool mRenderUseLightFade;
|
||||
protected:
|
||||
/// The current active light manager.
|
||||
static RenderProbeMgr* smProbeManager;
|
||||
|
|
|
|||
|
|
@ -142,7 +142,7 @@ void RenderTranslucentMgr::render( SceneRenderState *state )
|
|||
|
||||
// init loop data
|
||||
GFXTextureObject *lastLM = NULL;
|
||||
GFXCubemap *lastCubemap = NULL;
|
||||
GFXTexHandle lastCubemap = NULL;
|
||||
GFXTextureObject *lastReflectTex = NULL;
|
||||
GFXTextureObject *lastAccuTex = NULL;
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue