private static unsafe void Load() { _gl ??= GL.GetApi(); var vertShader = _gl.CreateShader(GLEnum.VertexShader); var fragShader = _gl.CreateShader(GLEnum.FragmentShader); var vertLen = VertexShader.Length; _gl.ShaderSource(vertShader, 1, SilkMarshal.ToPointer(new [] { VertexShader }), &vertLen); var fragLen = FragmentShader.Length; _gl.ShaderSource(fragShader, 1, SilkMarshal.ToPointer(new [] { FragmentShader }), &fragLen); _gl.CompileShader(vertShader); _gl.CompileShader(fragShader); _shader = _gl.CreateProgram(); _gl.AttachShader(_shader, vertShader); _gl.AttachShader(_shader, fragShader); _gl.LinkProgram(_shader); _gl.DetachShader(_shader, vertShader); _gl.DetachShader(_shader, fragShader); _gl.DeleteShader(fragShader); _gl.DeleteShader(vertShader); _gl.ClearColor(0.2f, 0.3f, 0.3f, 1.0f); _vertexBufferObject = _gl.GenBuffer(); _gl.BindBuffer(GLEnum.ArrayBuffer, _vertexBufferObject); fixed(void *vertices = _vertices) { _gl.BufferData(GLEnum.ArrayBuffer, (uint)_vertices.Length * sizeof(float), vertices, GLEnum.StaticDraw); } _vertexArrayObject = _gl.GenVertexArray(); _gl.BindVertexArray(_vertexArrayObject); var attrib = 0; _gl.VertexAttribPointer(0, 3, GLEnum.Float, false, 3 * sizeof(float), &attrib); _gl.EnableVertexAttribArray(0); _gl.BindBuffer(GLEnum.ArrayBuffer, _vertexBufferObject); Console.WriteLine("done load"); }