Skip to content

Commit

Permalink
fix landscape brightness (tested on old style landscape, desktop OpenGL)
Browse files Browse the repository at this point in the history
  • Loading branch information
10110111 committed Mar 30, 2023
1 parent 4db8390 commit e210fe1
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 26 deletions.
14 changes: 8 additions & 6 deletions src/core/StelSRGB.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,15 +24,17 @@
#include <QByteArray>
#include "VecMath.hpp"

template<typename F>
F srgbToLinear(const F c)
{
return c > F(0.04045) ? std::pow((c+F(0.055))/F(1.055), F(2.4))
: c / F(12.92);
}

template<typename F>
Vector3<F> srgbToLinear(const Vector3<F>& srgb)
{
const auto lin = [](const F c)
{
return c > F(0.04045) ? std::pow((c+F(0.055))/F(1.055), F(2.4))
: c / F(12.92);
};
return {lin(srgb[0]), lin(srgb[1]), lin(srgb[2])};
return {srgbToLinear(srgb[0]), srgbToLinear(srgb[1]), srgbToLinear(srgb[2])};
}

inline QByteArray makeSRGBUtilsShader()
Expand Down
44 changes: 24 additions & 20 deletions src/core/modules/Landscape.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@

#include "Landscape.hpp"
#include "StelApp.hpp"
#include "StelSRGB.hpp"
#include "StelTextureMgr.hpp"
#include "StelFileMgr.hpp"
#include "StelLocation.hpp"
Expand Down Expand Up @@ -1061,7 +1062,9 @@ void LandscapeOldStyle::drawFog(StelCore*const core, const int firstFreeTexSampl
renderProgram->setUniformValue(shaderVars.vshift, vpos);

const float brightness = landFader.getInterstate()*fogFader.getInterstate()*(0.1f+0.1f*landscapeBrightness);
renderProgram->setUniformValue(shaderVars.brightness, brightness, brightness, brightness, landFader.getInterstate());
renderProgram->setUniformValue(shaderVars.brightness,
srgbToLinear(brightness), srgbToLinear(brightness), srgbToLinear(brightness),
landFader.getInterstate());
renderProgram->setUniformValue(shaderVars.projectionMatrixInverse, prj->getProjectionMatrix().toQMatrix().inverted());
prj->setUnProjectUniforms(*renderProgram);

Expand All @@ -1083,13 +1086,14 @@ void LandscapeOldStyle::drawDecor(StelCore*const core, const int firstFreeTexSam
if (drawLight)
{
const auto brightness = illumFader.getInterstate()*lightScapeBrightness;
renderProgram->setUniformValue(shaderVars.brightness, brightness, brightness, brightness,
renderProgram->setUniformValue(shaderVars.brightness,
srgbToLinear(brightness), srgbToLinear(brightness), srgbToLinear(brightness),
landFader.getInterstate());
}
else
{
renderProgram->setUniformValue(shaderVars.brightness,
landscapeBrightness, landscapeBrightness, landscapeBrightness,
srgbToLinear(landscapeBrightness), srgbToLinear(landscapeBrightness), srgbToLinear(landscapeBrightness),
landFader.getInterstate());
}

Expand Down Expand Up @@ -1185,7 +1189,7 @@ void LandscapeOldStyle::drawGround(StelCore*const core, const int firstFreeTexSa
renderProgram->setUniformValue(shaderVars.vshift, vshift);
renderProgram->setUniformValue(shaderVars.projectionMatrixInverse, prj->getProjectionMatrix().toQMatrix().inverted());
renderProgram->setUniformValue(shaderVars.brightness,
landscapeBrightness, landscapeBrightness, landscapeBrightness,
srgbToLinear(landscapeBrightness), srgbToLinear(landscapeBrightness), srgbToLinear(landscapeBrightness),
landFader.getInterstate());
prj->setUnProjectUniforms(*renderProgram);
gl.glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
Expand Down Expand Up @@ -1268,7 +1272,7 @@ void LandscapeOldStyle::drawFogLowGL(StelCore* core, StelPainter& sPainter) cons
transfo->combine(Mat4d::translation(Vec3d(0.,0.,static_cast<double>(vpos))));
sPainter.setProjector(core->getProjection(transfo));
sPainter.setBlending(true, GL_ONE, GL_ONE);
sPainter.setColor(Vec3f(landFader.getInterstate()*fogFader.getInterstate()*(0.1f+0.1f*landscapeBrightness)), landFader.getInterstate());
sPainter.setColor(Vec3f(srgbToLinear(landFader.getInterstate()*fogFader.getInterstate()*(0.1f+0.1f*landscapeBrightness))), landFader.getInterstate());
fogTex->bind();
const double height = radius * static_cast<double>(calibrated?
(std::tan((fogAltAngle+fogAngleShift)*M_PI_180f) - std::tan(fogAngleShift*M_PI_180f))
Expand All @@ -1287,9 +1291,9 @@ void LandscapeOldStyle::drawDecorLowGL(StelCore* core, StelPainter& sPainter, co
if (landFader.getInterstate()==0.f)
return;
if (drawLight)
sPainter.setColor(Vec3f(illumFader.getInterstate()*lightScapeBrightness), landFader.getInterstate());
sPainter.setColor(Vec3f(srgbToLinear(illumFader.getInterstate()*lightScapeBrightness)), landFader.getInterstate());
else
sPainter.setColor(Vec3f(landscapeBrightness), landFader.getInterstate());
sPainter.setColor(Vec3f(srgbToLinear(landscapeBrightness)), landFader.getInterstate());

for (const auto& side : precomputedSides)
{
Expand All @@ -1311,7 +1315,7 @@ void LandscapeOldStyle::drawGroundLowGL(StelCore* core, StelPainter& sPainter) c
transfo->combine(Mat4d::zrotation(groundAngleRotateZ-static_cast<double>(angleRotateZOffset)) * Mat4d::translation(Vec3d(0,0,static_cast<double>(vshift))));

sPainter.setProjector(core->getProjection(transfo));
sPainter.setColor(landscapeBrightness, landscapeBrightness, landscapeBrightness, landFader.getInterstate());
sPainter.setColor(srgbToLinear(landscapeBrightness), srgbToLinear(landscapeBrightness), srgbToLinear(landscapeBrightness), landFader.getInterstate());

if(groundTex.isNull())
{
Expand Down Expand Up @@ -1463,7 +1467,7 @@ void LandscapePolygonal::draw(StelCore* core, bool onlyPolygon)

if (!onlyPolygon) // The only useful application of the onlyPolygon is a demo which does not fill the polygon
{
sPainter.setColor(landscapeBrightness*groundColor, landFader.getInterstate());
sPainter.setColor(srgbToLinear(landscapeBrightness*groundColor), landFader.getInterstate());
#ifdef GL_MULTISAMPLE
const auto gl = sPainter.glFuncs();
if (multisamplingEnabled_)
Expand Down Expand Up @@ -1673,8 +1677,8 @@ void main(void)
{
renderProgram->bind();
renderProgram->setUniformValue(shaderVars.brightness,
landscapeBrightness, landscapeBrightness,
landscapeBrightness, landFader.getInterstate());
srgbToLinear(landscapeBrightness), srgbToLinear(landscapeBrightness),
srgbToLinear(landscapeBrightness), landFader.getInterstate());
const int mainTexSampler = 0;
mapTex->bind(mainTexSampler);
renderProgram->setUniformValue(shaderVars.mapTex, mainTexSampler);
Expand All @@ -1696,7 +1700,7 @@ void main(void)
gl.glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_COLOR);
const float brightness = landFader.getInterstate()*fogFader.getInterstate()*(0.1f+0.1f*landscapeBrightness);

renderProgram->setUniformValue(shaderVars.brightness, brightness, brightness, brightness,
renderProgram->setUniformValue(shaderVars.brightness, srgbToLinear(brightness), srgbToLinear(brightness), srgbToLinear(brightness),
landFader.getInterstate());
mapTexFog->bind();
gl.glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
Expand All @@ -1706,7 +1710,7 @@ void main(void)
{
gl.glBlendFunc(GL_SRC_ALPHA, GL_ONE);
const float brightness = lightScapeBrightness*illumFader.getInterstate();
renderProgram->setUniformValue(shaderVars.brightness, brightness, brightness, brightness,
renderProgram->setUniformValue(shaderVars.brightness, srgbToLinear(brightness), srgbToLinear(brightness), srgbToLinear(brightness),
landFader.getInterstate());
mapTexIllum->bind();
gl.glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
Expand Down Expand Up @@ -2042,14 +2046,14 @@ void main(void)
{
renderProgram->bind();
renderProgram->setUniformValue(shaderVars.bottomCapColor,
landscapeBrightness*bottomCapColor[0],
landscapeBrightness*bottomCapColor[1],
landscapeBrightness*bottomCapColor[2],
srgbToLinear(landscapeBrightness*bottomCapColor[0]),
srgbToLinear(landscapeBrightness*bottomCapColor[1]),
srgbToLinear(landscapeBrightness*bottomCapColor[2]),
bottomCapColor[0] < 0 ? 0 : landFader.getInterstate());

renderProgram->setUniformValue(shaderVars.brightness,
landscapeBrightness, landscapeBrightness,
landscapeBrightness, landFader.getInterstate());
srgbToLinear(landscapeBrightness), srgbToLinear(landscapeBrightness),
srgbToLinear(landscapeBrightness), landFader.getInterstate());
const int mainTexSampler = 0;
mapTex->bind(mainTexSampler);
renderProgram->setUniformValue(shaderVars.mapTex, mainTexSampler);
Expand All @@ -2074,7 +2078,7 @@ void main(void)
const float brightness = landFader.getInterstate()*fogFader.getInterstate()*(0.1f+0.1f*landscapeBrightness);

renderProgram->setUniformValue(shaderVars.bottomCapColor, 0.f, 0.f, 0.f, 0.f);
renderProgram->setUniformValue(shaderVars.brightness, brightness, brightness, brightness,
renderProgram->setUniformValue(shaderVars.brightness, srgbToLinear(brightness), srgbToLinear(brightness), srgbToLinear(brightness),
landFader.getInterstate());
mapTexFog->bind();
renderProgram->setUniformValue(shaderVars.mapTexTop, fogTexTop);
Expand All @@ -2088,7 +2092,7 @@ void main(void)
gl.glBlendFunc(GL_SRC_ALPHA, GL_ONE);
const float brightness = lightScapeBrightness*illumFader.getInterstate();
renderProgram->setUniformValue(shaderVars.bottomCapColor, 0.f, 0.f, 0.f, 0.f);
renderProgram->setUniformValue(shaderVars.brightness, brightness, brightness, brightness,
renderProgram->setUniformValue(shaderVars.brightness, srgbToLinear(brightness), srgbToLinear(brightness), srgbToLinear(brightness),
landFader.getInterstate());
mapTexIllum->bind();
renderProgram->setUniformValue(shaderVars.mapTexTop, illumTexTop);
Expand Down

0 comments on commit e210fe1

Please sign in to comment.