func (r *GlowRenderer) Draw() (err error) { gl.UseProgram(r.shader) gl.Uniform1i(r.textureUnitLoc, 0) gl.BindBuffer(gl.ARRAY_BUFFER, r.coords) gl.EnableVertexAttribArray(r.positionLoc) gl.VertexAttribPointer(r.positionLoc, 3, gl.FLOAT, false, 5*4, gl.PtrOffset(0)) gl.EnableVertexAttribArray(r.textureLoc) gl.VertexAttribPointer(r.textureLoc, 2, gl.FLOAT, false, 5*4, gl.PtrOffset(3*4)) gl.Uniform1i(r.blurAmountLoc, int32(r.blur)) gl.Uniform1f(r.blurScaleLoc, r.scale) gl.Uniform1f(r.blurStrengthLoc, r.strength) gl.Uniform2f(r.bufferDimensionsLoc, float32(r.width), float32(r.height)) gl.BindFramebuffer(gl.FRAMEBUFFER, r.BlurFb) gl.Viewport(0, 0, int32(r.width), int32(r.height)) gl.ActiveTexture(gl.TEXTURE0) gl.BindTexture(gl.TEXTURE_2D, r.GlowTex) gl.Uniform1i(r.orientationLoc, 0) gl.DrawArrays(gl.TRIANGLE_STRIP, 0, 4) gl.BindFramebuffer(gl.FRAMEBUFFER, 0) gl.Viewport(0, 0, int32(r.oldwidth), int32(r.oldheight)) gl.BlendFunc(gl.ONE, gl.ONE) gl.BindTexture(gl.TEXTURE_2D, r.BlurTex) gl.Uniform1i(r.orientationLoc, 1) gl.DrawArrays(gl.TRIANGLE_STRIP, 0, 4) gl.BindBuffer(gl.ARRAY_BUFFER, 0) gl.BlendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA) return nil }
func (tr *TextRenderer) Draw(tex *Texture, x, y, scale float32) (err error) { gl.ActiveTexture(gl.TEXTURE0) if e := gl.GetError(); e != 0 { return fmt.Errorf("ERROR: %X", e) } gl.BindTexture(gl.TEXTURE_2D, tex.Texture) if e := gl.GetError(); e != 0 { return fmt.Errorf("ERROR: %X", e) } gl.Uniform3f(tr.ScaleLoc, float32(tex.Width)*scale, float32(tex.Height)*scale, 1) if e := gl.GetError(); e != 0 { return fmt.Errorf("ERROR: %X", e) } gl.Uniform3f(tr.TransLoc, x, y, 0) if e := gl.GetError(); e != 0 { return fmt.Errorf("ERROR: %X", e) } gl.DrawArrays(gl.TRIANGLE_STRIP, 0, 4) if e := gl.GetError(); e != 0 { return fmt.Errorf("ERROR: %X", e) } gl.BindBuffer(gl.ARRAY_BUFFER, 0) if e := gl.GetError(); e != 0 { return fmt.Errorf("ERROR: %X", e) } return nil }
//Fstri draws a fullscreen triangle such that it covers the entire screen with uv coordinates from [0,0]-[1,1] func Fstri() { fstri.vao.Bind() defer fstri.vao.Unbind() gl.EnableVertexAttribArray(0) fstri.pos.Bind(gl.ARRAY_BUFFER) gl.VertexAttribPointer(0, 2, gl.FLOAT, false, 0, nil) gl.EnableVertexAttribArray(1) fstri.uv.Bind(gl.ARRAY_BUFFER) gl.VertexAttribPointer(1, 2, gl.FLOAT, false, 0, nil) gl.DrawArrays(gl.TRIANGLES, 0, 3) }
func Draw() { // if len(layers) == 0 { // fmt.Println("layers empty!!!") // return // } // for _, layer := range layers { // vertexData := textureHash[layer] vertexData := &vertexDataTest // check to see if there are any vertices at all to draw if len(vertexData.vertexData) == 0 { return } // vertexData.Print() // vertexData := vertexDataTest //vertexData.Print() // BindBuffers(vertexData) // vertexData.Print() //gl.BufferSubData(gl.ARRAY_BUFFER, 0, len(vertexData.VertexData)*4, gl.Ptr(vertexData.VertexData)) // gl.BindBuffer(gl.ARRAY_BUFFER, vbo) gl.BufferData(gl.ARRAY_BUFFER, len(vertexData.vertexData)*4, gl.Ptr(vertexData.vertexData), gl.DYNAMIC_DRAW) // gl.BindBuffer(gl.ELEMENT_ARRAY_BUFFER, elementvbo) // gl.BufferData(gl.ELEMENT_ARRAY_BUFFER, len(vertexData.Elements)*4, gl.Ptr(vertexData.Elements), gl.DYNAMIC_DRAW) MVP := projectionM.Mul4(viewM) //.Mul4(Model) gl.UniformMatrix4fv(MVPid, 1, false, &MVP[0]) lightPos := mathgl.Vec3{0, 3, 10} lightintensities := mathgl.Vec3{1, .4, .2} gl.Uniform3f(lightpositionID, lightPos[0], lightPos[1], lightPos[2]) gl.Uniform3f(lightintensitiesID, lightintensities[0], lightintensities[1], lightintensities[2]) gl.Uniform3f(cameraPositionID, 0.0, 1.0, -1.0) // vertexData.Print() // gl.DrawElements(gl.TRIANGLES, int32(len(vertexData.Elements)), gl.UNSIGNED_INT, nil) // } numTriVerts := int32((len(vertexData.vertexData) / (int(NUM_ATTRIBUTES) * 2)) * 3) gl.DrawArrays(gl.TRIANGLES, 0, numTriVerts) ClearVertexData() }
func (c Context) DrawRectangle(x, y, w, h float32, color Color) { gl.UseProgram(c.program) model := mgl32.Translate3D(x, y, 0).Mul4(mgl32.Scale3D(w, h, 0)) modelUniform := gl.GetUniformLocation(c.program, gl.Str("model\x00")) gl.UniformMatrix4fv(modelUniform, 1, false, &model[0]) colorArray := []float32{color.B, color.G, color.R} colorUniform := gl.GetUniformLocation(c.program, gl.Str("color\x00")) gl.Uniform4fv(colorUniform, 1, &colorArray[0]) gl.DrawArrays(gl.TRIANGLES, 0, 6) }
func (r *BatchRenderer) Draw(batch *Batch, x, y, rot float32) error { batch.Texture.Bind() gl.BindBuffer(gl.ARRAY_BUFFER, batch.Buffer) gl.EnableVertexAttribArray(r.PositionLoc) gl.VertexAttribPointer(r.PositionLoc, 3, gl.FLOAT, false, 5*4, gl.PtrOffset(0)) gl.EnableVertexAttribArray(r.TextureLoc) gl.VertexAttribPointer(r.TextureLoc, 2, gl.FLOAT, false, 5*4, gl.PtrOffset(3*4)) m := mgl32.Translate3D(x, y, 0.0).Mul4(mgl32.HomogRotate3DZ(rot)) gl.UniformMatrix4fv(r.ModelViewLoc, 1, false, &m[0]) gl.Uniform2f(r.TexOffsetLoc, batch.textureOffset.X(), batch.textureOffset.Y()) gl.DrawArrays(gl.TRIANGLES, 0, int32(batch.Count)) gl.BindBuffer(gl.ARRAY_BUFFER, 0) return nil }
func (ps *ParticleSystem) Render(delta float64, VP glm.Mat4, camera glm.Vec3) { ps.time += delta //do update ps.gTime.Uniform1f(float32(ps.time) * 1000) ps.gDeltaTimeMillis.Uniform1f(float32(delta) * 1000) //bind the rand texture //m_randomTexture.Bind(RANDOM_TEXTURE_UNIT); gl.Enable(gl.RASTERIZER_DISCARD) ps.buffers[ps.currentVB].Bind(gl.ARRAY_BUFFER) ps.transformfeedbacks[ps.currentTFB].Bind() gl.EnableVertexAttribArray(0) gl.EnableVertexAttribArray(1) gl.EnableVertexAttribArray(2) gl.EnableVertexAttribArray(3) gl.VertexAttribPointer(0, 1, gl.FLOAT, false, int32(unsafe.Sizeof(Particle{})), unsafe.Pointer(uintptr(0))) gl.VertexAttribPointer(1, 3, gl.FLOAT, false, int32(unsafe.Sizeof(Particle{})), unsafe.Pointer(uintptr(4))) gl.VertexAttribPointer(2, 3, gl.FLOAT, false, int32(unsafe.Sizeof(Particle{})), unsafe.Pointer(uintptr(16))) gl.VertexAttribPointer(3, 1, gl.FLOAT, false, int32(unsafe.Sizeof(Particle{})), unsafe.Pointer(uintptr(28))) gl.BeginTransformFeedback(gl.POINTS) if ps.isFirst { gl.DrawArrays(gl.POINTS, 0, 1) ps.isFirst = false } else { gl.DrawTransformFeedback(gl.POINTS, uint32(ps.transformfeedbacks[ps.currentVB])) } gl.EndTransformFeedback() gl.DisableVertexAttribArray(0) gl.DisableVertexAttribArray(1) gl.DisableVertexAttribArray(2) gl.DisableVertexAttribArray(3) //do render ps.currentVB = ps.currentTFB ps.currentTFB = (ps.currentTFB + 1) & 0x1 }
// RenderString must be called on the render thread. x and y are the initial position of the pen, // in screen coordinates, and height is the height of a full line of text, in screen coordinates. func (d *Dictionary) RenderString(str string, x, y, height float64) { if str == "" { return } // No synchronization necessary because everything is run serially on the render thread anyway. if d.strs == nil { d.strs = make(map[string]strData) } data, ok := d.strs[str] if !ok { data = d.bindString(str) d.strs[str] = data } render.EnableShader("glop.font") defer render.EnableShader("") gl.ActiveTexture(gl.TEXTURE0) gl.BindTexture(gl.TEXTURE_2D, d.atlas.texture) location, _ := render.GetUniformLocation("glop.font", "tex") gl.Uniform1i(location, 0) gl.BindSampler(0, d.atlas.sampler) location, _ = render.GetUniformLocation("glop.font", "height") gl.Uniform1f(location, float32(height)) var viewport [4]int32 gl.GetIntegerv(gl.VIEWPORT, &viewport[0]) location, _ = render.GetUniformLocation("glop.font", "screen") gl.Uniform2f(location, float32(viewport[2]), float32(viewport[3])) location, _ = render.GetUniformLocation("glop.font", "pen") gl.Uniform2f(location, float32(x)+float32(viewport[0]), float32(y)+float32(viewport[1])) location, _ = render.GetUniformLocation("glop.font", "textColor") gl.Uniform3f(location, d.color[0], d.color[1], d.color[2]) gl.Enable(gl.BLEND) gl.BlendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA) gl.BindVertexArray(data.varrays[0]) gl.DrawArrays(gl.TRIANGLES, 0, data.count) }
func (r *EffectsRenderer) Draw() (err error) { gl.UseProgram(r.shader) gl.Uniform1i(r.textureUnitLoc, 0) gl.Uniform3f(r.colorLoc, r.Color[0], r.Color[1], r.Color[2]) gl.BindBuffer(gl.ARRAY_BUFFER, r.coords) gl.EnableVertexAttribArray(r.positionLoc) gl.VertexAttribPointer(r.positionLoc, 3, gl.FLOAT, false, 5*4, gl.PtrOffset(0)) gl.EnableVertexAttribArray(r.textureLoc) gl.VertexAttribPointer(r.textureLoc, 2, gl.FLOAT, false, 5*4, gl.PtrOffset(3*4)) gl.BindFramebuffer(gl.FRAMEBUFFER, 0) gl.Viewport(0, 0, int32(r.oldwidth), int32(r.oldheight)) gl.BlendFunc(gl.ONE, gl.ONE) gl.BindTexture(gl.TEXTURE_2D, r.texture) gl.DrawArrays(gl.TRIANGLE_STRIP, 0, 4) gl.BindBuffer(gl.ARRAY_BUFFER, 0) gl.BlendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA) return nil }
func (r *Framerate) Render(camera *core.Camera) (err error) { r.data.Sample() var ( modelView = mgl32.Ident4() dataBytes int = int(r.data.Count) * int(r.stride) ) gl.Uniform4f(r.locColor, 255.0/255.0, 0, 0, 255.0/255.0) gl.UniformMatrix4fv(r.locModelView, 1, false, &modelView[0]) gl.UniformMatrix4fv(r.locProjection, 1, false, &camera.Projection[0]) if dataBytes > r.vboBytes { r.vboBytes = dataBytes gl.BufferData(gl.ARRAY_BUFFER, dataBytes, gl.Ptr(r.data.Points), gl.STREAM_DRAW) } else { gl.BufferSubData(gl.ARRAY_BUFFER, 0, dataBytes, gl.Ptr(r.data.Points)) } gl.DrawArrays(gl.POINTS, 0, r.data.Count) if e := gl.GetError(); e != 0 { err = fmt.Errorf("ERROR: OpenGL error %X", e) } return }
func main() { vertices, normals := obj.Parse(os.Args[1]) // initialize GLFW if err := glfw.Init(); err != nil { panic(err) } defer glfw.Terminate() // set opengl core profile 3.3 glfw.WindowHint(glfw.ContextVersionMajor, 3) glfw.WindowHint(glfw.ContextVersionMinor, 3) glfw.WindowHint(glfw.OpenGLProfile, glfw.OpenGLCoreProfile) glfw.WindowHint(glfw.OpenGLForwardCompatible, glfw.True) window, err := glfw.CreateWindow(640, 480, "GOpenGL", nil, nil) if err != nil { panic(err) } window.MakeContextCurrent() // initialise OpenGL library if err := gl.Init(); err != nil { panic(err) } // link program from shaders program, err := newProgram("vertex.glsl", "fragment.glsl") if err != nil { panic(err) } gl.UseProgram(program) // vertex attribute object holds links between attributes and vbo var vao uint32 gl.GenVertexArrays(1, &vao) gl.BindVertexArray(vao) // vertex buffer with per-vertex data var vbo [2]uint32 gl.GenBuffers(2, &vbo[0]) // position data gl.BindBuffer(gl.ARRAY_BUFFER, vbo[0]) gl.BufferData(gl.ARRAY_BUFFER, len(vertices)*4, gl.Ptr(vertices), gl.STATIC_DRAW) // set up position attribute with layout of vertices posAttrib := uint32(gl.GetAttribLocation(program, gl.Str("position\x00"))) gl.VertexAttribPointer(posAttrib, 3, gl.FLOAT, false, 3*4, gl.PtrOffset(0)) gl.EnableVertexAttribArray(posAttrib) // normal data gl.BindBuffer(gl.ARRAY_BUFFER, vbo[1]) gl.BufferData(gl.ARRAY_BUFFER, len(normals)*4, gl.Ptr(normals), gl.STATIC_DRAW) normAttrib := uint32(gl.GetAttribLocation(program, gl.Str("normal\x00"))) gl.VertexAttribPointer(normAttrib, 3, gl.FLOAT, false, 3*4, gl.PtrOffset(0)) gl.EnableVertexAttribArray(normAttrib) uniModel := gl.GetUniformLocation(program, gl.Str("model\x00")) uniView := gl.GetUniformLocation(program, gl.Str("view\x00")) uniProj := gl.GetUniformLocation(program, gl.Str("proj\x00")) matView := mgl32.LookAt(2.0, 2.0, 2.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0) gl.UniformMatrix4fv(uniView, 1, false, &matView[0]) matProj := mgl32.Perspective(mgl32.DegToRad(45.0), 640.0/480.0, 1.0, 10.0) gl.UniformMatrix4fv(uniProj, 1, false, &matProj[0]) uniLightDir := gl.GetUniformLocation(program, gl.Str("lightDir\x00")) uniLightCol := gl.GetUniformLocation(program, gl.Str("lightCol\x00")) gl.Uniform3f(uniLightDir, -0.5, 0.0, -1.0) gl.Uniform3f(uniLightCol, 0.0, 0.5, 0.5) startTime := glfw.GetTime() gl.Enable(gl.DEPTH_TEST) gl.ClearColor(1.0, 1.0, 1.0, 1.0) for !window.ShouldClose() { // clear buffer gl.Clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT) matRot := mgl32.HomogRotate3DZ(float32(glfw.GetTime() - startTime)) gl.UniformMatrix4fv(uniModel, 1, false, &matRot[0]) gl.DrawArrays(gl.TRIANGLES, 0, int32(len(vertices))) window.SwapBuffers() glfw.PollEvents() } }
func DrawTriangleArray(first int32, count int32) { gl.DrawArrays(gl.TRIANGLES, first, count) Check() }
//Draw draws this object func (vertexArray VertexArray) Draw() { gl.DrawArrays(gl.TRIANGLES, 0, 6*2*3) }