package main import "github.com/go-gl/gl/v4.1-core/gl" type VertexBuffer struct { bufferId uint32 } func NewVertexBuffer(data []float32) *VertexBuffer { var bufferID uint32 gl.GenBuffers(1, &bufferID) gl.BindBuffer(gl.ARRAY_BUFFER, bufferID) gl.BufferData(gl.ARRAY_BUFFER, len(data)*4, gl.Ptr(data), gl.STATIC_DRAW) return &VertexBuffer{bufferId: bufferID} } func (vb *VertexBuffer) Bind() { gl.BindBuffer(gl.ARRAY_BUFFER, vb.bufferId) } func (vb *VertexBuffer) Unbind() { gl.BindBuffer(gl.ARRAY_BUFFER, 0) } type VertexArray struct { ID uint32 } func NewVertexArray() *VertexArray { var id uint32 gl.GenVertexArrays(1, &id) return &VertexArray{ID: id} } func (va *VertexArray) AddBuffer(vb *VertexBuffer, layout []int32) { va.Bind() vb.Bind() stride := int32(0) for _, size := range layout { stride += size } stride *= 4 // Each float is 4 bytes offset := uintptr(0) for i, size := range layout { gl.EnableVertexAttribArray(uint32(i)) gl.VertexAttribPointer(uint32(i), size, gl.FLOAT, false, stride, gl.PtrOffset(int(offset))) offset += uintptr(size * 4) } } func (va *VertexArray) Bind() { gl.BindVertexArray(va.ID) } func (va *VertexArray) Unbind() { gl.BindVertexArray(0) }