public BasicShadedColoredMaterial()
        {
            var vertexShader = new GlShader(ShaderType.VertexShader);

            vertexShader.LoadSource(VertexShaderSource);

            var fragmentShader = new GlShader(ShaderType.FragmentShader);

            fragmentShader.LoadSource(FragmentShaderSource);

            Bind();
            LoadShader(vertexShader);
            LoadShader(fragmentShader);
            Link();

            PositionBuffer = new GlBuffer(BufferTarget.ArrayBuffer);
            PositionBuffer.Bind();

            NormalBuffer = new GlBuffer(BufferTarget.ArrayBuffer);
            NormalBuffer.Bind();

            ColorBuffer = new GlBuffer(BufferTarget.ArrayBuffer);
            ColorBuffer.Bind();

            MatrixBuffer = new GlBuffer(BufferTarget.ArrayBuffer);
            MatrixBuffer.Bind();

            var positionBufferLayout = new GlBufferLayout();

            positionBufferLayout.Add(VertexAttribPointerType.Float, 3); //Vector3 3 floats

            var normalBufferLayout = new GlBufferLayout();

            normalBufferLayout.Add(VertexAttribPointerType.Float, 3);

            var colorBufferLayout = new GlBufferLayout();

            colorBufferLayout.Add(VertexAttribPointerType.Float, 4);

            var matrixBufferLayout = new GlBufferLayout();

            matrixBufferLayout.Add(VertexAttribPointerType.Float, 4, divisor: 1); //Matrix 16 floats
            matrixBufferLayout.Add(VertexAttribPointerType.Float, 4, divisor: 1);
            matrixBufferLayout.Add(VertexAttribPointerType.Float, 4, divisor: 1);
            matrixBufferLayout.Add(VertexAttribPointerType.Float, 4, divisor: 1);

            VertexArray = new GlVertexArray();
            VertexArray.AddBuffer(PositionBuffer, positionBufferLayout);
            VertexArray.AddBuffer(NormalBuffer, normalBufferLayout);
            VertexArray.AddBuffer(ColorBuffer, colorBufferLayout);
            VertexArray.AddBuffer(MatrixBuffer, matrixBufferLayout);
        }
 public GlShaderProgram(string[] vertex_shader_source, string[] fragment_shader_source)
 {
     using (GlShader vertex_shader = new GlShader(ShaderType.VertexShader, vertex_shader_source))
         using (GlShader fragment_shader = new GlShader(ShaderType.FragmentShader, fragment_shader_source))
         {
             ProgramId = Gl.CreateProgram();
             Gl.AttachShader(ProgramId, vertex_shader.ShaderId);
             Gl.AttachShader(ProgramId, fragment_shader.ShaderId);
             Gl.LinkProgram(ProgramId);
             Gl.GetProgram(ProgramId, ProgramProperty.LinkStatus, out int link_succeeded);
             if (link_succeeded == 0)
             {
                 StringBuilder log = new StringBuilder(MaxErrorLength);
                 Gl.GetProgramInfoLog(ProgramId, MaxErrorLength, out int log_length, log);
                 throw new InvalidOperationException($"Failed to link program : {log}");
             }
         }
 }