private static Shader[] CreateShaders(BlurShaderId blurShaderId, bool opaque) { var length = FragmentShaderPart1.Length + (!opaque ? FragmentShaderPart2.Length : FragmentShaderPart2Opaque.Length); var fragmentShader = new StringBuilder(length); fragmentShader.Append(FragmentShaderPart1); var kernelWeights = gaussKernelsWeights[blurShaderId]; var centerKernel = kernelWeights.Length / 2; for (var i = 0; i < kernelWeights.Length; i++) { var weight = kernelWeights[i].ToString("F6", CultureInfo.InvariantCulture); if (i == centerKernel) { fragmentShader.Append(string.Format(FragmentShaderSummSelfFormat, weight)); } else { var offset = (i - centerKernel) / (float)centerKernel; var sign = offset < 0 ? "- " : "+ "; var absOffset = Mathf.Abs(offset); var offsetStr = Mathf.Abs(absOffset - 1f) > Mathf.ZeroTolerance ? $"{sign}{absOffset.ToString("F6", CultureInfo.InvariantCulture)}*" : sign; fragmentShader.Append(string.Format(FragmentShaderSummNeighborFormat, weight, offsetStr)); } } fragmentShader.Append(!opaque ? FragmentShaderPart2 : FragmentShaderPart2Opaque); return(new Shader[] { new VertexShader(VertexShader), new FragmentShader(fragmentShader.ToString()) }); }
public static BlurShaderProgram GetInstance(BlurShaderId blurShaderId = BlurShaderId.GaussOneDimensionalWith5Samples, bool opaque = false) { var key = GetInstanceKey(blurShaderId, false); return(instances.TryGetValue(key, out var shaderProgram) ? shaderProgram : (instances[key] = new BlurShaderProgram(blurShaderId, opaque))); }
private BlurShaderProgram(BlurShaderId blurShaderId, bool opaque) : base(CreateShaders(blurShaderId, opaque), ShaderPrograms.Attributes.GetLocations(), ShaderPrograms.GetSamplers()) { }
private static int GetInstanceKey(BlurShaderId blurShaderId, bool opaque) => (int)blurShaderId | ((opaque ? 1 : 0) << 8);