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(); } } } } }