public void Link() { GL.LinkProgram(ProgramID); string log = GL.GetProgramInfoLog(ProgramID); if (log.Length != 0) { Console.WriteLine(log); } int attributeCount, uniformCount; GL.GetProgram(ProgramID, GetProgramParameterName.ActiveAttributes, out attributeCount); GL.GetProgram(ProgramID, GetProgramParameterName.ActiveUniforms, out uniformCount); AttributeCount = attributeCount; UniformCount = uniformCount; for (int i = 0; i < AttributeCount; i++) { AttributeInfo info = new AttributeInfo(); int length = 0; StringBuilder name = new StringBuilder(64); GL.GetActiveAttrib(ProgramID, i, 512, out length, out info.Size, out info.Type, name); info.Name = name.ToString(); Attributes.Add(name.ToString(), info); info.Address = GL.GetAttribLocation(ProgramID, info.Name); } for (int i = 0; i < UniformCount; i++) { UniformInfo info = new UniformInfo(); int length = 0; StringBuilder name = new StringBuilder(64); GL.GetActiveUniform(ProgramID, i, 512, out length, out info.Size, out info.Type, name); info.Name = name.ToString(); Uniforms.Add(name.ToString(), info); info.Address = GL.GetUniformLocation(ProgramID, info.Name); } }