public VertexArray( VertexBuffer <TVertex> vertexBuffer, ShaderProgram program, params VertexAttribute[] attributes) { // create new vertex array object GL.GenVertexArrays(1, out this._handle); // bind the object so we can modify it this.Bind(); // bind the vertex buffer object vertexBuffer.Bind(); // set all attributes foreach (var attribute in attributes) { attribute.Set(program); } // unbind objects to reset state GL.BindVertexArray(0); GL.BindBuffer(BufferTarget.ArrayBuffer, 0); }
public static void Main(string[] args) { using (var win = new GameWindow(1280, 720, GraphicsMode.Default, "OpenTK Intro", GameWindowFlags.Default, DisplayDevice.Default, // ask for an OpenGL 3.0 forward compatible context 3, 0, GraphicsContextFlags.ForwardCompatible)) { VertexBuffer <ColouredVertex> vertexBuffer = null; ShaderProgram shaderProgram = null; VertexArray <ColouredVertex> vertexArray = null; Matrix4Uniform projectionMatrix = null; win.Load += (s, e) => { var vertexShader = new Shader(ShaderType.VertexShader, File.ReadAllText(@"../../VertexShaders/vertex-shader.vs")); var fragmentShader = new Shader(ShaderType.FragmentShader, File.ReadAllText(@"../../FragmentShaders/fragment-shader.fs")); // link shaders into shader program shaderProgram = new ShaderProgram(vertexShader, fragmentShader); // create projection matrix uniform projectionMatrix = new Matrix4Uniform("projectionMatrix") { Matrix = Matrix4.CreatePerspectiveFieldOfView(MathHelper.PiOver2, 16f / 9, 0.1f, 100f) }; }; win.Unload += (s, e) => { /* dispose global GL resources here */ }; win.RenderFrame += (s, e) => { GL.ClearColor(128, 0, 1, 256); GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit); //http://genericgamedev.com/tutorials/opengl-in-csharp-an-object-oriented-introduction-to-opentk/4/ // activate shader program and set uniforms shaderProgram.Use(); projectionMatrix.Set(shaderProgram); // bind vertex buffer and array objects vertexBuffer.Bind(); vertexArray.Bind(); // upload vertices to GPU and draw them vertexBuffer.BufferData(); vertexBuffer.Draw(); // reset state for potential further draw calls (optional, but good practice) GL.BindVertexArray(0); GL.BindBuffer(BufferTarget.ArrayBuffer, 0); GL.UseProgram(0); // swap backbuffer win.SwapBuffers(); }; win.Resize += (s, e) => { GL.Viewport(0, 0, win.Width, win.Height); }; long updateCount = 0; var random = new Random(); var tetrahedron = new RegularTetrahedron(); win.UpdateFrame += (s, e) => { var keyboardState = win.Keyboard.GetState(); // create and fill a vertex buffer vertexBuffer = new VertexBuffer <ColouredVertex>(ColouredVertex.Size); //foreach (var i in Enumerable.Range(0, random.Next(100, 1000))) //{ // vertexBuffer.AddVertex(new ColouredVertex(new Vector3(-1f * (0.01f * updateCount), -1, -i), Color4.Lime)); // vertexBuffer.AddVertex(new ColouredVertex(new Vector3(1, 1, -i), Color4.Red)); // vertexBuffer.AddVertex(new ColouredVertex(new Vector3(1f * (0.01f * updateCount), -1, -i), Color4.Blue)); //} tetrahedron.Draw(vertexBuffer); // create vertex array to specify vertex layout vertexArray = new VertexArray <ColouredVertex>( vertexBuffer, shaderProgram, new VertexAttribute("vPosition", 3, VertexAttribPointerType.Float, ColouredVertex.Size, 0), new VertexAttribute("vColor", 4, VertexAttribPointerType.Float, ColouredVertex.Size, 12) ); ++updateCount; }; win.Run(); } }