Fixed multiple issues with the shader post-processing.

Also removed an unnecessary parameter for the createTexture() function.
This commit is contained in:
Leon Styhre 2022-03-12 14:22:27 +01:00
parent bebc9d58cf
commit 32251e0264
9 changed files with 21 additions and 22 deletions

View file

@ -348,11 +348,10 @@ void Screensaver::renderScreensaver()
#if defined(USE_OPENGL_21) #if defined(USE_OPENGL_21)
Renderer::postProcessingParams dimParameters; Renderer::postProcessingParams dimParameters;
dimParameters.dimming = mDimValue; dimParameters.dimming = mDimValue;
dimParameters.saturation = mSaturationAmount;
Renderer::shaderPostprocessing(Renderer::SHADER_CORE, dimParameters); Renderer::shaderPostprocessing(Renderer::SHADER_CORE, dimParameters);
if (mDimValue > 0.63) if (mDimValue > 0.63)
mDimValue = glm::clamp(mDimValue - 0.015f, 0.68f, 1.0f); mDimValue = glm::clamp(mDimValue - 0.015f, 0.68f, 1.0f);
dimParameters.saturation = mSaturationAmount;
Renderer::shaderPostprocessing(Renderer::SHADER_CORE, dimParameters);
if (mSaturationAmount > 0.0) if (mSaturationAmount > 0.0)
mSaturationAmount = glm::clamp(mSaturationAmount - 0.035f, 0.0f, 1.0f); mSaturationAmount = glm::clamp(mSaturationAmount - 0.035f, 0.0f, 1.0f);
#else #else

View file

