Support blending current/next bloom textures in deferred star rendering.

master
Graham Linden 2018-07-10 19:08:14 +01:00
parent 4fde1adbcf
commit a90e61b798
9 changed files with 109 additions and 23 deletions

View File

@ -382,7 +382,8 @@ LLSettingsSky::LLSettingsSky(const LLSD &data) :
LLSettingsBase(data),
mNextSunTextureId(),
mNextMoonTextureId(),
mNextCloudTextureId()
mNextCloudTextureId(),
mNextBloomTextureId()
{
}
@ -390,7 +391,8 @@ LLSettingsSky::LLSettingsSky():
LLSettingsBase(),
mNextSunTextureId(),
mNextMoonTextureId(),
mNextCloudTextureId()
mNextCloudTextureId(),
mNextBloomTextureId()
{
}
@ -412,6 +414,7 @@ void LLSettingsSky::blend(const LLSettingsBase::ptr_t &end, F64 blendf)
mNextSunTextureId = other->getSunTextureId();
mNextMoonTextureId = other->getMoonTextureId();
mNextCloudTextureId = other->getCloudNoiseTextureId();
mNextBloomTextureId = other->getBloomTextureId();
}
else
{
@ -637,7 +640,7 @@ LLSD LLSettingsSky::defaults(const LLSettingsBase::TrackPosition& position)
dfltsetting[SETTING_SUNLIGHT_COLOR] = LLColor4(0.7342, 0.7815, 0.8999, 0.0).getValue();
dfltsetting[SETTING_SUN_ROTATION] = sunquat.getValue();
dfltsetting[SETTING_BLOOM_TEXTUREID] = IMG_BLOOM1;
dfltsetting[SETTING_BLOOM_TEXTUREID] = GetDefaultBloomTextureId();
dfltsetting[SETTING_CLOUD_TEXTUREID] = GetDefaultCloudNoiseTextureId();
dfltsetting[SETTING_MOON_TEXTUREID] = GetDefaultMoonTextureId();
dfltsetting[SETTING_SUN_TEXTUREID] = GetDefaultSunTextureId();
@ -1366,3 +1369,9 @@ LLUUID LLSettingsSky::getNextCloudNoiseTextureId() const
{
return mNextCloudTextureId;
}
LLUUID LLSettingsSky::getNextBloomTextureId() const
{
return mNextBloomTextureId;
}

View File

@ -183,6 +183,7 @@ public:
LLUUID getNextSunTextureId() const;
LLUUID getNextMoonTextureId() const;
LLUUID getNextCloudNoiseTextureId() const;
LLUUID getNextBloomTextureId() const;
//=====================================================================
virtual void loadTextures() { };
@ -272,6 +273,7 @@ private:
LLUUID mNextSunTextureId;
LLUUID mNextMoonTextureId;
LLUUID mNextCloudTextureId;
LLUUID mNextBloomTextureId;
typedef std::map<std::string, S32> mapNameToUniformId_t;

View File

@ -35,12 +35,16 @@ VARYING vec4 vertex_color;
VARYING vec2 vary_texcoord0;
uniform sampler2D diffuseMap;
uniform sampler2D altDiffuseMap;
uniform float blend_factor;
uniform float custom_alpha;
uniform vec4 sunlight_color;
void main()
{
vec4 col = texture2D(diffuseMap, vary_texcoord0.xy);
vec4 col_a = texture2D(diffuseMap, vary_texcoord0.xy);
vec4 col_b = texture2D(diffuseMap, vary_texcoord0.xy);
vec4 col = mix(col_a, col_b, blend_factor);
col.rgb *= vertex_color.rgb;
col.a *= custom_alpha;
frag_color = col;

View File

@ -238,7 +238,22 @@ void LLDrawPoolWLSky::renderStars(void) const
return;
}
gGL.getTexUnit(0)->bind(gSky.mVOSkyp->getBloomTex());
LLViewerTexture* tex_a = gSky.mVOSkyp->getBloomTex();
LLViewerTexture* tex_b = gSky.mVOSkyp->getBloomTexNext();
if (tex_a && (!tex_b || (tex_a == tex_b)))
{
// Bind current and next sun textures
gGL.getTexUnit(0)->bind(tex_a);
}
else if (tex_b && !tex_a)
{
gGL.getTexUnit(0)->bind(tex_b);
}
else if (tex_b != tex_a)
{
gGL.getTexUnit(0)->bind(tex_a);
}
gGL.pushMatrix();
gGL.rotatef(gFrameTimeSeconds*0.01f, 0.f, 0.f, 1.f);
@ -256,6 +271,8 @@ void LLDrawPoolWLSky::renderStars(void) const
gSky.mVOWLSkyp->drawStars();
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
gGL.popMatrix();
if (LLGLSLShader::sNoFixedFunction)
@ -287,11 +304,37 @@ void LLDrawPoolWLSky::renderStarsDeferred(void) const
gDeferredStarProgram.bind();
gGL.getTexUnit(0)->bind(gSky.mVOSkyp->getBloomTex());
LLViewerTexture* tex_a = gSky.mVOSkyp->getBloomTex();
LLViewerTexture* tex_b = gSky.mVOSkyp->getBloomTexNext();
F32 blend_factor = LLEnvironment::instance().getCurrentSky()->getBlendFactor();
if (tex_a && (!tex_b || (tex_a == tex_b)))
{
// Bind current and next sun textures
gGL.getTexUnit(0)->bind(tex_a);
gGL.getTexUnit(1)->unbind(LLTexUnit::TT_TEXTURE);
blend_factor = 0;
}
else if (tex_b && !tex_a)
{
gGL.getTexUnit(0)->bind(tex_b);
gGL.getTexUnit(1)->unbind(LLTexUnit::TT_TEXTURE);
blend_factor = 0;
}
else if (tex_b != tex_a)
{
gGL.getTexUnit(0)->bind(tex_a);
gGL.getTexUnit(1)->bind(tex_b);
}
gDeferredStarProgram.uniform1f(LLShaderMgr::BLEND_FACTOR, blend_factor);
gDeferredStarProgram.uniform1f(sCustomAlpha, star_alpha);
gSky.mVOWLSkyp->drawStars();
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
gGL.getTexUnit(1)->unbind(LLTexUnit::TT_TEXTURE);
gDeferredStarProgram.unbind();
}

