diff --git a/app/render/job/colortransformjob.h b/app/render/job/colortransformjob.h index 15951b22e..2a5bdda81 100644 --- a/app/render/job/colortransformjob.h +++ b/app/render/job/colortransformjob.h @@ -42,6 +42,7 @@ public: custom_shader_src_ = nullptr; input_alpha_association_ = kAlphaNone; clear_destination_ = true; + force_opaque_ = false; } ColorTransformJob(const NodeValueRow &row) : @@ -95,6 +96,9 @@ public: const QString &GetFunctionName() const { return function_name_; } void SetFunctionName(const QString &function_name = QString()) { function_name_ = function_name; }; + bool GetForceOpaque() const { return force_opaque_; } + void SetForceOpaque(bool e) { force_opaque_ = e; } + private: ColorProcessorPtr processor_; QString id_; @@ -114,6 +118,8 @@ private: QString function_name_; + bool force_opaque_; + }; } diff --git a/app/render/renderer.cpp b/app/render/renderer.cpp index 9e3c1fd9c..d00fa0d40 100644 --- a/app/render/renderer.cpp +++ b/app/render/renderer.cpp @@ -296,6 +296,7 @@ void Renderer::BlitColorManaged(const ColorTransformJob &color_job, Texture *des job.Insert(QStringLiteral("ove_mvpmat"), NodeValue(NodeValue::kMatrix, color_job.GetTransformMatrix())); job.Insert(QStringLiteral("ove_cropmatrix"), NodeValue(NodeValue::kMatrix, color_job.GetCropMatrix().inverted())); job.Insert(QStringLiteral("ove_maintex_alpha"), NodeValue(NodeValue::kInt, int(color_job.GetInputAlphaAssociation()))); + job.Insert(QStringLiteral("ove_force_opaque"), NodeValue(NodeValue::kBoolean, color_job.GetForceOpaque())); job.Insert(color_job.GetValues()); foreach (const ColorContext::LUT& l, color_ctx.lut3d_textures) { diff --git a/app/render/renderer.h b/app/render/renderer.h index 24bbfa3f1..08f166546 100644 --- a/app/render/renderer.h +++ b/app/render/renderer.h @@ -84,7 +84,7 @@ public: virtual void PostInit() = 0; - virtual void ClearDestination(olive::Texture *texture = nullptr, double r = 0.0, double g = 0.0, double b = 0.0, double a = 0.0) = 0; + virtual void ClearDestination(olive::Texture *texture = nullptr, double r = 0.0, double g = 0.0, double b = 0.0, double a = 1.0) = 0; virtual QVariant CreateNativeShader(olive::ShaderCode code) = 0; diff --git a/app/shaders/colormanage.frag b/app/shaders/colormanage.frag index 25efe5b50..074af83fb 100644 --- a/app/shaders/colormanage.frag +++ b/app/shaders/colormanage.frag @@ -2,6 +2,7 @@ uniform sampler2D ove_maintex; uniform int ove_maintex_alpha; uniform mat4 ove_cropmatrix; +uniform bool ove_force_opaque; // Macros defining `ove_maintex_alpha` state // Matches `AlphaAssociated` C++ enum @@ -53,5 +54,9 @@ void main() { col = assoc(col); } + if (ove_force_opaque) { + col.a = 1.0; + } + frag_color = col; } diff --git a/app/widget/manageddisplay/manageddisplay.cpp b/app/widget/manageddisplay/manageddisplay.cpp index d90a9d5fb..abe053db0 100644 --- a/app/widget/manageddisplay/manageddisplay.cpp +++ b/app/widget/manageddisplay/manageddisplay.cpp @@ -43,6 +43,7 @@ ManagedDisplayWidget::ManagedDisplayWidget(QWidget *parent) : if (RenderManager::instance()->backend() == RenderManager::kOpenGL) { // Create OpenGL widget inner_widget_ = new ManagedDisplayWidgetOpenGL(); + inner_widget_->setAttribute(Qt::WA_TranslucentBackground, false); connect(static_cast(inner_widget_), &ManagedDisplayWidgetOpenGL::OnInit, this, &ManagedDisplayWidget::OnInit, Qt::DirectConnection); diff --git a/app/widget/viewer/viewerdisplay.cpp b/app/widget/viewer/viewerdisplay.cpp index 776399c75..d2df88471 100644 --- a/app/widget/viewer/viewerdisplay.cpp +++ b/app/widget/viewer/viewerdisplay.cpp @@ -437,6 +437,7 @@ void ViewerDisplayWidget::OnPaint() ctj.SetClearDestinationEnabled(false); ctj.SetTransformMatrix(combined_matrix_flipped_); ctj.SetCropMatrix(crop_matrix_); + ctj.SetForceOpaque(true); renderer()->BlitColorManaged(ctj, device_params); }