Vertex Attributes

Hello, I started coding OpenGL 3.2 (forward compatible with 4.2) using the OpenTK C# binding.
For some reason, the following code doesn’t display anything on the screen.

Main code: (class constructor)


Matrix4 Projection;
Matrix4 View;

int[] ShaderIDs;
int[] ProgramIDs;
uint[] VAOs;
uint[] VBOs;
ushort[] Indices;
Vector3[] Vertices;
        
public Game1()
: base(800, 600)
{
     // Our uniform matrices
     Projection = Matrix4.CreateOrthographicOffCenter(0, Width, Height, 0, 0.01f, 10);
     View = Matrix4.LookAt(new Vector3(0, 0, 100), Vector3.Zero, Vector3.UnitY);

     InitVAOsVBOs();
     InitShaderProgram();

     // Get uniform projection and view matrices locations
     int uProjIndex = GL.GetUniformLocation(ProgramIDs[0], "projection");
     int uViewIndex = GL.GetUniformLocation(ProgramIDs[0], "view");

     // Get inVertexPos location
     int inVertexPosIndex = GL.GetAttribLocation(ProgramIDs[0], "inVertexPos");

     // Start using our shader program
     GL.UseProgram(ProgramIDs[0]);

     // Set uniform values
     GL.UniformMatrix4(uProjIndex, false, ref Projection);
     GL.UniformMatrix4(uViewIndex, false, ref View);

     // Set inVertexPos Array
     GL.BindVertexArray(VAOs[0]);
     GL.VertexAttribPointer(inVertexPosIndex, 3, VertexAttribPointerType.Float, false, 0, IntPtr.Zero);
     GL.EnableVertexAttribArray(inVertexPosIndex);
}

Buffer initialization code:


private void InitVAOsVBOs()
{
     VAOs = new uint[1];
     VBOs = new uint[2];
     GL.GenVertexArrays(VAOs.Length, VAOs);
     GL.GenBuffers(VBOs.Length, VBOs);

     Vertices = new Vector3[8] {
                new Vector3(-100,  100, -100), //0 Top, Left, Front
                new Vector3(-100,  100,  100), //1 Top, Left, Back
                new Vector3(-100, -100, -100), //2 Top, Right, Front
                new Vector3(-100, -100,  100), //3 Top, Right, Back
                new Vector3( 100,  100,  100), //4 Bottom, Left, Front
                new Vector3( 100,  100, -100), //5 Bottom, Left, Back
                new Vector3( 100, -100, -100), //6 Bottom, Right, Front
                new Vector3( 100, -100,  100)  //7 Bottom, Right, Back
     };
     GL.BindBuffer(BufferTarget.ArrayBuffer, VBOs[0]);
     GL.BufferData(BufferTarget.ArrayBuffer, (IntPtr)(Vertices.Length * Vector3.SizeInBytes), Vertices, BufferUsageHint.StaticDraw);
     GL.BindVertexArray(VAOs[0]);

     Indices = new ushort[24] {
           0, 1, 3, 2, // Top face
           0, 1, 5, 4, // Left face
           1, 3, 7, 5, // Back face
           2, 3, 7, 6, // Right face
           4, 5, 7, 6, // Bottom face
           0, 2, 6, 4  // Front face
     };
     GL.BindBuffer(BufferTarget.ElementArrayBuffer, VBOs[0]);
     GL.BufferData(BufferTarget.ElementArrayBuffer, (IntPtr)(Indices.Length * sizeof(ushort)), Indices, BufferUsageHint.StaticDraw);
}

Shader code:


private void InitShaderProgram()
{
     ShaderIDs = new int[2];
     ProgramIDs = new int[1];

     string VS_Source =
@"#version 150

uniform mat4 projection;
uniform mat4 view;

in vec3 inVertexPos;

void main()
{
    gl_Position = projection * view * vec4(inVertexPos, 1.0);
}";
     ShaderIDs[0] = GL.CreateShader(ShaderType.VertexShader);
     GL.ShaderSource(ShaderIDs[0], VS_Source);
     GL.CompileShader(ShaderIDs[0]);
     Console.WriteLine(GL.GetShaderInfoLog(ShaderIDs[0]));

     string FS_Source =
@"#version 150

void main()
{
    gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);
}";
     ShaderIDs[1] = GL.CreateShader(ShaderType.FragmentShader);
     GL.ShaderSource(ShaderIDs[1], FS_Source);
     GL.CompileShader(ShaderIDs[1]);
     Console.WriteLine(GL.GetShaderInfoLog(ShaderIDs[1]));

     ProgramIDs[0] = GL.CreateProgram();
     foreach (int id in ShaderIDs)
         GL.AttachShader(ProgramIDs[0], id);
     GL.LinkProgram(ProgramIDs[0]);
     Console.WriteLine(GL.GetProgramInfoLog(ProgramIDs[0]));
}

Render code:


protected override void OnRenderFrame(FrameEventArgs e)
{
     GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);
     
     GL.DrawElements(BeginMode.Quads, Indices.Length, DrawElementsType.UnsignedShort, 0);
     
     this.SwapBuffers();
}