View File

@ -529,6 +529,7 @@ void LLSettingsVOSky::updateSettings()
gSky.setSunTextures(getSunTextureId(), getNextSunTextureId());
gSky.setMoonTextures(getMoonTextureId(), getNextMoonTextureId());
gSky.setCloudNoiseTextures(getCloudNoiseTextureId(), getNextCloudNoiseTextureId());
gSky.setBloomTextures(getBloomTextureId(), getNextBloomTextureId());
}
void LLSettingsVOSky::applySpecial(void *ptarget)

View File

@ -150,6 +150,13 @@ void LLSky::setCloudNoiseTextures(const LLUUID& cloud_noise_texture, const LLUUI
}
}
void LLSky::setBloomTextures(const LLUUID& bloom_texture, const LLUUID& bloom_texture_next)
{
if(mVOSkyp.notNull()) {
mVOSkyp->setBloomTextures(bloom_texture, bloom_texture_next);
}
}
void LLSky::setSunAndMoonDirectionsCFR(const LLVector3 &sun_direction, const LLVector3 &moon_direction)
{
if(mVOSkyp.notNull()) {

View File

@ -59,6 +59,7 @@ public:
void setSunTextures(const LLUUID& sun_texture, const LLUUID& sun_texture_next);
void setMoonTextures(const LLUUID& moon_texture, const LLUUID& moon_texture_next);
void setCloudNoiseTextures(const LLUUID& cloud_noise_texture, const LLUUID& cloud_noise_texture_next);
void setBloomTextures(const LLUUID& bloom_texture, const LLUUID& bloom_texture_next);
LLColor4 getSkyFogColor() const;

View File

@ -393,10 +393,6 @@ LLVOSky::LLVOSky(const LLUUID &id, const LLPCode pcode, LLViewerRegion *regionp)
mSun.setIntensity(SUN_INTENSITY);
mMoon.setIntensity(0.1f * SUN_INTENSITY);
mBloomTexturep = LLViewerTextureManager::getFetchedTexture(LLSettingsSky::GetDefaultBloomTextureId());
mBloomTexturep->setNoDelete() ;
mBloomTexturep->setAddressMode(LLTexUnit::TAM_CLAMP);
mHeavenlyBodyUpdated = FALSE ;
mDrawRefl = 0;
@ -492,10 +488,6 @@ void LLVOSky::restoreGL()
setMoonTextures(psky->getMoonTextureId(), psky->getNextMoonTextureId());
}
mBloomTexturep = LLViewerTextureManager::getFetchedTexture(LLSettingsSky::GetDefaultBloomTextureId());
mBloomTexturep->setNoDelete() ;
mBloomTexturep->setAddressMode(LLTexUnit::TAM_CLAMP);
updateDirections();
if (gSavedSettings.getBOOL("RenderWater") && gGLManager.mHasCubeMap
@ -762,9 +754,14 @@ void LLVOSky::updateTextures()
mMoonTexturep[1]->addTextureStats( (F32)MAX_IMAGE_AREA );
}
if (mBloomTexturep)
if (mBloomTexturep[0])
{
mBloomTexturep->addTextureStats( (F32)MAX_IMAGE_AREA );
mBloomTexturep[0]->addTextureStats( (F32)MAX_IMAGE_AREA );
}
if (mBloomTexturep[1])
{
mBloomTexturep[1]->addTextureStats( (F32)MAX_IMAGE_AREA );
}
}
@ -858,6 +855,27 @@ void LLVOSky::setCloudNoiseTextures(const LLUUID& cloud_noise_texture, const LLU
}
}
void LLVOSky::setBloomTextures(const LLUUID& bloom_texture, const LLUUID& bloom_texture_next)
{
LLSettingsSky::ptr_t psky = LLEnvironment::instance().getCurrentSky();
LLUUID bloom_tex = bloom_texture.isNull() ? psky->GetDefaultBloomTextureId() : bloom_texture;
LLUUID bloom_tex_next = bloom_texture_next.isNull() ? (bloom_texture.isNull() ? psky->GetDefaultBloomTextureId() : bloom_texture) : bloom_texture_next;
mBloomTexturep[0] = LLViewerTextureManager::getFetchedTexture(bloom_tex, FTT_DEFAULT, TRUE, LLGLTexture::BOOST_UI);
mBloomTexturep[1] = LLViewerTextureManager::getFetchedTexture(bloom_tex_next, FTT_DEFAULT, TRUE, LLGLTexture::BOOST_UI);
if (mBloomTexturep[0])
{
mBloomTexturep[0]->setAddressMode(LLTexUnit::TAM_CLAMP);
}
if (mBloomTexturep[1])
{
mBloomTexturep[1]->setAddressMode(LLTexUnit::TAM_CLAMP);
}
}
static LLTrace::BlockTimerStatHandle FTM_GEO_SKY("Sky Geometry");
BOOL LLVOSky::updateGeometry(LLDrawable *drawable)

