Last active
August 21, 2016 14:10
-
-
Save mbertschler/8672365 to your computer and use it in GitHub Desktop.
I try to follow this tutorial http://www.opengl-tutorial.org/beginners-tutorials/tutorial-2-the-first-triangle/ but only get the dark blue background.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package main | |
import ( | |
"fmt" | |
"github.com/go-gl/gl" | |
glfw "github.com/go-gl/glfw3" | |
"time" | |
"runtime" | |
"os" | |
) | |
func init() { | |
runtime.LockOSThread() | |
} | |
var ( | |
vertexBuffer gl.Buffer | |
program gl.Program | |
vertexAttrib gl.AttribLocation | |
) | |
func setup() { | |
gl.ClearColor(0.0, 0.0, 0.4, 0.0) | |
makeProgram(vertexShaderSource,fragmentShaderSource) | |
vertexBufferData := []float32{ | |
-1,-1,0, | |
1,-1,0, | |
0, 1,0, | |
} | |
vertexBuffer = gl.GenBuffer() | |
vertexBuffer.Bind(gl.ARRAY_BUFFER) | |
gl.BufferData(gl.ARRAY_BUFFER, len(vertexBufferData)*4, vertexBufferData, gl.STATIC_DRAW) | |
} | |
func draw() { | |
gl.Clear(gl.COLOR_BUFFER_BIT) | |
program.Use() | |
// first attribute buffer: vertices | |
var vertexAttrib = program.GetAttribLocation("vertexPosition_modelspace") | |
vertexAttrib.EnableArray() | |
vertexBuffer.Bind(gl.ARRAY_BUFFER) | |
var f float32 = 0.0 | |
vertexAttrib.AttribPointer( | |
3, // size | |
gl.FLOAT, // type | |
false, // normalized | |
0, // stride | |
nil) // array buffer offset | |
// draw the triangle | |
gl.DrawArrays(gl.TRIANGLES, 0, 3) | |
vertexAttrib.DisableArray() | |
} | |
func main() { | |
glfw.SetErrorCallback(errorCallback) | |
if !glfw.Init() { | |
panic("Failed to initialize GLFW") | |
} | |
defer glfw.Terminate() | |
glfw.WindowHint(glfw.ContextVersionMajor, 2) | |
glfw.WindowHint(glfw.ContextVersionMinor, 0) | |
window, err := glfw.CreateWindow(400, 300, "Last Chance", nil, nil) | |
if err != nil { | |
panic(err) | |
} | |
window.SetFramebufferSizeCallback(resizeCallback) | |
window.SetKeyCallback(keyCallback) | |
window.MakeContextCurrent() | |
glfw.SwapInterval(1) | |
width, height := window.GetFramebufferSize() | |
resizeCallback(window, width, height) | |
gl.Init() | |
fmt.Println(gl.GetString(gl.VERSION)) | |
setup() | |
render := time.Tick(16 * time.Millisecond) | |
for !window.ShouldClose() { | |
glfw.PollEvents() | |
draw() | |
window.SwapBuffers() | |
<- render | |
} | |
} | |
// ====================== GLFW CALLBACKS ============================= | |
func keyCallback(window *glfw.Window, k glfw.Key, s int, action glfw.Action, mods glfw.ModifierKey) { | |
if action != glfw.Press { | |
return | |
} | |
switch glfw.Key(k) { | |
case glfw.KeyEscape: | |
window.SetShouldClose(true) | |
default: | |
return | |
} | |
} | |
func resizeCallback(window *glfw.Window, width, height int) { | |
wX,wY := window.GetSize() | |
fX,fY := window.GetFramebufferSize() | |
fmt.Println("resize: window",wX,wY,"framebuffer",fX,fY) | |
gl.Viewport(0, 0, width, height) | |
window.SwapBuffers() | |
} | |
func errorCallback(err glfw.ErrorCode, desc string) { | |
fmt.Printf("%v: %v\n", err, desc) | |
} | |
// ====================== SHADER SOURCES ============================= | |
var vertexShaderSource = `#version 120 | |
// Input vertex data, different for all executions of this shader. | |
attribute vec3 vertexPosition_modelspace; | |
void main(){ | |
gl_Position = vec4(vertexPosition_modelspace, 1.0); | |
}` | |
var fragmentShaderSource = `#version 120 | |
void main() | |
{ | |
// Output color = red | |
gl_FragColor = vec4(1,0,0,1); | |
}` | |
// ====================== MAKE PROGRAM ============================= | |
func makeProgram(vertexShaderSource, fragmentShaderSource string) { | |
// Create the shaders | |
VertexShader := gl.CreateShader(gl.VERTEX_SHADER) | |
FragmentShader := gl.CreateShader(gl.FRAGMENT_SHADER) | |
// Compile Vertex Shader | |
VertexShader.Source(vertexShaderSource) | |
VertexShader.Compile() | |
// Check Vertex Shader | |
status := VertexShader.Get(gl.COMPILE_STATUS) | |
infoLog := VertexShader.GetInfoLog() | |
if status != 1 { | |
fmt.Println("Vertex shader:",status,infoLog) | |
os.Exit(1) | |
} | |
// Compile Fragment Shader | |
FragmentShader.Source(fragmentShaderSource) | |
FragmentShader.Compile() | |
// Check Fragment Shader | |
status = FragmentShader.Get(gl.COMPILE_STATUS) | |
infoLog = FragmentShader.GetInfoLog() | |
if status != 1 { | |
fmt.Println("Fragment shader:",status,infoLog) | |
os.Exit(1) | |
} | |
// Link the program | |
program = gl.CreateProgram() | |
program.AttachShader(VertexShader) | |
program.AttachShader(FragmentShader) | |
program.Link() | |
// Check program | |
status = program.Get(gl.LINK_STATUS) | |
infoLog = program.GetInfoLog() | |
if status != 1 { | |
fmt.Println("Program:",status,infoLog) | |
os.Exit(1) | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Thanks for posting the code. Could you update line 53 with the correction you found? I believe you need to remove line 46 and change line 53 to
nil
. It's a good example of a triangle with OpenGL/GLFW in Go.I found gist from stackoverflow.