From d593796dae4fd319cffd78142c23b91869adc5b0 Mon Sep 17 00:00:00 2001 From: Thomas Harte Date: Wed, 16 Jan 2019 22:22:29 -0500 Subject: [PATCH] Reintroduces less-filtered black and white video where there's no colour burst. --- Outputs/OpenGL/ScanTarget.cpp | 4 ++-- Outputs/OpenGL/ScanTargetGLSLFragments.cpp | 10 +++++++++- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/Outputs/OpenGL/ScanTarget.cpp b/Outputs/OpenGL/ScanTarget.cpp index 74f7723df..091df6360 100644 --- a/Outputs/OpenGL/ScanTarget.cpp +++ b/Outputs/OpenGL/ScanTarget.cpp @@ -14,10 +14,10 @@ using namespace Outputs::Display::OpenGL; namespace { /// The texture unit from which to source input data. -constexpr GLenum SourceDataTextureUnit = GL_TEXTURE1; +constexpr GLenum SourceDataTextureUnit = GL_TEXTURE0; /// The texture unit which contains raw line-by-line composite, S-Video or RGB data. -constexpr GLenum UnprocessedLineBufferTextureUnit = GL_TEXTURE3; +constexpr GLenum UnprocessedLineBufferTextureUnit = GL_TEXTURE1; /// The texture unit that contains the current display. constexpr GLenum AccumulationTextureUnit = GL_TEXTURE2; diff --git a/Outputs/OpenGL/ScanTargetGLSLFragments.cpp b/Outputs/OpenGL/ScanTargetGLSLFragments.cpp index d96adfd4d..9b1da7470 100644 --- a/Outputs/OpenGL/ScanTargetGLSLFragments.cpp +++ b/Outputs/OpenGL/ScanTargetGLSLFragments.cpp @@ -431,6 +431,10 @@ std::unique_ptr ScanTarget::conversion_shader(InputDataType input_data_t "composite_sample(textureCoordinates[3], angles[3])" ");" + // Compute a luminance for use if there's no colour information, now, before + // modifying samples. + "float mono_luminance = dot(samples.yz, vec2(0.5));" + // Take the average to calculate luminance, then subtract that from all four samples to // give chrominance. "float luminance = dot(samples, vec4(0.25 / (1.0 - compositeAmplitude)));" @@ -443,7 +447,11 @@ std::unique_ptr ScanTarget::conversion_shader(InputDataType input_data_t ") * vec2(0.125 * oneOverCompositeAmplitude);" // Apply a colour space conversion to get RGB. - "fragColour3 = lumaChromaToRGB * vec3(luminance, channels);"; + "fragColour3 = mix(" + "lumaChromaToRGB * vec3(luminance, channels)," + "vec3(mono_luminance)," + "step(oneOverCompositeAmplitude, 0.01)" + ");"; break; case DisplayType::CompositeMonochrome: