//----------------------------------------------------------------------------------------- private bool _InitVao() { // Create VAO object to hold vertex shader inputs and attach it to our context. As // OpenGL requires the VAO object (whether or not it's used) we do this here. GL.GenVertexArrays(1, out _vertexArrayName); GL.BindVertexArray(_vertexArrayName); GL.BindBuffer(BufferTarget.ArrayBuffer, Buffers.GetName(Buffers.Type.VERTEX)); GL.VertexAttribPointer(0, 3, VertexAttribPointerType.Float, false, 0, 0); GL.BindBuffer(BufferTarget.ArrayBuffer, 0); // Enable the vertex attribute. Note we don't have to be bound to do this! GL.EnableVertexAttribArray(0); return(true); }
//----------------------------------------------------------------------------------------- protected override void OnRenderFrame(FrameEventArgs e) { // Clear the window with given color GL.ClearBuffer(ClearBuffer.Color, 0, Statics.colorGreen); for (int cubeId = 0; cubeId < 24; cubeId++) { this._UpdateTransform(cubeId); // Reset atomic counter uint data = 0; GL.BindBuffer(BufferTarget.AtomicCounterBuffer, Buffers.GetName(Buffers.Type.ATOMIC_COUNTER)); GL.ClearBufferSubData(BufferTarget.AtomicCounterBuffer, PixelInternalFormat.R8ui, IntPtr.Zero, (IntPtr)sizeof(uint), PixelFormat.Rgba, All.UnsignedInt, ref data); GL.BindBuffer(BufferTarget.AtomicCounterBuffer, 0); // Attach our atomic buffer to our contexts atomic counter buffer binding point GL.BindBufferBase(BufferRangeTarget.AtomicCounterBuffer, 0, Buffers.GetName(Buffers.Type.ATOMIC_COUNTER)); // Use first program object to calculate object area GL.UseProgram(_shaderProgramName[0]); //GL.ColorMask( false, false, false, false ); // disable writing to framebuffer // Set the transformation matrix for current program object GL.UniformMatrix4(_uniformNames[0], false, ref _transformMatrix); // Run our shader to update our atomic counter GL.DrawArrays(PrimitiveType.Triangles, 0, 36); GL.BindBufferBase(BufferRangeTarget.UniformBuffer, 0, Buffers.GetName(Buffers.Type.ATOMIC_COUNTER)); // Switch to our second program to actually draw the cube GL.UseProgram(_shaderProgramName[1]); //GL.ColorMask( true, true, true, true ); // enable writing to framebuffer GL.UniformMatrix4(_uniformNames[1], false, ref _transformMatrix); GL.DrawArrays(PrimitiveType.Triangles, 0, 36); } SwapBuffers(); }
//----------------------------------------------------------------------------------------- private bool _InitBuffers() { float[] vertexData = new float[] { // back -0.25f, 0.25f, -0.25f, -0.25f, -0.25f, -0.25f, 0.25f, -0.25f, -0.25f, 0.25f, -0.25f, -0.25f, 0.25f, 0.25f, -0.25f, -0.25f, 0.25f, -0.25f, // right 0.25f, -0.25f, -0.25f, 0.25f, -0.25f, 0.25f, 0.25f, 0.25f, -0.25f, 0.25f, -0.25f, 0.25f, 0.25f, 0.25f, 0.25f, 0.25f, 0.25f, -0.25f, // front 0.25f, -0.25f, 0.25f, -0.25f, -0.25f, 0.25f, 0.25f, 0.25f, 0.25f, -0.25f, -0.25f, 0.25f, -0.25f, 0.25f, 0.25f, 0.25f, 0.25f, 0.25f, // left -0.25f, -0.25f, 0.25f, -0.25f, -0.25f, -0.25f, -0.25f, 0.25f, 0.25f, -0.25f, -0.25f, -0.25f, -0.25f, 0.25f, -0.25f, -0.25f, 0.25f, 0.25f, // bottom -0.25f, -0.25f, 0.25f, 0.25f, -0.25f, 0.25f, 0.25f, -0.25f, -0.25f, 0.25f, -0.25f, -0.25f, -0.25f, -0.25f, -0.25f, -0.25f, -0.25f, 0.25f, // top -0.25f, 0.25f, -0.25f, 0.25f, 0.25f, -0.25f, 0.25f, 0.25f, 0.25f, 0.25f, 0.25f, 0.25f, -0.25f, 0.25f, 0.25f, -0.25f, 0.25f, -0.25f }; GL.GenBuffers(Buffers.GetCount(), Buffers.Names); GL.BindBuffer(BufferTarget.ArrayBuffer, Buffers.GetName(Buffers.Type.VERTEX)); GL.BufferData(BufferTarget.ArrayBuffer, (IntPtr)(sizeof(float) * 4 * vertexData.Length), vertexData, BufferUsageHint.StaticDraw); GL.BindBuffer(BufferTarget.ArrayBuffer, 0); GL.BindBuffer(BufferTarget.AtomicCounterBuffer, Buffers.GetName(Buffers.Type.ATOMIC_COUNTER)); GL.BufferData(BufferTarget.AtomicCounterBuffer, (IntPtr)sizeof(uint), IntPtr.Zero, BufferUsageHint.DynamicCopy); GL.BindBuffer(BufferTarget.AtomicCounterBuffer, 0); return(true); }