protected override ITextureFilter CreateFilter(ITextureFilter input) { if (!Renderer.IsDx11Avail) { Renderer.FallbackOccurred = true; // Warn user via player stats OSD return(input); // DX11 is not available; fallback } Func <TextureSize, TextureSize> transform = s => new TextureSize(2 * s.Height, s.Width); var shaderPass1 = LoadShader11(GetShaderFileName(Neurons1)); var shaderPass2 = LoadShader11(GetShaderFileName(Neurons2)); var interleave = CompileShader("Interleave.hlsl").Configure(transform: transform); var sourceSize = input.Size(); if ((Renderer.TargetSize <= sourceSize).Any) { return(input); } var yuv = input.ConvertToYuv(); m_Filter1 = NNedi3Helpers.CreateFilter(shaderPass1, yuv, Neurons1, Structured); var resultY = interleave.ApplyTo(yuv, m_Filter1); m_Filter2 = NNedi3Helpers.CreateFilter(shaderPass2, resultY, Neurons2, Structured); var luma = interleave.ApplyTo(resultY, m_Filter2); var result = ChromaScaler.ScaleChroma( new CompositionFilter(luma, yuv, targetSize: luma.Size(), chromaOffset: new Vector2(-0.25f, -0.25f))); return(result.Convolve(null, offset: new Vector2(0.5f, 0.5f))); }
protected override ITextureFilter CreateFilter(ITextureFilter input) { if (!Renderer.IsDx11Avail) { Renderer.FallbackOccurred = true; // Warn user via player stats OSD return(input); // DX11 is not available; fallback } Func <TextureSize, TextureSize> transform = s => new TextureSize(2 * s.Height, s.Width); var shaderPass1 = GetShader(Neurons1); var shaderPass2 = GetShader(Neurons2); var interleave = new Shader(FromFile("Interleave.hlsl")) { Transform = transform }; if ((Renderer.TargetSize <= input.Size()).Any) { return(input); } var yuv = input.ConvertToYuv(); var composition = input.Decompose(); var resultY = interleave.ApplyTo(composition.Luma, shaderPass1.ApplyTo(yuv)); var luma = interleave.ApplyTo(resultY, shaderPass2.ApplyTo(resultY)); composition = luma.ComposeWith(composition.Chroma, chromaOffset: new Vector2(-0.25f, -0.25f)); var result = ChromaScaler.ScaleChroma(composition); return(result.Convolve(null, offset: new Vector2(0.5f, 0.5f))); }