Beispiel #1
0
        public void compile()
        {
            if (compiled == false)
            {
                compiled = true;

                uniforms = new Dictionary <string, object>();

                GL.LinkProgram(0);

                GL.DeleteShader(vertexShader);
                GL.DeleteShader(fragmentShader);
                GL.DeleteProgram(program);

                vertexShader   = GL.CreateShader(ShaderType.VertexShader);
                fragmentShader = GL.CreateShader(ShaderType.FragmentShader);

                GL.ShaderSource(vertexShader, vert);
                GL.ShaderSource(fragmentShader, frag);

                GL.CompileShader(vertexShader);
                GL.CompileShader(fragmentShader);

                if (!String.IsNullOrEmpty(GL.GetShaderInfoLog(vertexShader)))
                {
                    Console.WriteLine(GL.GetShaderInfoLog(vertexShader));
                }

                if (!String.IsNullOrEmpty(GL.GetShaderInfoLog(fragmentShader)))
                {
                    Console.WriteLine(GL.GetShaderInfoLog(fragmentShader));
                }

                program = GL.CreateProgram();

                GL.AttachShader(program, vertexShader);
                GL.AttachShader(program, fragmentShader);

                GL.LinkProgram(program);

                if (!String.IsNullOrEmpty(GL.GetProgramInfoLog(program)))
                {
                    Console.WriteLine(GL.GetProgramInfoLog(program));
                }
                else
                {
                    Console.WriteLine("Shader \"" + name + "\" successfully compiled");
                }

                int total = 0;

                GL.GetProgram(program, GetProgramParameterName.ActiveUniforms, out total);
                for (int i = 0; i < total; i++)
                {
                    int size     = 16;
                    int name_len = 16;

                    ActiveUniformType type = ActiveUniformType.Sampler2D;
                    StringBuilder     name = new StringBuilder();

                    GL.GetActiveUniform(program, i, 16, out name_len, out size, out type, name);

                    switch (type)
                    {
                    case ActiveUniformType.Sampler2D:
                        if (!String.IsNullOrEmpty(name.ToString()))
                        {
                            uniforms[name.ToString()] = new Sampler2D();
                        }
                        break;

                    case ActiveUniformType.FloatVec4:
                        if (!String.IsNullOrEmpty(name.ToString()))
                        {
                            uniforms[name.ToString()] = new Vec4();
                        }
                        break;

                    case ActiveUniformType.Float:
                        if (!String.IsNullOrEmpty(name.ToString()))
                        {
                            uniforms[name.ToString()] = new Float();
                        }
                        break;

                    case ActiveUniformType.Int:
                        if (!String.IsNullOrEmpty(name.ToString()))
                        {
                            uniforms[name.ToString()] = new Int();
                        }
                        break;
                    }

                    name     = null;
                    size     = 0;
                    name_len = 0;
                }

                for (int i = 0; i < Assets.items.Count; i++)
                {
                    if (Assets.items[i] is Material)
                    {
                        Material m = (Material)Assets.items[i];
                        if (m.shader == this)
                        {
                            m.updateParameters();
                        }
                    }
                }
            }
        }