#684 Fix pixellation on mirrors regardless of mirror resolution.
parent
ac76b1b256
commit
fac63e473a
|
|
@ -10421,7 +10421,7 @@
|
|||
<key>Type</key>
|
||||
<string>S32</string>
|
||||
<key>Value</key>
|
||||
<integer>1024</integer>
|
||||
<integer>2048</integer>
|
||||
</map>
|
||||
<key>RenderHeroProbeDistance</key>
|
||||
<map>
|
||||
|
|
@ -10432,18 +10432,7 @@
|
|||
<key>Type</key>
|
||||
<string>F32</string>
|
||||
<key>Value</key>
|
||||
<real>16</real>
|
||||
</map>
|
||||
<key>RenderHeroProbeNearClipOffset</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Distance offset in meters for hero probes to near clip.</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>F32</string>
|
||||
<key>Value</key>
|
||||
<real>2.1</real>
|
||||
<real>8</real>
|
||||
</map>
|
||||
<key>RenderReflectionProbeVolumes</key>
|
||||
<map>
|
||||
|
|
|
|||
|
|
@ -130,7 +130,7 @@ vec4 prefilterEnvMap(vec3 R)
|
|||
float totalWeight = 0.0;
|
||||
float envMapDim = float(textureSize(reflectionProbes, 0).s);
|
||||
float roughness = mipLevel/max_probe_lod;
|
||||
int numSamples = max(int(32*roughness), 1);
|
||||
int numSamples = max(int(PROBE_FILTER_SAMPLES*roughness), 1);
|
||||
|
||||
float numMips = max_probe_lod+1;
|
||||
|
||||
|
|
|
|||
|
|
@ -217,7 +217,7 @@ void LLHeroProbeManager::update()
|
|||
void LLHeroProbeManager::updateProbeFace(LLReflectionMap* probe, U32 face, F32 near_clip)
|
||||
{
|
||||
// hacky hot-swap of camera specific render targets
|
||||
gPipeline.mRT = &gPipeline.mAuxillaryRT;
|
||||
gPipeline.mRT = &gPipeline.mHeroProbeRT;
|
||||
|
||||
probe->update(mRenderTarget.getWidth(), face, true, near_clip);
|
||||
|
||||
|
|
@ -252,9 +252,10 @@ void LLHeroProbeManager::updateProbeFace(LLReflectionMap* probe, U32 face, F32 n
|
|||
static LLStaticHashedString znear("znear");
|
||||
static LLStaticHashedString zfar("zfar");
|
||||
|
||||
LLRenderTarget *screen_rt = &gPipeline.mAuxillaryRT.screen;
|
||||
LLRenderTarget *depth_rt = &gPipeline.mAuxillaryRT.deferredScreen;
|
||||
LLRenderTarget *screen_rt = &gPipeline.mHeroProbeRT.screen;
|
||||
LLRenderTarget *depth_rt = &gPipeline.mHeroProbeRT.deferredScreen;
|
||||
|
||||
/*
|
||||
// perform a gaussian blur on the super sampled render before downsampling
|
||||
{
|
||||
gGaussianProgram.bind();
|
||||
|
|
@ -277,7 +278,7 @@ void LLHeroProbeManager::updateProbeFace(LLReflectionMap* probe, U32 face, F32 n
|
|||
gPipeline.mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3);
|
||||
screen_rt->flush();
|
||||
}
|
||||
|
||||
*/
|
||||
|
||||
S32 mips = log2((F32)mProbeResolution) + 0.5f;
|
||||
|
||||
|
|
@ -338,14 +339,14 @@ void LLHeroProbeManager::updateProbeFace(LLReflectionMap* probe, U32 face, F32 n
|
|||
|
||||
{
|
||||
//generate radiance map (even if this is not the irradiance map, we need the mip chain for the irradiance map)
|
||||
gRadianceGenProgram.bind();
|
||||
gHeroRadianceGenProgram.bind();
|
||||
mVertexBuffer->setBuffer();
|
||||
|
||||
S32 channel = gRadianceGenProgram.enableTexture(LLShaderMgr::REFLECTION_PROBES, LLTexUnit::TT_CUBE_MAP_ARRAY);
|
||||
S32 channel = gHeroRadianceGenProgram.enableTexture(LLShaderMgr::REFLECTION_PROBES, LLTexUnit::TT_CUBE_MAP_ARRAY);
|
||||
mTexture->bind(channel);
|
||||
gRadianceGenProgram.uniform1i(sSourceIdx, sourceIdx);
|
||||
gRadianceGenProgram.uniform1f(LLShaderMgr::REFLECTION_PROBE_MAX_LOD, mMaxProbeLOD);
|
||||
gRadianceGenProgram.uniform1f(LLShaderMgr::REFLECTION_PROBE_STRENGTH, mHeroProbeStrength);
|
||||
gHeroRadianceGenProgram.uniform1i(sSourceIdx, sourceIdx);
|
||||
gHeroRadianceGenProgram.uniform1f(LLShaderMgr::REFLECTION_PROBE_MAX_LOD, mMaxProbeLOD);
|
||||
gHeroRadianceGenProgram.uniform1f(LLShaderMgr::REFLECTION_PROBE_STRENGTH, mHeroProbeStrength);
|
||||
|
||||
U32 res = mMipChain[0].getWidth();
|
||||
|
||||
|
|
@ -357,10 +358,10 @@ void LLHeroProbeManager::updateProbeFace(LLReflectionMap* probe, U32 face, F32 n
|
|||
static LLStaticHashedString sWidth("u_width");
|
||||
static LLStaticHashedString sStrength("probe_strength");
|
||||
|
||||
gRadianceGenProgram.uniform1f(sRoughness, (F32)i / (F32)(mMipChain.size() - 1));
|
||||
gRadianceGenProgram.uniform1f(sMipLevel, i);
|
||||
gRadianceGenProgram.uniform1i(sWidth, mProbeResolution);
|
||||
gRadianceGenProgram.uniform1f(sStrength, 1);
|
||||
gHeroRadianceGenProgram.uniform1f(sRoughness, (F32) i / (F32) (mMipChain.size() - 1));
|
||||
gHeroRadianceGenProgram.uniform1f(sMipLevel, i);
|
||||
gHeroRadianceGenProgram.uniform1i(sWidth, mProbeResolution);
|
||||
gHeroRadianceGenProgram.uniform1f(sStrength, 1);
|
||||
|
||||
for (int cf = 0; cf < 6; ++cf)
|
||||
{ // for each cube face
|
||||
|
|
@ -383,7 +384,7 @@ void LLHeroProbeManager::updateProbeFace(LLReflectionMap* probe, U32 face, F32 n
|
|||
}
|
||||
}
|
||||
|
||||
gRadianceGenProgram.unbind();
|
||||
gHeroRadianceGenProgram.unbind();
|
||||
}
|
||||
|
||||
mMipChain[0].flush();
|
||||
|
|
|
|||
|
|
@ -84,7 +84,8 @@ LLGLSLShader gOcclusionCubeProgram;
|
|||
LLGLSLShader gGlowCombineProgram;
|
||||
LLGLSLShader gReflectionMipProgram;
|
||||
LLGLSLShader gGaussianProgram;
|
||||
LLGLSLShader gRadianceGenProgram;
|
||||
LLGLSLShader gRadianceGenProgram;
|
||||
LLGLSLShader gHeroRadianceGenProgram;
|
||||
LLGLSLShader gIrradianceGenProgram;
|
||||
LLGLSLShader gGlowCombineFXAAProgram;
|
||||
LLGLSLShader gTwoTextureCompareProgram;
|
||||
|
|
@ -2799,8 +2800,21 @@ BOOL LLViewerShaderMgr::loadShadersInterface()
|
|||
gRadianceGenProgram.mShaderFiles.push_back(make_pair("interface/radianceGenV.glsl", GL_VERTEX_SHADER));
|
||||
gRadianceGenProgram.mShaderFiles.push_back(make_pair("interface/radianceGenF.glsl", GL_FRAGMENT_SHADER));
|
||||
gRadianceGenProgram.mShaderLevel = mShaderLevel[SHADER_INTERFACE];
|
||||
gRadianceGenProgram.addPermutation("PROBE_FILTER_SAMPLES", "32");
|
||||
success = gRadianceGenProgram.createShader(NULL, NULL);
|
||||
}
|
||||
|
||||
if (success && gGLManager.mHasCubeMapArray)
|
||||
{
|
||||
gHeroRadianceGenProgram.mName = "Hero Radiance Gen Shader";
|
||||
gHeroRadianceGenProgram.mShaderFiles.clear();
|
||||
gHeroRadianceGenProgram.mShaderFiles.push_back(make_pair("interface/radianceGenV.glsl", GL_VERTEX_SHADER));
|
||||
gHeroRadianceGenProgram.mShaderFiles.push_back(make_pair("interface/radianceGenF.glsl", GL_FRAGMENT_SHADER));
|
||||
gHeroRadianceGenProgram.mShaderLevel = mShaderLevel[SHADER_INTERFACE];
|
||||
gHeroRadianceGenProgram.addPermutation("HERO_PROBES", "1");
|
||||
gHeroRadianceGenProgram.addPermutation("PROBE_FILTER_SAMPLES", "4");
|
||||
success = gHeroRadianceGenProgram.createShader(NULL, NULL);
|
||||
}
|
||||
|
||||
if (success && gGLManager.mHasCubeMapArray)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -153,6 +153,7 @@ extern LLGLSLShader gGlowCombineProgram;
|
|||
extern LLGLSLShader gReflectionMipProgram;
|
||||
extern LLGLSLShader gGaussianProgram;
|
||||
extern LLGLSLShader gRadianceGenProgram;
|
||||
extern LLGLSLShader gHeroRadianceGenProgram;
|
||||
extern LLGLSLShader gIrradianceGenProgram;
|
||||
extern LLGLSLShader gGlowCombineFXAAProgram;
|
||||
extern LLGLSLShader gDebugProgram;
|
||||
|
|
|
|||
|
|
@ -785,6 +785,11 @@ bool LLPipeline::allocateScreenBuffer(U32 resX, U32 resY, U32 samples)
|
|||
mRT = &mAuxillaryRT;
|
||||
U32 res = mReflectionMapManager.mProbeResolution * 4; //multiply by 4 because probes will be 16x super sampled
|
||||
allocateScreenBuffer(res, res, samples);
|
||||
|
||||
res = mHeroProbeManager.mProbeResolution; // We also scale the hero probe RT to the probe res since we don't super sample it.
|
||||
mRT = &mHeroProbeRT;
|
||||
allocateScreenBuffer(res, res, samples);
|
||||
|
||||
mRT = &mMainRT;
|
||||
gCubeSnapshot = FALSE;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -699,6 +699,9 @@ public:
|
|||
// used by reflection probes and dynamic texture bakes
|
||||
RenderTargetPack mAuxillaryRT;
|
||||
|
||||
// Auxillary render target pack scaled to the hero probe's per-face size.
|
||||
RenderTargetPack mHeroProbeRT;
|
||||
|
||||
// currently used render target pack
|
||||
RenderTargetPack* mRT;
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue