func (t *Texture) ReadTextureFromGPU() []byte { t.Bind() b := gl.GenBuffer() b.Bind(gl.PIXEL_UNPACK_BUFFER) gl.BufferData(gl.PIXEL_UNPACK_BUFFER, t.Width()*t.Height()*t.PixelSize(), 0, gl.STREAM_DRAW) //gl.GetTexImage(t.target, 0, t.format, buffer) b.Bind(gl.PIXEL_UNPACK_BUFFER) gl.TexSubImage2D(t.target, 0, 0, 0, t.Width(), t.Height(), t.format, t.typ, unsafe.Pointer(uintptr(0))) b.Bind(gl.PIXEL_UNPACK_BUFFER) l := t.Width() * t.Height() * t.PixelSize() gl.BufferData(gl.PIXEL_UNPACK_BUFFER, t.Width()*t.Height()*t.PixelSize(), 0, gl.STREAM_DRAW) ptr := gl.MapBuffer(gl.PIXEL_UNPACK_BUFFER, gl.WRITE_ONLY) var x []byte s := (*reflect.SliceHeader)(unsafe.Pointer(&x)) s.Data = uintptr(ptr) s.Len = l s.Cap = l gl.UnmapBuffer(gl.PIXEL_UNPACK_BUFFER) return x }
func fill(canv *Canvas, alphaTex *glh.Texture, paint *Paint) { gGl.GlColorConfig.SetColor(paint.fillColor) defer gGl.GlColorConfig.Reset() gGl.Activate(gGl.FillDrawer) gl.ColorMask(true, true, true, true) gl.StencilMask(0x3) gl.StencilFunc(gl.LESS, 0, 0xff) w, h := canv.W, canv.H p := canv.toGLPoints([]Point{ iPt(0, 0), iPt(w, 0), iPt(w, h), iPt(0, h), }) vertices := []float32{ p[0].X, p[0].Y, 0, 1, p[1].X, p[1].Y, 1, 1, p[2].X, p[2].Y, 1, 0, p[3].X, p[3].Y, 0, 0, } gl.BufferData(gl.ARRAY_BUFFER, len(vertices)*4, vertices, gl.STATIC_DRAW) elements := []uint32{ 0, 1, 2, 2, 3, 0, } gl.BufferData(gl.ELEMENT_ARRAY_BUFFER, len(elements)*4, elements, gl.STATIC_DRAW) glh.With(alphaTex, func() { gl.DrawElements(gl.TRIANGLES, 6, gl.UNSIGNED_INT, nil) }) }
// Create a new model from the given data slice. func NewModel(vertices []Vertex, indices []uint32) (*Model, error) { // TODO add error detection m := new(Model) m.vertices, m.indices = vertices, indices m.program = &DefaultShaderProgram m.vao = gl.GenVertexArray() m.vao.Bind() m.vbo = gl.GenBuffer() m.vbo.Bind(gl.ARRAY_BUFFER) m.ibo = gl.GenBuffer() m.ibo.Bind(gl.ELEMENT_ARRAY_BUFFER) vSize := int(unsafe.Sizeof(m.vertices[0])) uSize := int(unsafe.Sizeof(uint32(0))) gl.BufferData(gl.ARRAY_BUFFER, len(m.vertices)*vSize, &m.vertices[0], gl.STATIC_DRAW) gl.BufferData(gl.ELEMENT_ARRAY_BUFFER, len(m.indices)*uSize, &m.indices[0], gl.STATIC_DRAW) posLoc.EnableArray() colorLoc.EnableArray() posLoc.AttribPointer(3, gl.FLOAT, false, vSize, uintptr(0)) colorLoc.AttribPointer(4, gl.FLOAT, false, vSize, uintptr(int(unsafe.Sizeof(float32(0))*3))) colorLoc.DisableArray() posLoc.DisableArray() m.vbo.Unbind(gl.ARRAY_BUFFER) m.ibo.Unbind(gl.ELEMENT_ARRAY_BUFFER) return m, nil }
func (self *OpenGLRenderer) LoadMesh(mesh *render.Mesh) { if len(mesh.VertexList) == 0 { log.Println("WARNING Stopping load of mesh [", mesh.Name, "] with no verticies") return } vertexArrayObj := gl.GenVertexArray() vertexArrayObj.Bind() vertexBuffer := gl.GenBuffer() vertexBuffer.Bind(gl.ARRAY_BUFFER) gl.BufferData(gl.ARRAY_BUFFER, len(mesh.VertexList)*4, mesh.VertexList, gl.STATIC_DRAW) attribLoc := gl.AttribLocation(0) attribLoc.EnableArray() attribLoc.AttribPointer(3, gl.FLOAT, false, 0, nil) if len(mesh.UVList) > 0 { uvBuffer := gl.GenBuffer() uvBuffer.Bind(gl.ARRAY_BUFFER) gl.BufferData(gl.ARRAY_BUFFER, len(mesh.UVList)*4, mesh.UVList, gl.STATIC_DRAW) attribLoc := gl.AttribLocation(1) attribLoc.EnableArray() attribLoc.AttribPointer(2, gl.FLOAT, false, 0, nil) mesh.UVBuffer = uvBuffer } else if len(mesh.ColorList) > 0 { colorBuffer := gl.GenBuffer() colorBuffer.Bind(gl.ARRAY_BUFFER) gl.BufferData(gl.ARRAY_BUFFER, len(mesh.ColorList)*4, mesh.ColorList, gl.STATIC_DRAW) attribLoc := gl.AttribLocation(1) attribLoc.EnableArray() attribLoc.AttribPointer(3, gl.FLOAT, false, 0, nil) mesh.ColorBuffer = colorBuffer } if len(mesh.IndexList) > 0 { indexBuffer := gl.GenBuffer() indexBuffer.Bind(gl.ELEMENT_ARRAY_BUFFER) gl.BufferData(gl.ELEMENT_ARRAY_BUFFER, len(mesh.IndexList)*4, mesh.IndexList, gl.STATIC_DRAW) mesh.IndexBuffer = indexBuffer } mesh.VertexArrayObj = vertexArrayObj mesh.VertexBuffer = vertexBuffer }
func (b *VertexBuffer) SetVertices(src []byte, usage Usage) error { gl.VertexArray(0).Bind() b.bind() // set size of buffer and invalidate it gl.BufferData(gl.ARRAY_BUFFER, len(src), nil, usage.gl()) if len(src) > 0 { // if unmap returns false, the buffer we wrote to is no longer valid and we // need to try again. though, this is apparently uncommon in modern // drivers. this means it is not feasible to compute/copy vertices directly // into the mapped buffer. however, it would be nice to provide a // failure-capable API to do this. const maxretries = 5 retries := 0 for ; retries < maxretries; retries++ { ptr := gl.MapBuffer(gl.ARRAY_BUFFER, gl.WRITE_ONLY) slicehdr := reflect.SliceHeader{ Data: uintptr(ptr), Len: len(src), Cap: len(src), } dest := *(*[]byte)(unsafe.Pointer(&slicehdr)) copy(dest, src) if gl.UnmapBuffer(gl.ARRAY_BUFFER) { break } } if retries == maxretries { return errMapBufferFailed } } b.count = len(src) / b.format.Stride() return nil }
func MakeBuffer(target gl.GLenum, size int, data interface{}) gl.Buffer { buffer := gl.GenBuffer() buffer.Bind(target) gl.BufferData(target, size, data, gl.STATIC_DRAW) gl.BufferUnbind(target) return buffer }
func newVertexBuffer(geometry Shape) gl.Buffer { result := []float32{} faces := geometry.Faces() vertices := geometry.Vertices() if len(faces) > 0 { // Handle faces for _, face := range faces { for i := 0; i < 3; i++ { vertex := vertices[face.At(i)] result = append(result, vertex.X(), vertex.Y(), vertex.Z()) } } } else { // Handle plain vertices for _, vertex := range geometry.Vertices() { result = append(result, vertex.X(), vertex.Y(), vertex.Z()) } } glBuffer := gl.GenBuffer() glBuffer.Bind(gl.ARRAY_BUFFER) gl.BufferData(gl.ARRAY_BUFFER, len(result)*3*4, result, gl.STATIC_DRAW) return glBuffer }
// NewIndex creates a new element index func NewIndex(data []uint16) *Index { glBuffer := gl.GenBuffer() glBuffer.Bind(gl.ELEMENT_ARRAY_BUFFER) gl.BufferData(gl.ELEMENT_ARRAY_BUFFER, len(data)*int(glh.Sizeof(gl.UNSIGNED_SHORT)), data, gl.STATIC_DRAW) return &Index{glBuffer: glBuffer, count: len(data)} }
func main() { if err := glfw.Init(); err != nil { fmt.Fprintf(os.Stderr, "%s\n", err.Error()) return } defer glfw.Terminate() glfw.OpenWindowHint(glfw.FsaaSamples, 4) glfw.OpenWindowHint(glfw.OpenGLVersionMajor, 3) glfw.OpenWindowHint(glfw.OpenGLVersionMinor, 3) glfw.OpenWindowHint(glfw.OpenGLProfile, glfw.OpenGLCoreProfile) if err := glfw.OpenWindow(1024, 768, 0, 0, 0, 0, 32, 0, glfw.Windowed); err != nil { fmt.Fprintf(os.Stderr, "%s\n", err.Error()) return } gl.Init() // Can't find gl.GLEW_OK or any variation, not sure how to check if this worked gl.GetError() // Ignore error glfw.SetWindowTitle("Tutorial 02") glfw.Enable(glfw.StickyKeys) gl.ClearColor(0., 0., 0.4, 0.) prog := helper.MakeProgram("SimpleVertexShader.vertexshader", "SimpleFragmentShader.fragmentshader") vBufferData := [...]float32{ -1., -1., 0., 1., -1., 0., 0., 1., 0.} vertexArray := gl.GenVertexArray() vertexArray.Bind() buffer := gl.GenBuffer() buffer.Bind(gl.ARRAY_BUFFER) gl.BufferData(gl.ARRAY_BUFFER, len(vBufferData)*4, &vBufferData, gl.STATIC_DRAW) // Equivalent to a do... while for ok := true; ok; ok = (glfw.Key(glfw.KeyEsc) != glfw.KeyPress && glfw.WindowParam(glfw.Opened) == gl.TRUE) { gl.Clear(gl.COLOR_BUFFER_BIT) prog.Use() attribLoc := gl.AttribLocation(0) attribLoc.EnableArray() buffer.Bind(gl.ARRAY_BUFFER) attribLoc.AttribPointer(3, gl.FLOAT, false, 0, nil) gl.DrawArrays(gl.TRIANGLES, 0, 3) attribLoc.DisableArray() glfw.SwapBuffers() } }
func (r *Renderer) Initialize() { r.vertices = []mapVertex{ {200, 200, 0, 1, 1, 1, 1, 0, 0}, {218, 200, 0, 1, 0, 0, 1, 0, 0}, } vs, err := LoadShader(vertexShader, gl.VERTEX_SHADER) if err != nil { panic(err) } gs, err := LoadShader(geometryShader, gl.GEOMETRY_SHADER) if err != nil { panic(err) } fs, err := LoadShader(fragmentShader, gl.FRAGMENT_SHADER) if err != nil { panic(err) } gl.ClearColor(0, 1, 0, 0) // Create the VAO // GL 3+ allows us to store the vertex layout in a vertex array object (VAO). r.vao = gl.GenVertexArray() r.vao.Bind() // Create VBO r.vbo = gl.GenBuffer() r.vbo.Bind(gl.ARRAY_BUFFER) gl.BufferData(gl.ARRAY_BUFFER, len(r.vertices)*4*9, r.vertices, gl.DYNAMIC_DRAW) prog, err := LoadProgram(vs, gs, fs) if err != nil { panic(err) } prog.Use() r.prog = prog r.mvmLocation = r.prog.GetUniformLocation("modelview_matrix") pos := r.prog.GetAttribLocation("in_position") color := r.prog.GetAttribLocation("in_color") texcoord := r.prog.GetAttribLocation("in_texcoord") // FIXME: size math pos.AttribPointer(3, gl.FLOAT, false, 9*4, nil) color.AttribPointer(4, gl.FLOAT, false, 9*4, uintptr(3*4)) texcoord.AttribPointer(2, gl.FLOAT, false, 9*4, uintptr(7*4)) pos.EnableArray() color.EnableArray() texcoord.EnableArray() }
func (c *QuadraticCurve) draw(canv *Canvas) { p := canv.toGLPoints(c.Points()) vertices := []float32{ p[0].X, p[0].Y, 0.0, 0.0, p[1].X, p[1].Y, 0.5, 0.0, p[2].X, p[2].Y, 1.0, 1.0, } gl.BufferData(gl.ARRAY_BUFFER, len(vertices)*4, vertices, gl.STATIC_DRAW) gl.DrawArrays(gl.TRIANGLES, 0, 3) }
func (d *DrawImage) render() error { fn := func(idx int) (err error) { defer func() { //err = recover() }() vbuf := gl.GenBuffer() vbuf.Bind(gl.ARRAY_BUFFER) gl.BufferData(gl.ARRAY_BUFFER, len(d.vertex[idx])*4, d.vertex[idx], gl.STATIC_DRAW) panicGlError() defer vbuf.Delete() uvbuf := gl.GenBuffer() uvbuf.Bind(gl.ARRAY_BUFFER) gl.BufferData(gl.ARRAY_BUFFER, len(d.uv[idx])*4, d.uv[idx], gl.STATIC_DRAW) panicGlError() defer uvbuf.Delete() vloc := gl.AttribLocation(0) vloc.EnableArray() vbuf.Bind(gl.ARRAY_BUFFER) vloc.AttribPointer(3, gl.FLOAT, false, 0, nil) panicGlError() defer vloc.DisableArray() uvloc := gl.AttribLocation(1) uvloc.EnableArray() uvbuf.Bind(gl.ARRAY_BUFFER) uvloc.AttribPointer(2, gl.FLOAT, false, 0, nil) panicGlError() defer uvloc.DisableArray() gl.DrawArrays(gl.TRIANGLES, 0, 3) return checkGlError() } if err := fn(0); err != nil { return err } return fn(1) }
// updateBuffer fills the OpenGL buffer IF NEEDED. // It updates the buffer if the bufferdataClean flag is false. // It is safe to call this method every frame via the concrete classes method // UpdateBuffer: most of the time it will just return immediately. func (buffer *baseBuffer) update(vertexdata interface{}) { if buffer.bufferdataClean { return } if buffer.name == 0 { panic("tried to update buffer 0") } // Convert the Go-friendly data into OpenGL-friendly data. oldSize := len(buffer.bufferdata) bufferdata := new(bytes.Buffer) err := binary.Write(bufferdata, endianness, vertexdata) if err != nil { panic(err) } buffer.bufferdata = bufferdata.Bytes() buffer.bufferdataClean = true newSize := len(buffer.bufferdata) // Should we make the buffer bigger? needBigger := newSize > oldSize buffer.bind() if needBigger { // (Re)allocate a buffer. gl.BufferData( buffer.target, len(buffer.bufferdata), buffer.bufferdata, buffer.usage, ) if err := CheckGlError(); err != nil { err.Description = "gl.BufferData" panic(err) } } else { // Re-use existing buffer. gl.BufferSubData( buffer.target, 0, len(buffer.bufferdata), buffer.bufferdata, ) if err := CheckGlError(); err != nil { err.Description = "gl.BufferSubData" panic(err) } } buffer.unbind() }
func (video *SDLVideo) initGL() { if gl.Init() != 0 { panic(sdl.GetError()) } gl.ClearColor(0.0, 0.0, 0.0, 1.0) gl.Enable(gl.CULL_FACE) gl.Enable(gl.DEPTH_TEST) video.prog = createProgram(vertShaderSrcDef, fragShaderSrcDef) posAttrib := video.prog.GetAttribLocation("vPosition") texCoordAttr := video.prog.GetAttribLocation("vTexCoord") video.textureUni = video.prog.GetAttribLocation("texture") video.texture = gl.GenTexture() gl.ActiveTexture(gl.TEXTURE0) video.texture.Bind(gl.TEXTURE_2D) gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST) gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST) video.prog.Use() posAttrib.EnableArray() texCoordAttr.EnableArray() vertVBO := gl.GenBuffer() vertVBO.Bind(gl.ARRAY_BUFFER) verts := []float32{-1.0, 1.0, -1.0, -1.0, 1.0, -1.0, 1.0, -1.0, 1.0, 1.0, -1.0, 1.0} gl.BufferData(gl.ARRAY_BUFFER, len(verts)*int(unsafe.Sizeof(verts[0])), &verts[0], gl.STATIC_DRAW) textCoorBuf := gl.GenBuffer() textCoorBuf.Bind(gl.ARRAY_BUFFER) texVerts := []float32{0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0} gl.BufferData(gl.ARRAY_BUFFER, len(texVerts)*int(unsafe.Sizeof(texVerts[0])), &texVerts[0], gl.STATIC_DRAW) posAttrib.AttribPointer(2, gl.FLOAT, false, 0, uintptr(0)) texCoordAttr.AttribPointer(2, gl.FLOAT, false, 0, uintptr(0)) }
func newTextVertexBuffer(geometry *TextGeometry) gl.Buffer { result := []float32{} vertices := geometry.Vertices for _, vertex := range vertices { result = append(result, vertex.X(), vertex.Y()) } glBuffer := gl.GenBuffer() glBuffer.Bind(gl.ARRAY_BUFFER) gl.BufferData(gl.ARRAY_BUFFER, len(result)*2*4, result, gl.STATIC_DRAW) return glBuffer }
func newNormalBuffer(geometry Shape) gl.Buffer { result := []float32{} normals := geometry.Normals() for _, face := range geometry.Faces() { for i := 0; i < 3; i++ { normal := normals[face.NormalAt(i)] result = append(result, normal.X(), normal.Y(), normal.Z()) } } glBuffer := gl.GenBuffer() glBuffer.Bind(gl.ARRAY_BUFFER) gl.BufferData(gl.ARRAY_BUFFER, len(result)*3*4, result, gl.STATIC_DRAW) return glBuffer }
func (b *IndexBuffer) setIndices(copyTo func(unsafe.Pointer), usage Usage, size int) error { gl.VertexArray(0).Bind() b.bind() gl.BufferData(gl.ELEMENT_ARRAY_BUFFER, size, nil, usage.gl()) if size > 0 { const maxretries = 5 retries := 0 for ; retries < maxretries; retries++ { ptr := gl.MapBuffer(gl.ELEMENT_ARRAY_BUFFER, gl.WRITE_ONLY) copyTo(ptr) if gl.UnmapBuffer(gl.ELEMENT_ARRAY_BUFFER) { break } } if retries == maxretries { return errMapBufferFailed } } return nil }
func newUvBuffer(uvs []mgl32.Vec2, compressed bool) gl.Buffer { result := []float32{} for _, uv := range uvs { result = append(result, uv.X(), uv.Y()) } if compressed { // Invert V because we're using a compressed texture for i := 1; i < len(result); i += 2 { result[i] = 1.0 - result[i] } } glBuffer := gl.GenBuffer() glBuffer.Bind(gl.ARRAY_BUFFER) gl.BufferData(gl.ARRAY_BUFFER, len(result)*2*4, result, gl.STATIC_DRAW) return glBuffer }
func initDefaultPlane() { defaultBuffer = GenBuffer() //Triagles data := make([]float32, 20) data[0] = -0.5 data[1] = -0.5 data[2] = 1 data[3] = 0.5 data[4] = -0.5 data[5] = 1 data[6] = 0.5 data[7] = 0.5 data[8] = 1 data[9] = -0.5 data[10] = 0.5 data[11] = 1 // UV data[12] = 0 data[13] = 1 data[14] = 1 data[15] = 1 data[16] = 1 data[17] = 0 data[18] = 0 data[19] = 0 defaultBuffer.Bind(gl.ARRAY_BUFFER) gl.BufferData(gl.ARRAY_BUFFER, len(data)*4, data, gl.STATIC_DRAW) }
func (p *Path) glDraw(canv *Canvas) { for e := p.Segs.Front(); e != nil; e = e.Next() { e.Value.(PathSegment).Draw(canv) } if GetPt(p.endPoints.Back()).Mathgl().ApproxEqual( GetPt(p.endPoints.Front()).Mathgl()) { p.endPoints.Remove(p.endPoints.Back()) } if p.endPoints.Len() < 3 { return } gGl.Activate(gGl.TriangleDrawer) gl.BlendFunc(gl.ONE_MINUS_DST_ALPHA, gl.ZERO) defer gl.BlendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA) pa := make(p2t.PointArray, 0, p.endPoints.Len()) for e := p.endPoints.Front(); e != nil; e = e.Next() { p := GetPt(e) pa = append(pa, &p2t.Point{X: float64(p.X), Y: float64(p.Y)}) } p2t.Init(pa) triArr := p2t.Triangulate() vertices := make([]float32, 6, 6) for _, tri := range triArr { for i, triPt := range tri.Point { pt := canv.toGLPoint(Pt(triPt.X, triPt.Y)) vertices[i*2] = pt.X vertices[i*2+1] = pt.Y } gl.BufferData(gl.ARRAY_BUFFER, len(vertices)*4, vertices, gl.STATIC_DRAW) gl.DrawArrays(gl.TRIANGLES, 0, 3) } }
func main() { runtime.LockOSThread() if !glfw.Init() { fmt.Fprintf(os.Stderr, "Can't open GLFW") return } defer glfw.Terminate() glfw.WindowHint(glfw.Samples, 4) glfw.WindowHint(glfw.ContextVersionMajor, 3) glfw.WindowHint(glfw.ContextVersionMinor, 3) glfw.WindowHint(glfw.OpenglProfile, glfw.OpenglCoreProfile) glfw.WindowHint(glfw.OpenglForwardCompatible, glfw.True) // needed for macs window, err := glfw.CreateWindow(1024, 768, "Tutorial 6", nil, nil) if err != nil { fmt.Fprintf(os.Stderr, "%v\n", err) return } window.MakeContextCurrent() gl.Init() gl.GetError() // Ignore error window.SetInputMode(glfw.StickyKeys, 1) window.SetCursorPosition(1024/2, 768/2) window.SetInputMode(glfw.Cursor, glfw.CursorHidden) gl.ClearColor(0., 0., 0.4, 0.) gl.Enable(gl.DEPTH_TEST) gl.DepthFunc(gl.LESS) gl.Enable(gl.CULL_FACE) camera := input.NewCamera(window) vertexArray := gl.GenVertexArray() defer vertexArray.Delete() vertexArray.Bind() prog := helper.MakeProgram("TransformVertexShader.vertexshader", "TextureFragmentShader.fragmentshader") defer prog.Delete() matrixID := prog.GetUniformLocation("MVP") texture, err := helper.TextureFromDDS("uvtemplate.DDS") if err != nil { fmt.Printf("Couldn't make texture: %v\n", err) return } defer texture.Delete() texSampler := prog.GetUniformLocation("myTextureSampler") vBufferData := [...]float32{ -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, -1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, -1.0, 1.0, -1.0, 1.0, -1.0, -1.0, -1.0, 1.0, -1.0, -1.0, 1.0, 1.0, -1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, -1.0, 1.0, -1.0, 1.0, -1.0, 1.0, -1.0, -1.0, 1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, -1.0, -1.0, 1.0, 1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, 1.0, 1.0, -1.0, 1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, 1.0, -1.0, 1.0, 1.0, 1.0, -1.0, 1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, 1.0, 1.0, 1.0, -1.0, 1.0, } uvBufferData := [...]float32{ 0.000059, 1.0 - 0.000004, 0.000103, 1.0 - 0.336048, 0.335973, 1.0 - 0.335903, 1.000023, 1.0 - 0.000013, 0.667979, 1.0 - 0.335851, 0.999958, 1.0 - 0.336064, 0.667979, 1.0 - 0.335851, 0.336024, 1.0 - 0.671877, 0.667969, 1.0 - 0.671889, 1.000023, 1.0 - 0.000013, 0.668104, 1.0 - 0.000013, 0.667979, 1.0 - 0.335851, 0.000059, 1.0 - 0.000004, 0.335973, 1.0 - 0.335903, 0.336098, 1.0 - 0.000071, 0.667979, 1.0 - 0.335851, 0.335973, 1.0 - 0.335903, 0.336024, 1.0 - 0.671877, 1.000004, 1.0 - 0.671847, 0.999958, 1.0 - 0.336064, 0.667979, 1.0 - 0.335851, 0.668104, 1.0 - 0.000013, 0.335973, 1.0 - 0.335903, 0.667979, 1.0 - 0.335851, 0.335973, 1.0 - 0.335903, 0.668104, 1.0 - 0.000013, 0.336098, 1.0 - 0.000071, 0.000103, 1.0 - 0.336048, 0.000004, 1.0 - 0.671870, 0.336024, 1.0 - 0.671877, 0.000103, 1.0 - 0.336048, 0.336024, 1.0 - 0.671877, 0.335973, 1.0 - 0.335903, 0.667969, 1.0 - 0.671889, 1.000004, 1.0 - 0.671847, 0.667979, 1.0 - 0.335851, } // Invert V because we're using a compressed texture for i := 1; i < len(uvBufferData); i += 2 { uvBufferData[i] = 1.0 - uvBufferData[i] } vertexBuffer := gl.GenBuffer() defer vertexBuffer.Delete() vertexBuffer.Bind(gl.ARRAY_BUFFER) gl.BufferData(gl.ARRAY_BUFFER, len(vBufferData)*4, &vBufferData, gl.STATIC_DRAW) uvBuffer := gl.GenBuffer() defer uvBuffer.Delete() uvBuffer.Bind(gl.ARRAY_BUFFER) gl.BufferData(gl.ARRAY_BUFFER, len(uvBufferData)*4, &uvBufferData, gl.STATIC_DRAW) // Equivalent to a do... while for ok := true; ok; ok = (window.GetKey(glfw.KeyEscape) != glfw.Press && !window.ShouldClose()) { func() { gl.Clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT) prog.Use() defer gl.ProgramUnuse() view, proj := camera.ComputeViewPerspective() model := mgl32.Ident4() MVP := proj.Mul4(view).Mul4(model) //mvpArray := mvp.AsCMOArray(mathgl.FLOAT32).([16]float32) matrixID.UniformMatrix4fv(false, MVP) gl.ActiveTexture(gl.TEXTURE0) texture.Bind(gl.TEXTURE_2D) defer texture.Unbind(gl.TEXTURE_2D) texSampler.Uniform1i(0) vertexAttrib := gl.AttribLocation(0) vertexAttrib.EnableArray() defer vertexAttrib.DisableArray() vertexBuffer.Bind(gl.ARRAY_BUFFER) defer vertexBuffer.Unbind(gl.ARRAY_BUFFER) vertexAttrib.AttribPointer(3, gl.FLOAT, false, 0, nil) uvAttrib := gl.AttribLocation(1) uvAttrib.EnableArray() defer uvAttrib.DisableArray() uvBuffer.Bind(gl.ARRAY_BUFFER) defer uvBuffer.Unbind(gl.ARRAY_BUFFER) uvAttrib.AttribPointer(2, gl.FLOAT, false, 0, nil) gl.DrawArrays(gl.TRIANGLES, 0, 12*3) window.SwapBuffers() glfw.PollEvents() }() // Defers unbinds and disables to here, end of the loop } }
func (this *Game) init() { vs, err := NewShader(gl.VERTEX_SHADER, `#version 150 in vec4 position; uniform mat4 cameraToClipMatrix; void main() { gl_Position = cameraToClipMatrix * position; }`) if err != nil { log.Printf("Error compiling vertex shader\n") log.Println(err) } fs, err := NewShader(gl.FRAGMENT_SHADER, `#version 150 uniform vec4 color; out vec4 outputF; void main(void) { outputF = color; }`) if err != nil { log.Printf("Error compiling fragment shader\n") log.Println(err) } program := NewProgram(vs, fs) verts := make([]Vector4, 100) sides := len(verts) vert_scale := 1.0 / float64(sides) TWO_PI := math.Pi * 2.0 for i := 0; i < sides; i++ { angle := float64(i) * TWO_PI * vert_scale verts[i] = Vector4{float32(math.Cos(angle)), float32(math.Sin(angle)), 0, 1} } vao := gl.GenVertexArray() vao.Bind() vbo := gl.GenBuffer() vbo.Bind(gl.ARRAY_BUFFER) gl.BufferData(gl.ARRAY_BUFFER, int(reflect.TypeOf(Vector4{}).Size())*len(verts), verts, gl.STATIC_DRAW) positionAttrib := program.GetAttribLocation("position") positionAttrib.AttribPointer(4, gl.FLOAT, false, 0, nil) positionAttrib.EnableArray() vbo.Unbind(gl.ARRAY_BUFFER) vao.Unbind() cameraToClipMatrixUniform := program.GetUniformLocation("cameraToClipMatrix") colorUniform := program.GetUniformLocation("color") zNear := float32(0.0) zFar := float32(45.0) cameraToClipMatrix := ortho(0, float32(width), 0, float32(height), zNear, zFar) this.program = program this.vao = vao this.cameraToClipMatrixUniform = cameraToClipMatrixUniform this.cameraToClipMatrix = cameraToClipMatrix this.colorUniform = colorUniform this.text = gltext.NewFont("./PixelCarnageMono.ttf", 18, 64, float32(width), float32(height)) this.gameState = initialized }
func main() { runtime.LockOSThread() if !glfw.Init() { fmt.Fprintf(os.Stderr, "Can't open GLFW") return } defer glfw.Terminate() glfw.WindowHint(glfw.Samples, 4) glfw.WindowHint(glfw.ContextVersionMajor, 3) glfw.WindowHint(glfw.ContextVersionMinor, 3) glfw.WindowHint(glfw.OpenglProfile, glfw.OpenglCoreProfile) glfw.WindowHint(glfw.OpenglForwardCompatible, glfw.True) // needed for macs window, err := glfw.CreateWindow(1024, 768, "Tutorial 3", nil, nil) if err != nil { fmt.Fprintf(os.Stderr, "%v\n", err) return } window.MakeContextCurrent() gl.Init() gl.GetError() // Ignore error window.SetInputMode(glfw.StickyKeys, 1) gl.ClearColor(0., 0., 0.4, 0.) vertexArray := gl.GenVertexArray() defer vertexArray.Delete() vertexArray.Bind() prog := helper.MakeProgram("SimpleTransform.vertexshader", "SingleColor.fragmentshader") defer prog.Delete() matrixID := prog.GetUniformLocation("MVP") Projection := mgl32.Perspective(45.0, 4.0/3.0, 0.1, 100.0) //Projection := mathgl.Identity(4,mathgl.FLOAT64) //Projection := mathgl.Ortho2D(-5,5,-5,5) View := mgl32.LookAt(4.0, 3.0, 3.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0) //View := mathgl.Identity(4,mathgl.FLOAT64) Model := mgl32.Ident4() //Model := mathgl.Scale3D(2.,2.,2.).Mul(mathgl.HomogRotate3DX(25.0)).Mul(mathgl.Translate3D(.5,.2,-.7)) MVP := Projection.Mul4(View).Mul4(Model) // Remember, transform multiplication order is "backwards" vBufferData := [...]float32{ -1., -1., 0., 1., -1., 0., 0., 1., 0.} //elBufferData := [...]uint8{0, 1, 2} // Not sure why this is here buffer := gl.GenBuffer() defer buffer.Delete() buffer.Bind(gl.ARRAY_BUFFER) gl.BufferData(gl.ARRAY_BUFFER, len(vBufferData)*4, &vBufferData, gl.STATIC_DRAW) // Equivalent to a do... while for ok := true; ok; ok = (window.GetKey(glfw.KeyEscape) != glfw.Press && !window.ShouldClose()) { gl.Clear(gl.COLOR_BUFFER_BIT) prog.Use() matrixID.UniformMatrix4fv(false, MVP) attribLoc := gl.AttribLocation(0) attribLoc.EnableArray() buffer.Bind(gl.ARRAY_BUFFER) attribLoc.AttribPointer(3, gl.FLOAT, false, 0, nil) gl.DrawArrays(gl.TRIANGLES, 0, 3) attribLoc.DisableArray() window.SwapBuffers() glfw.PollEvents() } }
func main() { if err := glfw.Init(); err != nil { fmt.Fprintf(os.Stderr, "%s\n", err.Error()) return } defer glfw.Terminate() glfw.OpenWindowHint(glfw.FsaaSamples, 4) glfw.OpenWindowHint(glfw.OpenGLVersionMajor, 3) glfw.OpenWindowHint(glfw.OpenGLVersionMinor, 3) glfw.OpenWindowHint(glfw.OpenGLProfile, glfw.OpenGLCoreProfile) if err := glfw.OpenWindow(1024, 768, 0, 0, 0, 0, 32, 0, glfw.Windowed); err != nil { fmt.Fprintf(os.Stderr, "%s\n", err.Error()) return } glfw.SetSwapInterval(0) //gl.GlewExperimental(true) gl.Init() // Can't find gl.GLEW_OK or any variation, not sure how to check if this worked gl.GetError() // ignore error, since we're telling it to use CoreProfile above, we get "invalid enumerant" (GLError 1280) which freaks the OpenGLSentinel out glfw.SetWindowTitle("Tutorial 07") glfw.Enable(glfw.StickyKeys) glfw.Disable(glfw.MouseCursor) // Not in the original tutorial, but IMO it SHOULD be there glfw.SetMousePos(1024.0/2.0, 768.0/2.0) gl.ClearColor(0., 0., 0.4, 0.) gl.Enable(gl.DEPTH_TEST) gl.DepthFunc(gl.LESS) gl.Enable(gl.CULL_FACE) camera := input.NewCamera() vertexArray := gl.GenVertexArray() defer vertexArray.Delete() vertexArray.Bind() prog := helper.MakeProgram("TransformVertexShader.vertexshader", "TextureFragmentShader.fragmentshader") defer prog.Delete() matrixID := prog.GetUniformLocation("MVP") texture := helper.MakeTextureFromTGA("uvmap.tga") // Had to convert to tga, go-gl is missing the texture method for DDS right now defer texture.Delete() texSampler := prog.GetUniformLocation("myTextureSampler") meshObj := objloader.LoadObject("cube.obj") vertices, uvs := meshObj.Vertices, meshObj.UVs vertexBuffer := gl.GenBuffer() defer vertexBuffer.Delete() vertexBuffer.Bind(gl.ARRAY_BUFFER) gl.BufferData(gl.ARRAY_BUFFER, len(vertices)*3*4, vertices, gl.STATIC_DRAW) uvBuffer := gl.GenBuffer() defer uvBuffer.Delete() uvBuffer.Bind(gl.ARRAY_BUFFER) // UV doesn't seem to care gl.BufferData(gl.ARRAY_BUFFER, len(uvs)*2*4, uvs, gl.STATIC_DRAW) // Equivalent to a do... while for ok := true; ok; ok = (glfw.Key(glfw.KeyEsc) != glfw.KeyPress && glfw.WindowParam(glfw.Opened) == gl.TRUE && glfw.Key('Q') != glfw.KeyPress) { func() { gl.Clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT) prog.Use() defer gl.ProgramUnuse() view, proj := camera.ComputeViewPerspective() model := mathgl.Ident4f() MVP := proj.Mul4(view).Mul4(model) matrixID.UniformMatrix4fv(false, MVP) gl.ActiveTexture(gl.TEXTURE0) texture.Bind(gl.TEXTURE_2D) defer texture.Unbind(gl.TEXTURE_2D) texSampler.Uniform1i(0) vertexAttrib := gl.AttribLocation(0) vertexAttrib.EnableArray() defer vertexAttrib.DisableArray() vertexBuffer.Bind(gl.ARRAY_BUFFER) defer vertexBuffer.Unbind(gl.ARRAY_BUFFER) vertexAttrib.AttribPointer(3, gl.FLOAT, false, 0, nil) uvAttrib := gl.AttribLocation(1) uvAttrib.EnableArray() defer uvAttrib.DisableArray() uvBuffer.Bind(gl.ARRAY_BUFFER) defer uvBuffer.Unbind(gl.ARRAY_BUFFER) uvAttrib.AttribPointer(2, gl.FLOAT, false, 0, nil) gl.DrawArrays(gl.TRIANGLES, 0, len(vertices)) glfw.SwapBuffers() }() // Defers unbinds and disables to here, end of the loop } }
func (ui *UIText) setString(text string) { ui.text = text if text == "" { ui.buffer.Bind(gl.ARRAY_BUFFER) gl.BufferData(gl.ARRAY_BUFFER, 1, []byte{1}, gl.STATIC_DRAW) return } l := len(text) lt := l * 12 _ = lt data := make([]float32, 20*l) vertexCount := 0 texcoordsIndex := lt * 4 space := float32(0) w, h := ui.GetPixelSize(text) index := 0 for _, rune := range text { spaceMult := float32(1) if rune == '\t' { rune = ' ' spaceMult = float32(index % ui.tabSize) } atlasImage := ui.Font.LetterInfo(rune) if atlasImage == nil { continue } yratio := atlasImage.RelativeHeight xratio := atlasImage.RelativeWidth //ygrid := -0.5 + (atlasImage.YGrid) //xgrid := (-0.5 + (atlasImage.XGrid)) + space ygrid := -(h / 2) + (atlasImage.YOffset) xgrid := -(w / 2) + (atlasImage.XOffset) + space space += atlasImage.XAdvance * spaceMult vertexCount += 4 uv := engine.IndexUV(ui.Font, rune) data[(index*12)+0] = xgrid data[(index*12)+1] = ygrid data[(index*12)+2] = 1 data[(index*12)+3] = (xratio) + xgrid data[(index*12)+4] = ygrid data[(index*12)+5] = 1 data[(index*12)+6] = (xratio) + xgrid data[(index*12)+7] = (yratio) + ygrid data[(index*12)+8] = 1 data[(index*12)+9] = xgrid data[(index*12)+10] = (yratio) + ygrid data[(index*12)+11] = 1 data[lt+(index*8)+0] = uv.U1 data[lt+(index*8)+1] = uv.V2 data[lt+(index*8)+2] = uv.U2 data[lt+(index*8)+3] = uv.V2 data[lt+(index*8)+4] = uv.U2 data[lt+(index*8)+5] = uv.V1 data[lt+(index*8)+6] = uv.U1 data[lt+(index*8)+7] = uv.V1 index++ } ui.width = w ui.height = h ui.vertexCount = vertexCount ui.texcoordsIndex = texcoordsIndex ui.buffer.Bind(gl.ARRAY_BUFFER) gl.BufferData(gl.ARRAY_BUFFER, len(data)*4, data, gl.STATIC_DRAW) }
func main() { if err := glfw.Init(); err != nil { fmt.Fprintf(os.Stderr, "%s\n", err.Error()) return } defer glfw.Terminate() glfw.OpenWindowHint(glfw.FsaaSamples, 4) glfw.OpenWindowHint(glfw.OpenGLVersionMajor, 3) glfw.OpenWindowHint(glfw.OpenGLVersionMinor, 3) glfw.OpenWindowHint(glfw.OpenGLProfile, glfw.OpenGLCoreProfile) if err := glfw.OpenWindow(1024, 768, 0, 0, 0, 0, 32, 0, glfw.Windowed); err != nil { fmt.Fprintf(os.Stderr, "%s\n", err.Error()) return } gl.Init() gl.GetError() // Ignore error glfw.SetWindowTitle("Tutorial 04") glfw.Enable(glfw.StickyKeys) gl.ClearColor(0., 0., 0.4, 0.) gl.Enable(gl.DEPTH_TEST) gl.DepthFunc(gl.LESS) vertexArray := gl.GenVertexArray() defer vertexArray.Delete() vertexArray.Bind() prog := helper.MakeProgram("TransformVertexShader.vertexshader", "ColorFragmentShader.fragmentshader") defer prog.Delete() matrixID := prog.GetUniformLocation("MVP") Projection := mathgl.Perspective(45.0, 4.0/3.0, 0.1, 100.0) View := mathgl.LookAt(4.0, 3.0, -3.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0) Model := mathgl.Ident4f() MVP := Projection.Mul4(View).Mul4(Model) // Remember, transform multiplication order is "backwards" vBufferData := [...]float32{ -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, -1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, -1.0, 1.0, -1.0, 1.0, -1.0, -1.0, -1.0, 1.0, -1.0, -1.0, 1.0, 1.0, -1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, -1.0, 1.0, -1.0, 1.0, -1.0, 1.0, -1.0, -1.0, 1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, -1.0, -1.0, 1.0, 1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, 1.0, 1.0, -1.0, 1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, 1.0, -1.0, 1.0, 1.0, 1.0, -1.0, 1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, 1.0, 1.0, 1.0, -1.0, 1.0} colorBufferData := [...]float32{ 0.583, 0.771, 0.014, 0.609, 0.115, 0.436, 0.327, 0.483, 0.844, 0.822, 0.569, 0.201, 0.435, 0.602, 0.223, 0.310, 0.747, 0.185, 0.597, 0.770, 0.761, 0.559, 0.436, 0.730, 0.359, 0.583, 0.152, 0.483, 0.596, 0.789, 0.559, 0.861, 0.639, 0.195, 0.548, 0.859, 0.014, 0.184, 0.576, 0.771, 0.328, 0.970, 0.406, 0.615, 0.116, 0.676, 0.977, 0.133, 0.971, 0.572, 0.833, 0.140, 0.616, 0.489, 0.997, 0.513, 0.064, 0.945, 0.719, 0.592, 0.543, 0.021, 0.978, 0.279, 0.317, 0.505, 0.167, 0.620, 0.077, 0.347, 0.857, 0.137, 0.055, 0.953, 0.042, 0.714, 0.505, 0.345, 0.783, 0.290, 0.734, 0.722, 0.645, 0.174, 0.302, 0.455, 0.848, 0.225, 0.587, 0.040, 0.517, 0.713, 0.338, 0.053, 0.959, 0.120, 0.393, 0.621, 0.362, 0.673, 0.211, 0.457, 0.820, 0.883, 0.371, 0.982, 0.099, 0.879} //elBufferData := [...]uint8{0, 1, 2} // Not sure why this is here vertexBuffer := gl.GenBuffer() defer vertexBuffer.Delete() vertexBuffer.Bind(gl.ARRAY_BUFFER) gl.BufferData(gl.ARRAY_BUFFER, len(vBufferData)*4, &vBufferData, gl.STATIC_DRAW) colorBuffer := gl.GenBuffer() defer colorBuffer.Delete() colorBuffer.Bind(gl.ARRAY_BUFFER) gl.BufferData(gl.ARRAY_BUFFER, len(colorBufferData)*4, &colorBufferData, gl.STATIC_DRAW) // Equivalent to a do... while for ok := true; ok; ok = (glfw.Key(glfw.KeyEsc) != glfw.KeyPress && glfw.WindowParam(glfw.Opened) == gl.TRUE) { gl.Clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT) prog.Use() matrixID.UniformMatrix4fv(false, MVP) vertexAttrib := gl.AttribLocation(0) vertexAttrib.EnableArray() vertexBuffer.Bind(gl.ARRAY_BUFFER) vertexAttrib.AttribPointer(3, gl.FLOAT, false, 0, nil) colorAttrib := gl.AttribLocation(1) colorAttrib.EnableArray() colorBuffer.Bind(gl.ARRAY_BUFFER) colorAttrib.AttribPointer(3, gl.FLOAT, false, 0, nil) gl.DrawArrays(gl.TRIANGLES, 0, 12*3) vertexAttrib.DisableArray() colorAttrib.DisableArray() glfw.SwapBuffers() } }
// buffer buffers the mesh data on the GPU. // This calls glBufferData or glBufferSubData where appropriate. func (a *Attr) buffer() { switch v := a.data.(type) { case []int8: size := len(v) * a.stride if size != a.gpuSize { gl.BufferData(a.target, size, v, a.usage) a.gpuSize = size } else { gl.BufferSubData(a.target, 0, size, v) } case []uint8: size := len(v) * a.stride if size != a.gpuSize { gl.BufferData(a.target, size, v, a.usage) a.gpuSize = size } else { gl.BufferSubData(a.target, 0, size, v) } case []int16: size := len(v) * a.stride if size != a.gpuSize { gl.BufferData(a.target, size, v, a.usage) a.gpuSize = size } else { gl.BufferSubData(a.target, 0, size, v) } case []uint16: size := len(v) * a.stride if size != a.gpuSize { gl.BufferData(a.target, size, v, a.usage) a.gpuSize = size } else { gl.BufferSubData(a.target, 0, size, v) } case []int32: size := len(v) * a.stride if size != a.gpuSize { gl.BufferData(a.target, size, v, a.usage) a.gpuSize = size } else { gl.BufferSubData(a.target, 0, size, v) } case []uint32: size := len(v) * a.stride if size != a.gpuSize { gl.BufferData(a.target, size, v, a.usage) a.gpuSize = size } else { gl.BufferSubData(a.target, 0, size, v) } case []float32: size := len(v) * a.stride if size != a.gpuSize { gl.BufferData(a.target, size, v, a.usage) a.gpuSize = size } else { gl.BufferSubData(a.target, 0, size, v) } case []float64: size := len(v) * a.stride if size != a.gpuSize { gl.BufferData(a.target, size, v, a.usage) a.gpuSize = size } else { gl.BufferSubData(a.target, 0, size, v) } } a.invalid = false }
func main() { if err := glfw.Init(); err != nil { fmt.Fprintf(os.Stderr, "%s\n", err.Error()) return } defer glfw.Terminate() glfw.OpenWindowHint(glfw.FsaaSamples, 4) glfw.OpenWindowHint(glfw.OpenGLVersionMajor, 3) glfw.OpenWindowHint(glfw.OpenGLVersionMinor, 3) glfw.OpenWindowHint(glfw.OpenGLProfile, glfw.OpenGLCoreProfile) if err := glfw.OpenWindow(1024, 768, 0, 0, 0, 0, 32, 0, glfw.Windowed); err != nil { fmt.Fprintf(os.Stderr, "%s\n", err.Error()) return } //gl.GlewExperimental(true) gl.Init() // Can't find gl.GLEW_OK or any variation, not sure how to check if this worked gl.GetError() // ignore error, since we're telling it to use CoreProfile above, we get "invalid enumerant" (GLError 1280) which freaks the OpenGLSentinel out // With go-gl we also apparently can't set glewExperimental glfw.SetWindowTitle("Tutorial 05") glfw.Enable(glfw.StickyKeys) gl.ClearColor(0., 0., 0.4, 0.) gl.Enable(gl.DEPTH_TEST) gl.DepthFunc(gl.LESS) vertexArray := gl.GenVertexArray() defer vertexArray.Delete() vertexArray.Bind() prog := helper.MakeProgram("TransformVertexShader.vertexshader", "TextureFragmentShader.fragmentshader") defer prog.Delete() matrixID := prog.GetUniformLocation("MVP") Projection := mathgl.Perspective(45.0, 4.0/3.0, 0.1, 100.0) View := mathgl.LookAt(4.0, 3.0, 3.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0) Model := mathgl.Ident4f() MVP := Projection.Mul4(View).Mul4(Model) // Remember, transform multiplication order is "backwards" texture := helper.MakeTextureFromTGA("uvtemplate.tga") defer texture.Delete() texSampler := prog.GetUniformLocation("myTextureSampler") vBufferData := [...]float32{ -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, -1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, -1.0, 1.0, -1.0, 1.0, -1.0, -1.0, -1.0, 1.0, -1.0, -1.0, 1.0, 1.0, -1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, -1.0, 1.0, -1.0, 1.0, -1.0, 1.0, -1.0, -1.0, 1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0, -1.0, -1.0, 1.0, 1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, 1.0, 1.0, -1.0, 1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, -1.0, 1.0, -1.0, 1.0, 1.0, 1.0, -1.0, 1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, 1.0, 1.0, 1.0, -1.0, 1.0} uvBufferData := [...]float32{ 0.000059, 1.0 - 0.000004, 0.000103, 1.0 - 0.336048, 0.335973, 1.0 - 0.335903, 1.000023, 1.0 - 0.000013, 0.667979, 1.0 - 0.335851, 0.999958, 1.0 - 0.336064, 0.667979, 1.0 - 0.335851, 0.336024, 1.0 - 0.671877, 0.667969, 1.0 - 0.671889, 1.000023, 1.0 - 0.000013, 0.668104, 1.0 - 0.000013, 0.667979, 1.0 - 0.335851, 0.000059, 1.0 - 0.000004, 0.335973, 1.0 - 0.335903, 0.336098, 1.0 - 0.000071, 0.667979, 1.0 - 0.335851, 0.335973, 1.0 - 0.335903, 0.336024, 1.0 - 0.671877, 1.000004, 1.0 - 0.671847, 0.999958, 1.0 - 0.336064, 0.667979, 1.0 - 0.335851, 0.668104, 1.0 - 0.000013, 0.335973, 1.0 - 0.335903, 0.667979, 1.0 - 0.335851, 0.335973, 1.0 - 0.335903, 0.668104, 1.0 - 0.000013, 0.336098, 1.0 - 0.000071, 0.000103, 1.0 - 0.336048, 0.000004, 1.0 - 0.671870, 0.336024, 1.0 - 0.671877, 0.000103, 1.0 - 0.336048, 0.336024, 1.0 - 0.671877, 0.335973, 1.0 - 0.335903, 0.667969, 1.0 - 0.671889, 1.000004, 1.0 - 0.671847, 0.667979, 1.0 - 0.335851} vertexBuffer := gl.GenBuffer() defer vertexBuffer.Delete() vertexBuffer.Bind(gl.ARRAY_BUFFER) gl.BufferData(gl.ARRAY_BUFFER, len(vBufferData)*4, &vBufferData, gl.STATIC_DRAW) uvBuffer := gl.GenBuffer() defer uvBuffer.Delete() uvBuffer.Bind(gl.ARRAY_BUFFER) gl.BufferData(gl.ARRAY_BUFFER, len(uvBufferData)*4, &uvBufferData, gl.STATIC_DRAW) // Equivalent to a do... while for ok := true; ok; ok = (glfw.Key(glfw.KeyEsc) != glfw.KeyPress && glfw.WindowParam(glfw.Opened) == gl.TRUE) { func() { gl.Clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT) prog.Use() defer gl.ProgramUnuse() matrixID.UniformMatrix4fv(false, MVP) gl.ActiveTexture(gl.TEXTURE0) texture.Bind(gl.TEXTURE_2D) defer texture.Unbind(gl.TEXTURE_2D) texSampler.Uniform1i(0) vertexAttrib := gl.AttribLocation(0) vertexAttrib.EnableArray() defer vertexAttrib.DisableArray() vertexBuffer.Bind(gl.ARRAY_BUFFER) defer vertexBuffer.Unbind(gl.ARRAY_BUFFER) vertexAttrib.AttribPointer(3, gl.FLOAT, false, 0, nil) uvAttrib := gl.AttribLocation(1) uvAttrib.EnableArray() defer uvAttrib.DisableArray() uvBuffer.Bind(gl.ARRAY_BUFFER) defer uvBuffer.Unbind(gl.ARRAY_BUFFER) uvAttrib.AttribPointer(2, gl.FLOAT, false, 0, nil) gl.DrawArrays(gl.TRIANGLES, 0, 12*3) glfw.SwapBuffers() }() // Defers unbinds and disables to here, end of the loop } }
func main() { runtime.LockOSThread() if !glfw.Init() { fmt.Fprintf(os.Stderr, "Can't open GLFW") return } defer glfw.Terminate() glfw.WindowHint(glfw.Samples, 4) glfw.WindowHint(glfw.ContextVersionMajor, 3) glfw.WindowHint(glfw.ContextVersionMinor, 3) glfw.WindowHint(glfw.OpenglProfile, glfw.OpenglCoreProfile) glfw.WindowHint(glfw.OpenglForwardCompatible, glfw.True) // needed for macs window, err := glfw.CreateWindow(1024, 768, "Tutorial 2", nil, nil) if err != nil { fmt.Fprintf(os.Stderr, "%v\n", err) return } window.MakeContextCurrent() gl.Init() gl.GetError() // Ignore error window.SetInputMode(glfw.StickyKeys, 1) gl.ClearColor(0., 0., 0.4, 0.) vBufferData := [...]float32{ -1., -1., 0., 1., -1., 0., 0., 1., 0.} vertexArray := gl.GenVertexArray() vertexArray.Bind() prog := helper.MakeProgram("SimpleVertexShader.vertexshader", "SimpleFragmentShader.fragmentshader") buffer := gl.GenBuffer() buffer.Bind(gl.ARRAY_BUFFER) gl.BufferData(gl.ARRAY_BUFFER, len(vBufferData)*4, &vBufferData[0], gl.STATIC_DRAW) // Equivalent to a do... while for ok := true; ok; ok = (window.GetKey(glfw.KeyEscape) != glfw.Press && !window.ShouldClose()) { gl.Clear(gl.COLOR_BUFFER_BIT) prog.Use() attribLoc := gl.AttribLocation(0) attribLoc.EnableArray() buffer.Bind(gl.ARRAY_BUFFER) attribLoc.AttribPointer(3, gl.FLOAT, false, 0, nil) gl.DrawArrays(gl.TRIANGLES, 0, 3) attribLoc.DisableArray() window.SwapBuffers() glfw.PollEvents() } }
func main() { runtime.LockOSThread() if !glfw.Init() { fmt.Fprintf(os.Stderr, "Can't open GLFW") return } defer glfw.Terminate() glfw.WindowHint(glfw.Samples, 4) glfw.WindowHint(glfw.ContextVersionMajor, 3) glfw.WindowHint(glfw.ContextVersionMinor, 3) glfw.WindowHint(glfw.OpenglProfile, glfw.OpenglCoreProfile) glfw.WindowHint(glfw.OpenglForwardCompatible, glfw.True) // needed for macs window, err := glfw.CreateWindow(1024, 768, "Tutorial 7", nil, nil) if err != nil { fmt.Fprintf(os.Stderr, "%v\n", err) return } window.MakeContextCurrent() gl.Init() gl.GetError() // Ignore error window.SetInputMode(glfw.StickyKeys, 1) window.SetCursorPosition(1024/2, 768/2) window.SetInputMode(glfw.Cursor, glfw.CursorHidden) gl.ClearColor(0., 0., 0.4, 0.) gl.Enable(gl.DEPTH_TEST) gl.DepthFunc(gl.LESS) gl.Enable(gl.CULL_FACE) camera := input.NewCamera(window) vertexArray := gl.GenVertexArray() defer vertexArray.Delete() vertexArray.Bind() prog := helper.MakeProgram("TransformVertexShader.vertexshader", "TextureFragmentShader.fragmentshader") defer prog.Delete() matrixID := prog.GetUniformLocation("MVP") texture, err := helper.TextureFromDDS("uvmap.DDS") if err != nil { fmt.Println("Couldn't load texture") return } defer texture.Delete() texSampler := prog.GetUniformLocation("myTextureSampler") meshObj := objloader.LoadObject("cube.obj", true) vertices, uvs := meshObj.Vertices, meshObj.UVs vertexBuffer := gl.GenBuffer() defer vertexBuffer.Delete() vertexBuffer.Bind(gl.ARRAY_BUFFER) gl.BufferData(gl.ARRAY_BUFFER, len(vertices)*3*4, vertices, gl.STATIC_DRAW) uvBuffer := gl.GenBuffer() defer uvBuffer.Delete() uvBuffer.Bind(gl.ARRAY_BUFFER) // UV doesn't seem to care gl.BufferData(gl.ARRAY_BUFFER, len(uvs)*2*4, uvs, gl.STATIC_DRAW) // Equivalent to a do... while for ok := true; ok; ok = (window.GetKey(glfw.KeyEscape) != glfw.Press && !window.ShouldClose()) { func() { gl.Clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT) prog.Use() defer gl.ProgramUnuse() view, proj := camera.ComputeViewPerspective() model := mgl32.Ident4() MVP := proj.Mul4(view).Mul4(model) matrixID.UniformMatrix4fv(false, MVP) gl.ActiveTexture(gl.TEXTURE0) texture.Bind(gl.TEXTURE_2D) defer texture.Unbind(gl.TEXTURE_2D) texSampler.Uniform1i(0) vertexAttrib := gl.AttribLocation(0) vertexAttrib.EnableArray() defer vertexAttrib.DisableArray() vertexBuffer.Bind(gl.ARRAY_BUFFER) defer vertexBuffer.Unbind(gl.ARRAY_BUFFER) vertexAttrib.AttribPointer(3, gl.FLOAT, false, 0, nil) uvAttrib := gl.AttribLocation(1) uvAttrib.EnableArray() defer uvAttrib.DisableArray() uvBuffer.Bind(gl.ARRAY_BUFFER) defer uvBuffer.Unbind(gl.ARRAY_BUFFER) uvAttrib.AttribPointer(2, gl.FLOAT, false, 0, nil) gl.DrawArrays(gl.TRIANGLES, 0, len(vertices)) window.SwapBuffers() glfw.PollEvents() }() // Defers unbinds and disables to here, end of the loop } }