diff --git a/Engine/source/T3D/lighting/reflectionProbe.cpp b/Engine/source/T3D/lighting/reflectionProbe.cpp index 6fccb3d05..671433878 100644 --- a/Engine/source/T3D/lighting/reflectionProbe.cpp +++ b/Engine/source/T3D/lighting/reflectionProbe.cpp @@ -638,8 +638,7 @@ void ReflectionProbe::processBakedCubemap() mProbeInfo->mIsEnabled = true; //Update the probe manager with our new texture! - if (!mProbeInfo->mIsSkylight) - PROBEMGR->updateProbeTexture(mProbeInfo->mProbeIdx); + PROBEMGR->updateProbeTexture(mProbeInfo->mProbeIdx); } } @@ -730,8 +729,7 @@ void ReflectionProbe::processStaticCubemap() mProbeInfo->mIsEnabled = true; //Update the probe manager with our new texture! - if (!mProbeInfo->mIsSkylight) - PROBEMGR->updateProbeTexture(mProbeInfo->mProbeIdx); + PROBEMGR->updateProbeTexture(mProbeInfo->mProbeIdx); } } @@ -739,7 +737,7 @@ bool ReflectionProbe::createClientResources() { if (mProbeInfo == nullptr) { - mProbeInfo = PROBEMGR->registerProbe(mProbeShapeType == ProbeRenderInst::Skylight); + mProbeInfo = PROBEMGR->registerProbe(); if (!mProbeInfo) return false; diff --git a/Engine/source/renderInstance/renderProbeMgr.cpp b/Engine/source/renderInstance/renderProbeMgr.cpp index 878253e93..74603dd81 100644 --- a/Engine/source/renderInstance/renderProbeMgr.cpp +++ b/Engine/source/renderInstance/renderProbeMgr.cpp @@ -314,51 +314,47 @@ void RenderProbeMgr::addElement(RenderInst *inst) }*/ } -ProbeRenderInst* RenderProbeMgr::registerProbe(const bool &isSkylight) +ProbeRenderInst* RenderProbeMgr::registerProbe() { ProbeRenderInst newProbe; - newProbe.mIsSkylight = isSkylight; mRegisteredProbes.push_back(newProbe); newProbe.mProbeIdx = mRegisteredProbes.size(); - if (!newProbe.mIsSkylight) + const U32 cubeIndex = _findNextEmptyCubeSlot(); + if (cubeIndex == INVALID_CUBE_SLOT) { - const U32 cubeIndex = _findNextEmptyCubeSlot(); - if (cubeIndex == INVALID_CUBE_SLOT) - { - Con::warnf("RenderProbeMgr::addProbe: Invalid cubemap slot."); - return nullptr; - } - - //check if we need to resize the cubemap array - if (cubeIndex >= mCubeSlotCount) - { - //alloc temp array handles - GFXCubemapArrayHandle irr = GFXCubemapArrayHandle(GFX->createCubemapArray()); - GFXCubemapArrayHandle prefilter = GFXCubemapArrayHandle(GFX->createCubemapArray()); - - irr->init(mCubeSlotCount + PROBE_ARRAY_SLOT_BUFFER_SIZE, PROBE_IRRAD_SIZE, PROBE_FORMAT); - prefilter->init(mCubeSlotCount + PROBE_ARRAY_SLOT_BUFFER_SIZE, PROBE_PREFILTER_SIZE, PROBE_FORMAT); - - mIrradianceArray->copyTo(irr); - mPrefilterArray->copyTo(prefilter); - - //assign the temp handles to the new ones, this will destroy the old ones as well - mIrradianceArray = irr; - mPrefilterArray = prefilter; - - mCubeSlotCount += PROBE_ARRAY_SLOT_BUFFER_SIZE; - } - - newProbe.mCubemapIndex = cubeIndex; - //mark cubemap slot as taken - mCubeMapSlots[cubeIndex] = true; - mCubeMapCount++; - - Con::warnf("RenderProbeMgr::registerProbe: Registered probe %u to cubeIndex %u", newProbe.mProbeIdx, cubeIndex); + Con::warnf("RenderProbeMgr::addProbe: Invalid cubemap slot."); + return nullptr; } + //check if we need to resize the cubemap array + if (cubeIndex >= mCubeSlotCount) + { + //alloc temp array handles + GFXCubemapArrayHandle irr = GFXCubemapArrayHandle(GFX->createCubemapArray()); + GFXCubemapArrayHandle prefilter = GFXCubemapArrayHandle(GFX->createCubemapArray()); + + irr->init(mCubeSlotCount + PROBE_ARRAY_SLOT_BUFFER_SIZE, PROBE_IRRAD_SIZE, PROBE_FORMAT); + prefilter->init(mCubeSlotCount + PROBE_ARRAY_SLOT_BUFFER_SIZE, PROBE_PREFILTER_SIZE, PROBE_FORMAT); + + mIrradianceArray->copyTo(irr); + mPrefilterArray->copyTo(prefilter); + + //assign the temp handles to the new ones, this will destroy the old ones as well + mIrradianceArray = irr; + mPrefilterArray = prefilter; + + mCubeSlotCount += PROBE_ARRAY_SLOT_BUFFER_SIZE; + } + + newProbe.mCubemapIndex = cubeIndex; + //mark cubemap slot as taken + mCubeMapSlots[cubeIndex] = true; + mCubeMapCount++; + + Con::warnf("RenderProbeMgr::registerProbe: Registered probe %u to cubeIndex %u", newProbe.mProbeIdx, cubeIndex); + mProbesDirty = true; return &mRegisteredProbes.last(); @@ -416,6 +412,7 @@ void RenderProbeMgr::_setupStaticParameters() mMipCount = 0; mHasSkylight = false; + mSkylightCubemapIdx = -1; if (probePositionsData.size() != MAXPROBECOUNT) { @@ -434,19 +431,9 @@ void RenderProbeMgr::_setupStaticParameters() probeBBMaxData.fill(Point4F::Zero); probeConfigData.fill(Point4F::Zero); - cubeMaps.clear(); - irradMaps.clear(); Vector cubemapIdxes; - if (probeCount != 0 && mRegisteredProbes[0].mPrefilterCubemap != nullptr) - { - //Get our mipCount - mMipCount = mRegisteredProbes[0].mPrefilterCubemap.getPointer()->getMipMapLevels(); - } - else - { - mMipCount = 1; - } + mMipCount = 1; for (U32 i = 0; i < probeCount; i++) { @@ -457,11 +444,12 @@ void RenderProbeMgr::_setupStaticParameters() if (!curEntry.mIsEnabled) continue; + U32 mips = mRegisteredProbes[0].mPrefilterCubemap.getPointer()->getMipMapLevels(); + mMipCount = mips != 0 && mips > mMipCount ? mips : 0; + if (curEntry.mProbeShapeType == ProbeRenderInst::ProbeShapeType::Skylight || curEntry.mIsSkylight) { - skylightPos = curEntry.getPosition(); - skylightPrefilterMap = curEntry.mPrefilterCubemap; - skylightIrradMap = curEntry.mIrradianceCubemap; + mSkylightCubemapIdx = curEntry.mCubemapIndex; mHasSkylight = true; continue; } @@ -483,9 +471,6 @@ void RenderProbeMgr::_setupStaticParameters() curEntry.mAtten, curEntry.mCubemapIndex); - cubeMaps.push_back(curEntry.mPrefilterCubemap); - irradMaps.push_back(curEntry.mIrradianceCubemap); - cubemapIdxes.push_back(i); mEffectiveProbeCount++; @@ -499,10 +484,6 @@ void RenderProbeMgr::updateProbeTexture(U32 probeIdx) if (probeIdx >= mRegisteredProbes.size()) return; - //We don't stuff skylights into the array, so we can just skip out on this if it's a skylight - if (mRegisteredProbes[probeIdx].mIsSkylight) - return; - const U32 cubeIndex = mRegisteredProbes[probeIdx].mCubemapIndex; mIrradianceArray->updateTexture(mRegisteredProbes[probeIdx].mIrradianceCubemap, cubeIndex); mPrefilterArray->updateTexture(mRegisteredProbes[probeIdx].mPrefilterCubemap, cubeIndex); @@ -758,7 +739,7 @@ void RenderProbeMgr::render( SceneRenderState *state ) _setupStaticParameters(); // Early out if nothing to draw. - if (!RenderProbeMgr::smRenderReflectionProbes || !state->isDiffusePass() || (!mRegisteredProbes.size() || mEffectiveProbeCount == 0 || mCubeMapCount != 0 ) && !mHasSkylight) + if (!RenderProbeMgr::smRenderReflectionProbes || !state->isDiffusePass() || (mRegisteredProbes.size() == 0 || (mEffectiveProbeCount == 0 && !mHasSkylight))) { getProbeArrayEffect()->setSkip(true); return; @@ -772,7 +753,7 @@ void RenderProbeMgr::render( SceneRenderState *state ) // the vector light material as we use lazy creation. //_setupPerFrameParameters(state); - //Visualization + //Visualization String useDebugAtten = Con::getVariable("$Probes::showAttenuation", "0"); mProbeArrayEffect->setShaderMacro("DEBUGVIZ_ATTENUATION", useDebugAtten); @@ -785,14 +766,17 @@ void RenderProbeMgr::render( SceneRenderState *state ) String useDebugContrib = Con::getVariable("$Probes::showProbeContrib", "0"); mProbeArrayEffect->setShaderMacro("DEBUGVIZ_CONTRIB", useDebugContrib); - //Array rendering - //U32 probeCount = mRegisteredProbes.size(); + if (mHasSkylight || mEffectiveProbeCount != 0) + { + mProbeArrayEffect->setTexture(3, mBRDFTexture); + mProbeArrayEffect->setCubemapArrayTexture(4, mPrefilterArray); + mProbeArrayEffect->setCubemapArrayTexture(5, mIrradianceArray); + } mProbeArrayEffect->setShaderConst("$hasSkylight", (float)mHasSkylight); if (mHasSkylight) { - mProbeArrayEffect->setCubemapTexture(6, skylightPrefilterMap); - mProbeArrayEffect->setCubemapTexture(7, skylightIrradMap); + mProbeArrayEffect->setShaderConst("$skylightCubemapIdx", mSkylightCubemapIdx); } mProbeArrayEffect->setShaderConst("$numProbes", (float)mEffectiveProbeCount); @@ -800,10 +784,6 @@ void RenderProbeMgr::render( SceneRenderState *state ) mProbeArrayEffect->setShaderConst("$cubeMips", (float)mMipCount); if (mEffectiveProbeCount != 0) { - mProbeArrayEffect->setTexture(3, mBRDFTexture); - mProbeArrayEffect->setCubemapArrayTexture(4, mPrefilterArray); - mProbeArrayEffect->setCubemapArrayTexture(5, mIrradianceArray); - if (useDebugContrib == String("1")) { MRandomLCG RandomGen; @@ -829,14 +809,14 @@ void RenderProbeMgr::render( SceneRenderState *state ) mProbeArrayEffect->setShaderConst("$probeContribColors", contribColors); } - } - mProbeArrayEffect->setShaderConst("$inProbePosArray", probePositionsData); - mProbeArrayEffect->setShaderConst("$inRefPosArray", probeRefPositionsData); - mProbeArrayEffect->setShaderConst("$worldToObjArray", probeWorldToObjData); - mProbeArrayEffect->setShaderConst("$bbMinArray", probeBBMinData); - mProbeArrayEffect->setShaderConst("$bbMaxArray", probeBBMaxData); - mProbeArrayEffect->setShaderConst("$probeConfigData", probeConfigData); + mProbeArrayEffect->setShaderConst("$inProbePosArray", probePositionsData); + mProbeArrayEffect->setShaderConst("$inRefPosArray", probeRefPositionsData); + mProbeArrayEffect->setShaderConst("$worldToObjArray", probeWorldToObjData); + mProbeArrayEffect->setShaderConst("$bbMinArray", probeBBMinData); + mProbeArrayEffect->setShaderConst("$bbMaxArray", probeBBMaxData); + mProbeArrayEffect->setShaderConst("$probeConfigData", probeConfigData); + } // Make sure the effect is gonna render. getProbeArrayEffect()->setSkip(false); diff --git a/Engine/source/renderInstance/renderProbeMgr.h b/Engine/source/renderInstance/renderProbeMgr.h index 560410188..8eba74431 100644 --- a/Engine/source/renderInstance/renderProbeMgr.h +++ b/Engine/source/renderInstance/renderProbeMgr.h @@ -199,13 +199,9 @@ class RenderProbeMgr : public RenderBinManager Vector probeBBMinData; Vector probeBBMaxData; Vector probeConfigData; - Vector cubeMaps; - Vector irradMaps; - bool mHasSkylight; - GFXCubemapHandle skylightIrradMap; - GFXCubemapHandle skylightPrefilterMap; - Point4F skylightPos; + bool mHasSkylight; + S32 mSkylightCubemapIdx; AlignedArray mProbePositions; AlignedArray mProbeBBMin; @@ -286,7 +282,7 @@ public: /// Returns the active LM. static inline RenderProbeMgr* getProbeManager(); - ProbeRenderInst* registerProbe(const bool& isSkylight); + ProbeRenderInst* registerProbe(); void unregisterProbe(U32 probeIdx); virtual void setProbeInfo(ProcessedMaterial *pmat, diff --git a/Templates/BaseGame/game/core/rendering/shaders/lighting/advanced/reflectionProbeArrayP.hlsl b/Templates/BaseGame/game/core/rendering/shaders/lighting/advanced/reflectionProbeArrayP.hlsl index ea2ca7641..9ded5bd1b 100644 --- a/Templates/BaseGame/game/core/rendering/shaders/lighting/advanced/reflectionProbeArrayP.hlsl +++ b/Templates/BaseGame/game/core/rendering/shaders/lighting/advanced/reflectionProbeArrayP.hlsl @@ -31,9 +31,8 @@ uniform float4 probeConfigData[MAX_PROBES]; //r,g,b/mode,radius,atten uniform float4 probeContribColors[MAX_PROBES]; #endif -TORQUE_UNIFORM_SAMPLERCUBE(skylightSpecularMap, 6); -TORQUE_UNIFORM_SAMPLERCUBE(skylightIrradMap, 7); uniform float hasSkylight; +uniform float skylightCubemapIdx; float4 main(PFXVertToPix IN) : SV_TARGET { @@ -173,8 +172,8 @@ float4 main(PFXVertToPix IN) : SV_TARGET if (hasSkylight && alpha > 0.001) { - irradiance += TORQUE_TEXCUBELOD(skylightIrradMap, float4(surface.R, 0)).xyz * alpha; - specular += TORQUE_TEXCUBELOD(skylightSpecularMap, float4(surface.R, lod)).xyz * alpha; + irradiance += TORQUE_TEXCUBEARRAYLOD(irradianceCubemapAR, surface.R, skylightCubemapIdx, 0).xyz * alpha; + specular += TORQUE_TEXCUBEARRAYLOD(specularCubemapAR, surface.R, skylightCubemapIdx, lod).xyz * alpha; } #if DEBUGVIZ_SPECCUBEMAP == 1 && DEBUGVIZ_DIFFCUBEMAP == 0