コード例 #1
0
ファイル: GraphicsBackend.cs プロジェクト: raycrasher/duality
        /// <summary>
        /// Applies the specified parameter values to all currently active shaders.
        /// </summary>
        /// <param name="sharedParams"></param>
        /// <seealso cref="RetrieveActiveShaders"/>
        private void SetupSharedParameters(ShaderParameterCollection sharedParams)
        {
            this.sharedSamplerBindings = 0;
            this.sharedShaderParameters.Clear();
            if (sharedParams == null)
            {
                return;
            }

            foreach (NativeShaderProgram shader in this.activeShaders)
            {
                NativeShaderProgram.Bind(shader);

                ShaderFieldInfo[] varInfo   = shader.Fields;
                int[]             locations = shader.FieldLocations;

                // Setup shared sampler bindings and uniform data
                for (int i = 0; i < varInfo.Length; i++)
                {
                    ShaderFieldInfo field    = varInfo[i];
                    int             location = locations[i];

                    if (field.Scope == ShaderFieldScope.Attribute)
                    {
                        continue;
                    }
                    if (field.Type == ShaderFieldType.Sampler2D)
                    {
                        ContentRef <Texture> texRef;
                        if (!sharedParams.TryGetInternal(field.Name, out texRef))
                        {
                            continue;
                        }

                        NativeTexture.Bind(texRef, this.sharedSamplerBindings);
                        GL.Uniform1(location, this.sharedSamplerBindings);

                        this.sharedSamplerBindings++;
                    }
                    else
                    {
                        float[] data;
                        if (!sharedParams.TryGetInternal(field.Name, out data))
                        {
                            continue;
                        }

                        NativeShaderProgram.SetUniform(field, location, data);
                    }

                    this.sharedShaderParameters.Add(field.Name);
                }
            }

            NativeShaderProgram.Bind(null);
        }
コード例 #2
0
ファイル: GraphicsBackend.cs プロジェクト: razluta/jazz2
        /// <summary>
        /// Applies the specified parameter values to all currently active shaders.
        /// </summary>
        /// <param name="sharedParams"></param>
        /// <seealso cref="RetrieveActiveShaders"/>
        private void SetupSharedParameters(ShaderParameterCollection sharedParams)
        {
            this.sharedSamplerBindings = 0;
            this.sharedShaderParameters.Clear();
            if (sharedParams == null)
            {
                return;
            }

            foreach (NativeShaderProgram shader in this.activeShaders)
            {
                NativeShaderProgram.Bind(shader);

                ShaderFieldInfo[] varInfo   = shader.Fields;
                int[]             locations = shader.FieldLocations;

                // Setup shared sampler bindings
                for (int i = 0; i < varInfo.Length; i++)
                {
                    if (locations[i] == -1)
                    {
                        continue;
                    }
                    if (varInfo[i].Type != ShaderFieldType.Sampler2D)
                    {
                        continue;
                    }

                    ContentRef <Texture> texRef;
                    if (!sharedParams.TryGetInternal(varInfo[i].Name, out texRef))
                    {
                        continue;
                    }

                    NativeTexture.Bind(texRef, this.sharedSamplerBindings);
                    GL.Uniform1(locations[i], this.sharedSamplerBindings);

                    this.sharedSamplerBindings++;
                    this.sharedShaderParameters.Add(varInfo[i].Name);
                }

                // Setup shared uniform data
                for (int i = 0; i < varInfo.Length; i++)
                {
                    if (locations[i] == -1)
                    {
                        continue;
                    }
                    if (varInfo[i].Type == ShaderFieldType.Sampler2D)
                    {
                        continue;
                    }

                    float[] data;
                    if (!sharedParams.TryGetInternal(varInfo[i].Name, out data))
                    {
                        continue;
                    }

                    NativeShaderProgram.SetUniform(ref varInfo[i], locations[i], data);

                    this.sharedShaderParameters.Add(varInfo[i].Name);
                }
            }

            NativeShaderProgram.Bind(null);
        }