View File

@ -263,19 +263,20 @@ public:
bool isReflFace(const LLFace* face) const { return face == mFace[FACE_REFLECTION]; }
LLFace* getReflFace() const { return mFace[FACE_REFLECTION]; }
LLViewerTexture* getSunTex() const { return mSunTexturep[0]; }
LLViewerTexture* getMoonTex() const { return mMoonTexturep[0]; }
LLViewerTexture* getBloomTex() const { return mBloomTexturep; }
LLViewerTexture* getSunTex() const { return mSunTexturep[0]; }
LLViewerTexture* getMoonTex() const { return mMoonTexturep[0]; }
LLViewerTexture* getBloomTex() const { return mBloomTexturep[0]; }
LLViewerTexture* getCloudNoiseTex() const { return mCloudNoiseTexturep[0]; }
LLViewerTexture* getSunTexNext() const { return mSunTexturep[1]; }
LLViewerTexture* getMoonTexNext() const { return mMoonTexturep[1]; }
LLViewerTexture* getBloomTexNext() const { return mBloomTexturep; }
LLViewerTexture* getSunTexNext() const { return mSunTexturep[1]; }
LLViewerTexture* getMoonTexNext() const { return mMoonTexturep[1]; }
LLViewerTexture* getBloomTexNext() const { return mBloomTexturep[1]; }
LLViewerTexture* getCloudNoiseTexNext() const { return mCloudNoiseTexturep[1]; }
void setSunTextures(const LLUUID& sun_texture, const LLUUID& sun_texture_next);
void setMoonTextures(const LLUUID& moon_texture, const LLUUID& moon_texture_next);
void setCloudNoiseTextures(const LLUUID& cloud_noise_texture, const LLUUID& cloud_noise_texture_next);
void setBloomTextures(const LLUUID& bloom_texture, const LLUUID& bloom_texture_next);
void forceSkyUpdate(void) { mForceUpdate = TRUE; }
@ -294,7 +295,7 @@ protected:
LLPointer<LLViewerFetchedTexture> mSunTexturep[2];
LLPointer<LLViewerFetchedTexture> mMoonTexturep[2];
LLPointer<LLViewerFetchedTexture> mCloudNoiseTexturep[2];
LLPointer<LLViewerFetchedTexture> mBloomTexturep;
LLPointer<LLViewerFetchedTexture> mBloomTexturep[2];
static S32 sResolution;
static S32 sTileResX;