func programLoop(window *glfw.Window) { // the linked shader program determines how the data will be rendered shaders := compileShaders() shaderProgram := linkShaders(shaders) // VAO contains all the information about the data to be rendered VAO := createTriangleVAO() for !window.ShouldClose() { // poll events and call their registered callbacks glfw.PollEvents() // perform rendering gl.ClearColor(0.2, 0.5, 0.5, 1.0) gl.Clear(gl.COLOR_BUFFER_BIT) // draw loop gl.UseProgram(shaderProgram) // ensure the right shader program is being used gl.BindVertexArray(VAO) // bind data gl.DrawArrays(gl.TRIANGLES, 0, 3) // perform draw call gl.BindVertexArray(0) // unbind data (so we don't mistakenly use/modify it) // end of draw loop // swap in the rendered buffer window.SwapBuffers() } }
func drawLoop(win *glfw.Window, vao uint32, shader uint32) { for !win.ShouldClose() { gl.Clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT) gl.BindVertexArray(vao) gl.UseProgram(shader) gl.DrawArrays(gl.TRIANGLES, 0, 3) glfw.PollEvents() win.SwapBuffers() } }
func render(w *glfw.Window, program uint32) { gl.ClearColor(0, 0, 0, 1) gl.Clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT) gl.UseProgram(program) gl.BindVertexArray(firstSprite.GetVAO()) gl.DrawArrays(gl.TRIANGLES, 0, 6) //Swap buffers w.SwapBuffers() glfw.PollEvents() gl.UseProgram(0) }
func programLoop(window *glfw.Window) error { // the linked shader program determines how the data will be rendered vertShader, err := gfx.NewShaderFromFile("shaders/basic.vert", gl.VERTEX_SHADER) if err != nil { return err } fragShader, err := gfx.NewShaderFromFile("shaders/basic.frag", gl.FRAGMENT_SHADER) if err != nil { return err } program, err := gfx.NewProgram(vertShader, fragShader) if err != nil { return err } defer program.Delete() vertices := []float32{ // position // texture position -0.5, -0.5, -0.5, 0.0, 0.0, 0.5, -0.5, -0.5, 1.0, 0.0, 0.5, 0.5, -0.5, 1.0, 1.0, 0.5, 0.5, -0.5, 1.0, 1.0, -0.5, 0.5, -0.5, 0.0, 1.0, -0.5, -0.5, -0.5, 0.0, 0.0, -0.5, -0.5, 0.5, 0.0, 0.0, 0.5, -0.5, 0.5, 1.0, 0.0, 0.5, 0.5, 0.5, 1.0, 1.0, 0.5, 0.5, 0.5, 1.0, 1.0, -0.5, 0.5, 0.5, 0.0, 1.0, -0.5, -0.5, 0.5, 0.0, 0.0, -0.5, 0.5, 0.5, 1.0, 0.0, -0.5, 0.5, -0.5, 1.0, 1.0, -0.5, -0.5, -0.5, 0.0, 1.0, -0.5, -0.5, -0.5, 0.0, 1.0, -0.5, -0.5, 0.5, 0.0, 0.0, -0.5, 0.5, 0.5, 1.0, 0.0, 0.5, 0.5, 0.5, 1.0, 0.0, 0.5, 0.5, -0.5, 1.0, 1.0, 0.5, -0.5, -0.5, 0.0, 1.0, 0.5, -0.5, -0.5, 0.0, 1.0, 0.5, -0.5, 0.5, 0.0, 0.0, 0.5, 0.5, 0.5, 1.0, 0.0, -0.5, -0.5, -0.5, 0.0, 1.0, 0.5, -0.5, -0.5, 1.0, 1.0, 0.5, -0.5, 0.5, 1.0, 0.0, 0.5, -0.5, 0.5, 1.0, 0.0, -0.5, -0.5, 0.5, 0.0, 0.0, -0.5, -0.5, -0.5, 0.0, 1.0, -0.5, 0.5, -0.5, 0.0, 1.0, 0.5, 0.5, -0.5, 1.0, 1.0, 0.5, 0.5, 0.5, 1.0, 0.0, 0.5, 0.5, 0.5, 1.0, 0.0, -0.5, 0.5, 0.5, 0.0, 0.0, -0.5, 0.5, -0.5, 0.0, 1.0, } indices := []uint32{} VAO := createVAO(vertices, indices) texture0, err := gfx.NewTextureFromFile("../images/RTS_Crate.png", gl.CLAMP_TO_EDGE, gl.CLAMP_TO_EDGE) if err != nil { panic(err.Error()) } texture1, err := gfx.NewTextureFromFile("../images/trollface-transparent.png", gl.CLAMP_TO_EDGE, gl.CLAMP_TO_EDGE) if err != nil { panic(err.Error()) } cubePositions := [][]float32{ []float32{0.0, 0.0, -3.0}, []float32{2.0, 5.0, -15.0}, []float32{-1.5, -2.2, -2.5}, []float32{-3.8, -2.0, -12.3}, []float32{2.4, -0.4, -3.5}, []float32{-1.7, 3.0, -7.5}, []float32{1.3, -2.0, -2.5}, []float32{1.5, 2.0, -2.5}, []float32{1.5, 0.2, -1.5}, []float32{-1.3, 1.0, -1.5}, } gl.Enable(gl.DEPTH_TEST) for !window.ShouldClose() { // poll events and call their registered callbacks glfw.PollEvents() // background color gl.ClearColor(0.2, 0.5, 0.5, 1.0) gl.Clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT) // draw vertices program.Use() // set texture0 to uniform0 in the fragment shader texture0.Bind(gl.TEXTURE0) texture0.SetUniform(program.GetUniformLocation("ourTexture0")) // set texture1 to uniform1 in the fragment shader texture1.Bind(gl.TEXTURE1) texture1.SetUniform(program.GetUniformLocation("ourTexture1")) // update shader transform matrices // Create transformation matrices rotateX := (mgl32.Rotate3DX(mgl32.DegToRad(-60 * float32(glfw.GetTime())))) rotateY := (mgl32.Rotate3DY(mgl32.DegToRad(-60 * float32(glfw.GetTime())))) rotateZ := (mgl32.Rotate3DZ(mgl32.DegToRad(-60 * float32(glfw.GetTime())))) viewTransform := mgl32.Translate3D(0, 0, -3) projectTransform := mgl32.Perspective(mgl32.DegToRad(60), windowWidth/windowHeight, 0.1, 100.0) gl.UniformMatrix4fv(program.GetUniformLocation("view"), 1, false, &viewTransform[0]) gl.UniformMatrix4fv(program.GetUniformLocation("project"), 1, false, &projectTransform[0]) gl.UniformMatrix4fv(program.GetUniformLocation("worldRotateX"), 1, false, &rotateX[0]) gl.UniformMatrix4fv(program.GetUniformLocation("worldRotateY"), 1, false, &rotateY[0]) gl.UniformMatrix4fv(program.GetUniformLocation("worldRotateZ"), 1, false, &rotateZ[0]) gl.BindVertexArray(VAO) for _, pos := range cubePositions { worldTranslate := mgl32.Translate3D(pos[0], pos[1], pos[2]) worldTransform := (worldTranslate.Mul4(rotateX.Mul3(rotateY).Mul3(rotateZ).Mat4())) gl.UniformMatrix4fv(program.GetUniformLocation("world"), 1, false, &worldTransform[0]) gl.DrawArrays(gl.TRIANGLES, 0, 36) } // gl.DrawElements(gl.TRIANGLES, 36, gl.UNSIGNED_INT, unsafe.Pointer(nil)) gl.BindVertexArray(0) texture0.UnBind() texture1.UnBind() // end of draw loop // swap in the rendered buffer window.SwapBuffers() } return nil }
func programLoop(window *glfw.Window) { // the linked shader program determines how the data will be rendered vertexShader := compileShader(vertexShaderSource, gl.VERTEX_SHADER) fragmentShaderBlue := compileShader(fragmentShaderBlueSource, gl.FRAGMENT_SHADER) shaderProgramBlue := linkShaders([]uint32{vertexShader, fragmentShaderBlue}) fragmentShaderRed := compileShader(fragmentShaderRedSource, gl.FRAGMENT_SHADER) shaderProgramRed := linkShaders([]uint32{vertexShader, fragmentShaderRed}) // shader objects are not needed after they are linked into a program object gl.DeleteShader(vertexShader) gl.DeleteShader(fragmentShaderBlue) gl.DeleteShader(fragmentShaderRed) vertices1 := []float32{ 0.2, 0.2, 0.0, // top right 0.2, -0.8, 0.0, // bottom right -0.8, -0.8, 0.0, // bottom left -0.8, 0.2, 0.0, // top left } indices1 := []uint32{ 0, 1, 3, // first triangle 1, 2, 3, // second triangle } VAO1 := createTriangleVAO(vertices1, indices1) vertices2 := []float32{ 0.2, 0.6, 0.0, // top 0.6, -0.2, 0.0, // bottom right -0.2, -0.2, 0.0, // bottom left } indices2 := []uint32{ 0, 1, 2, // only triangle } VAO2 := createTriangleVAO(vertices2, indices2) for !window.ShouldClose() { // poll events and call their registered callbacks glfw.PollEvents() // perform rendering gl.ClearColor(0.2, 0.5, 0.5, 1.0) gl.Clear(gl.COLOR_BUFFER_BIT) // draw loop // draw rectangle gl.PolygonMode(gl.FRONT_AND_BACK, gl.LINE) gl.UseProgram(shaderProgramRed) gl.BindVertexArray(VAO1) gl.DrawElements(gl.TRIANGLES, 6, gl.UNSIGNED_INT, unsafe.Pointer(nil)) gl.BindVertexArray(0) // draw triangle gl.PolygonMode(gl.FRONT_AND_BACK, gl.FILL) gl.UseProgram(shaderProgramBlue) gl.BindVertexArray(VAO2) gl.DrawElements(gl.TRIANGLES, 3, gl.UNSIGNED_INT, unsafe.Pointer(nil)) gl.BindVertexArray(0) // end of draw loop // swap in the rendered buffer window.SwapBuffers() } }
func programLoop(window *glfw.Window) error { // the linked shader program determines how the data will be rendered vertShader, err := gfx.NewShaderFromFile("shaders/basic.vert", gl.VERTEX_SHADER) if err != nil { return err } fragShader, err := gfx.NewShaderFromFile("shaders/basic.frag", gl.FRAGMENT_SHADER) if err != nil { return err } shaderProgram, err := gfx.NewProgram(vertShader, fragShader) if err != nil { return err } defer shaderProgram.Delete() vertices := []float32{ // top 0.0, 0.5, 0.0, // position 1.0, 0.0, 0.0, // Color // bottom right 0.5, -0.5, 0.0, 0.0, 1.0, 0.0, // bottom left -0.5, -0.5, 0.0, 0.0, 0.0, 1.0, } indices := []uint32{ 0, 1, 2, // only triangle } VAO := createTriangleVAO(vertices, indices) for !window.ShouldClose() { // poll events and call their registered callbacks glfw.PollEvents() // perform rendering gl.ClearColor(0.2, 0.5, 0.5, 1.0) gl.Clear(gl.COLOR_BUFFER_BIT) // draw loop // draw triangle shaderProgram.Use() gl.BindVertexArray(VAO) gl.DrawElements(gl.TRIANGLES, 3, gl.UNSIGNED_INT, unsafe.Pointer(nil)) gl.BindVertexArray(0) // end of draw loop // swap in the rendered buffer window.SwapBuffers() } return nil }
func programLoop(window *glfw.Window) error { // the linked shader program determines how the data will be rendered vertShader, err := gfx.NewShaderFromFile("shaders/basic.vert", gl.VERTEX_SHADER) if err != nil { return err } fragShader, err := gfx.NewShaderFromFile("shaders/basic.frag", gl.FRAGMENT_SHADER) if err != nil { return err } shaderProgram, err := gfx.NewProgram(vertShader, fragShader) if err != nil { return err } defer shaderProgram.Delete() vertices := []float32{ // top left -0.75, 0.75, 0.0, // position 1.0, 0.0, 0.0, // Color 1.0, 0.0, // texture coordinates // top right 0.75, 0.75, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, // bottom right 0.75, -0.75, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, // bottom left -0.75, -0.75, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, } indices := []uint32{ // rectangle 0, 1, 2, // top triangle 0, 2, 3, // bottom triangle } VAO := createVAO(vertices, indices) texture0, err := gfx.NewTextureFromFile("../images/RTS_Crate.png", gl.CLAMP_TO_EDGE, gl.CLAMP_TO_EDGE) if err != nil { panic(err.Error()) } texture1, err := gfx.NewTextureFromFile("../images/trollface.png", gl.CLAMP_TO_EDGE, gl.CLAMP_TO_EDGE) if err != nil { panic(err.Error()) } for !window.ShouldClose() { // poll events and call their registered callbacks glfw.PollEvents() // background color gl.ClearColor(0.2, 0.5, 0.5, 1.0) gl.Clear(gl.COLOR_BUFFER_BIT) // draw vertices shaderProgram.Use() // set texture0 to uniform0 in the fragment shader texture0.Bind(gl.TEXTURE0) texture0.SetUniform(shaderProgram.GetUniformLocation("ourTexture0")) // set texture1 to uniform1 in the fragment shader texture1.Bind(gl.TEXTURE1) texture1.SetUniform(shaderProgram.GetUniformLocation("ourTexture1")) gl.BindVertexArray(VAO) gl.DrawElements(gl.TRIANGLES, 6, gl.UNSIGNED_INT, unsafe.Pointer(nil)) gl.BindVertexArray(0) texture0.UnBind() texture1.UnBind() // end of draw loop // swap in the rendered buffer window.SwapBuffers() } return nil }