Support blending current/next bloom textures in deferred star rendering.
parent
4fde1adbcf
commit
a90e61b798
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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()) {
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Reference in New Issue