示例#1
0
        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())
            });
        }
示例#2
0
        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)));
        }
示例#3
0
 private BlurShaderProgram(BlurShaderId blurShaderId, bool opaque) : base(CreateShaders(blurShaderId, opaque), ShaderPrograms.Attributes.GetLocations(), ShaderPrograms.GetSamplers())
 {
 }
示例#4
0
 private static int GetInstanceKey(BlurShaderId blurShaderId, bool opaque) => (int)blurShaderId | ((opaque ? 1 : 0) << 8);