@ -209,8 +209,7 @@ void VideoFFmpegComponent::render(const glm::mat4& parentTrans)
// Render scanlines if this option is enabled. However, if this is the media viewer // Render scanlines if this option is enabled. However, if this is the media viewer
// or the video screensaver, then skip this as the scanline rendering is then handled // or the video screensaver, then skip this as the scanline rendering is then handled
// in those modules as a postprocessing step. // in those modules as a post-processing step.
if (!mScreensaverMode && !mMediaViewerMode) { if (!mScreensaverMode && !mMediaViewerMode) {
vertices[0].opacity = mFadeIn * mThemeOpacity; vertices[0].opacity = mFadeIn * mThemeOpacity;
if ((mLegacyTheme && Settings::getInstance()->getBool("GamelistVideoScanlines")) || if ((mLegacyTheme && Settings::getInstance()->getBool("GamelistVideoScanlines")) ||

View file

@ -96,7 +96,8 @@ namespace Renderer
namespace Texture namespace Texture
{ {
enum Type { enum Type {
RGBA, // Replace with AllowShortEnumsOnASingleLine: false (clang-format >=11.0). RGB, // Replace with AllowShortEnumsOnASingleLine: false (clang-format >=11.0).
RGBA,
BGRA, BGRA,
ALPHA ALPHA
}; };
@ -186,7 +187,6 @@ namespace Renderer
bool createContext(); bool createContext();
void destroyContext(); void destroyContext();
unsigned int createTexture(const Texture::Type type, unsigned int createTexture(const Texture::Type type,
const Texture::Type format,
const bool linearMinify, const bool linearMinify,
const bool linearMagnify, const bool linearMagnify,
const bool repeat, const bool repeat,

View file

@ -46,6 +46,7 @@ namespace Renderer
{ {
// clang-format off // clang-format off
switch (_type) { switch (_type) {
case Texture::RGB: { return GL_RGB; } break;
case Texture::RGBA: { return GL_RGBA; } break; case Texture::RGBA: { return GL_RGBA; } break;
case Texture::BGRA: { return GL_BGRA; } break; case Texture::BGRA: { return GL_BGRA; } break;
case Texture::ALPHA: { return GL_LUMINANCE_ALPHA; } break; case Texture::ALPHA: { return GL_LUMINANCE_ALPHA; } break;
@ -144,16 +145,18 @@ namespace Renderer
return false; return false;
} }
postProcTexture1 = createTexture(Texture::RGBA, Texture::RGBA, false, false, false, // For the post-processing textures we want to discard the alpha channel to avoid
// weird problems with some graphics drivers.
postProcTexture1 = createTexture(Texture::RGB, false, false, false,
static_cast<unsigned int>(getScreenWidth()), static_cast<unsigned int>(getScreenWidth()),
static_cast<unsigned int>(getScreenHeight()), nullptr); static_cast<unsigned int>(getScreenHeight()), nullptr);
postProcTexture2 = createTexture(Texture::RGBA, Texture::RGBA, false, false, false, postProcTexture2 = createTexture(Texture::RGB, false, false, false,
static_cast<unsigned int>(getScreenWidth()), static_cast<unsigned int>(getScreenWidth()),
static_cast<unsigned int>(getScreenHeight()), nullptr); static_cast<unsigned int>(getScreenHeight()), nullptr);
uint8_t data[4] = {255, 255, 255, 255}; uint8_t data[4] = {255, 255, 255, 255};
whiteTexture = createTexture(Texture::RGBA, Texture::RGBA, false, false, true, 1, 1, data); whiteTexture = createTexture(Texture::RGBA, false, false, true, 1, 1, data);
GL_CHECK_ERROR(glClearColor(0.0f, 0.0f, 0.0f, 1.0f)); GL_CHECK_ERROR(glClearColor(0.0f, 0.0f, 0.0f, 1.0f));
GL_CHECK_ERROR(glEnable(GL_TEXTURE_2D)); GL_CHECK_ERROR(glEnable(GL_TEXTURE_2D));
@ -183,7 +186,6 @@ namespace Renderer
} }
unsigned int createTexture(const Texture::Type type, unsigned int createTexture(const Texture::Type type,
const Texture::Type /*format*/,
const bool linearMinify, const bool linearMinify,
const bool linearMagnify, const bool linearMagnify,
const bool repeat, const bool repeat,
@ -448,7 +450,7 @@ namespace Renderer
GLuint height {static_cast<GLuint>(heightf)}; GLuint height {static_cast<GLuint>(heightf)};
// Set vertex positions and texture coordinates to full screen as all // Set vertex positions and texture coordinates to full screen as all
// postprocessing is applied to the complete screen area. // post-processing is applied to the complete screen area.
// clang-format off // clang-format off
vertices[0] = {{0.0f, 0.0f }, {0.0f, 1.0f}, 0xFFFFFFFF}; vertices[0] = {{0.0f, 0.0f }, {0.0f, 1.0f}, 0xFFFFFFFF};
vertices[1] = {{0.0f, heightf}, {0.0f, 0.0f}, 0xFFFFFFFF}; vertices[1] = {{0.0f, heightf}, {0.0f, 0.0f}, 0xFFFFFFFF};
@ -524,12 +526,14 @@ namespace Renderer
bindTexture(postProcTexture2); bindTexture(postProcTexture2);
GL_CHECK_ERROR(glBindFramebuffer(GL_READ_FRAMEBUFFER, shaderFBO2)); GL_CHECK_ERROR(glBindFramebuffer(GL_READ_FRAMEBUFFER, shaderFBO2));
GL_CHECK_ERROR(glBindFramebuffer(GL_DRAW_FRAMEBUFFER, shaderFBO1)); GL_CHECK_ERROR(glBindFramebuffer(GL_DRAW_FRAMEBUFFER, shaderFBO1));
GL_CHECK_ERROR(glClear(GL_COLOR_BUFFER_BIT));
firstFBO = false; firstFBO = false;
} }
else { else {
bindTexture(postProcTexture1); bindTexture(postProcTexture1);
GL_CHECK_ERROR(glBindFramebuffer(GL_READ_FRAMEBUFFER, shaderFBO1)); GL_CHECK_ERROR(glBindFramebuffer(GL_READ_FRAMEBUFFER, shaderFBO1));
GL_CHECK_ERROR(glBindFramebuffer(GL_DRAW_FRAMEBUFFER, shaderFBO2)); GL_CHECK_ERROR(glBindFramebuffer(GL_DRAW_FRAMEBUFFER, shaderFBO2));
GL_CHECK_ERROR(glClear(GL_COLOR_BUFFER_BIT));
firstFBO = true; firstFBO = true;
} }
} }

View file

@ -199,8 +199,8 @@ bool Font::FontTexture::findEmpty(const glm::ivec2& size, glm::ivec2& cursor_out
void Font::FontTexture::initTexture() void Font::FontTexture::initTexture()
{ {
assert(textureId == 0); assert(textureId == 0);
textureId = Renderer::createTexture(Renderer::Texture::ALPHA, Renderer::Texture::ALPHA, false, textureId = Renderer::createTexture(Renderer::Texture::ALPHA, false, false, false,
false, false, textureSize.x, textureSize.y, nullptr); textureSize.x, textureSize.y, nullptr);
} }
void Font::FontTexture::deinitTexture() void Font::FontTexture::deinitTexture()

View file

@ -27,7 +27,6 @@ TextureData::TextureData(bool tile)
: mTile {tile} : mTile {tile}
, mTextureID {0} , mTextureID {0}
, mDataRGBA {} , mDataRGBA {}
, mFormat {Renderer::Texture::RGBA}
, mWidth {0} , mWidth {0}
, mHeight {0} , mHeight {0}
, mSourceWidth {0.0f} , mSourceWidth {0.0f}
@ -219,7 +218,7 @@ bool TextureData::uploadAndBind()
// Upload texture. // Upload texture.
mTextureID = mTextureID =
Renderer::createTexture(Renderer::Texture::RGBA, mFormat, true, mLinearMagnify, mTile, Renderer::createTexture(Renderer::Texture::RGBA, true, mLinearMagnify, mTile,
static_cast<const unsigned int>(mWidth), static_cast<const unsigned int>(mWidth),
static_cast<const unsigned int>(mHeight), mDataRGBA.data()); static_cast<const unsigned int>(mHeight), mDataRGBA.data());
} }

View file

@ -64,8 +64,6 @@ public:
// Whether to rasterize the image even if a size has not been set yet. // Whether to rasterize the image even if a size has not been set yet.
void setForceRasterization(bool setting) { mForceRasterization = setting; } void setForceRasterization(bool setting) { mForceRasterization = setting; }
void setFormat(Renderer::Texture::Type format) { mFormat = format; }
// Has the image been loaded but not yet been rasterized as the size was not known? // Has the image been loaded but not yet been rasterized as the size was not known?
bool getPendingRasterization() { return mPendingRasterization; } bool getPendingRasterization() { return mPendingRasterization; }
@ -80,7 +78,6 @@ private:
std::string mPath; std::string mPath;
std::atomic<unsigned int> mTextureID; std::atomic<unsigned int> mTextureID;
std::vector<unsigned char> mDataRGBA; std::vector<unsigned char> mDataRGBA;
Renderer::Texture::Type mFormat;
std::atomic<int> mWidth; std::atomic<int> mWidth;
std::atomic<int> mHeight; std::atomic<int> mHeight;
std::atomic<float> mSourceWidth; std::atomic<float> mSourceWidth;

View file

@ -45,7 +45,6 @@ public:
return (mTextureData != nullptr ? mTextureData->getPendingRasterization() : false); return (mTextureData != nullptr ? mTextureData->getPendingRasterization() : false);
} }
void setFormat(Renderer::Texture::Type format) { mTextureData->setFormat(format); }
void setLinearMagnify(bool setting) { mTextureData->setLinearMagnify(setting); } void setLinearMagnify(bool setting) { mTextureData->setLinearMagnify(setting); }
std::string getTextureFilePath(); std::string getTextureFilePath();

View file

@ -56,14 +56,16 @@ void main()
// Saturation. // Saturation.
if (saturation != 1.0f) { if (saturation != 1.0f) {
vec3 grayscale = vec3(dot(color.rgb, vec3(0.3f, 0.59f, 0.11f))); vec3 grayscale = vec3(dot(color.rgb, vec3(0.34f, 0.55f, 0.11f)));
vec3 blendedColor = mix(grayscale, color.rgb, saturation); vec3 blendedColor = mix(grayscale, color.rgb, saturation);
color = vec4(blendedColor, color.a); color = vec4(blendedColor, color.a);
} }
// Dimming // Dimming
vec4 dimColor = vec4(dimming, dimming, dimming, 1.0f); if (dimming != 1.0f) {
color = vec4(color.rgba) * dimColor; vec4 dimColor = vec4(dimming, dimming, dimming, 1.0f);
color *= dimColor;
}
// BGRA to RGBA conversion. // BGRA to RGBA conversion.
if (BGRAToRGBA == 1) if (BGRAToRGBA == 1)