func createShader(name string, shaderType int) (gl.Shader, os.Error) { data, err := fileRead(name) if err != nil { return 0, err } if len(data) == 0 { return 0, os.NewError("No shader code.") } var shader gl.Shader switch shaderType { case VertexShaderType: shader = gl.CreateShader(gl.VERTEX_SHADER) case FragmentShaderType: shader = gl.CreateShader(gl.FRAGMENT_SHADER) default: return 0, os.NewError("Unknown ShaderType.") } shader.Source(data) shader.Compile() // Similar to print_log in the C code example infoLog := shader.GetInfoLog() if len(infoLog) != 0 { shader.Delete() return 0, err } errNum := gl.GetError() if errNum != 0 { return 0, os.NewError(fmt.Sprintf("Error code: %d", errNum)) } return shader, nil }
func uploadTexture_NRGBA32(img *image.NRGBA) gl.Texture { b := img.Bounds() data := make([]uint8, b.Max.X*b.Max.Y*4) for y := 0; y < b.Max.Y; y++ { for x := 0; x < b.Max.X; x++ { p := &img.Pix[y*img.Stride+x] offset := y*b.Max.X*4 + x*4 data[offset+0] = p.R data[offset+1] = p.G data[offset+2] = p.B data[offset+3] = p.A } } id := gl.GenTexture() id.Bind(gl.TEXTURE_2D) gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR) gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR) gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE) gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE) gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_R, gl.CLAMP_TO_EDGE) gl.TexImage2D(gl.TEXTURE_2D, 0, gl.RGBA, b.Max.X, b.Max.Y, 0, gl.RGBA, data) if gl.GetError() != gl.NO_ERROR { id.Delete() panic(os.NewError("Failed to load a texture")) return 0 } return id }
func main() { // We need to lock the goroutine to one thread due time.Ticker runtime.LockOSThread() var err os.Error err = glfw.Init() if err != nil { fmt.Printf("GLFW: %s\n", err) return } defer glfw.Terminate() // You could probably change the required versions down glfw.OpenWindowHint(glfw.OpenGLVersionMajor, 3) glfw.OpenWindowHint(glfw.OpenGLVersionMinor, 3) glfw.OpenWindowHint(glfw.OpenGLProfile, 1) // Open Window with 8 bit Alpha err = glfw.OpenWindow(ScreenWidth, ScreenHeight, 0, 0, 0, 8, 0, 0, glfw.Windowed) if err != nil { fmt.Printf("GLFW: %s\n", err) return } defer glfw.CloseWindow() glfw.SetWindowTitle(WindowTitle) major, minor, rev := glfw.GLVersion() if major < 3 { fmt.Printf("Error your graphic card does not support OpenGL 3.3\n Your GL-Version is: %d, %d, %d\n", major, minor, rev) fmt.Println("You can try to lower the settings in glfw.OpenWindowHint(glfw.OpenGLVersionMajor/Minor.") } initStatus := gl.Init() // Init glew if initStatus != 0 { fmt.Printf("Error-code: %d Init-Status: %d\n", gl.GetError(), initStatus) } // Enable transparency in OpenGL gl.Enable(gl.BLEND) gl.BlendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA) initResources() // We are limiting the calls to display() (frames per second) to 60. This prevents the 100% cpu usage. ticker := time.NewTicker(int64(second) / 60) // max 60 fps for { <-ticker.C move := float32(math.Sin(glfw.Time())) angle := float32(glfw.Time()) matrix = math3d.MakeTranslationMatrix(move, 0.0, 0.0) matrix = matrix.Multiply(math3d.MakeZRotationMatrix(angle)).Transposed() display() } // Free resources free() runtime.UnlockOSThread() }
func main() { var err os.Error err = glfw.Init() if err != nil { fmt.Printf("GLFW: %s\n", err) return } defer glfw.Terminate() glfw.OpenWindowHint(glfw.WindowNoResize, 1) glfw.OpenWindowHint(glfw.OpenGLDebugContext, 1) // You could probably change the required versions down glfw.OpenWindowHint(glfw.OpenGLVersionMajor, 3) glfw.OpenWindowHint(glfw.OpenGLVersionMinor, 3) glfw.OpenWindowHint(glfw.OpenGLProfile, 1) // Open Window with 8 bit Alpha err = glfw.OpenWindow(ScreenWidth, ScreenHeight, 0, 0, 0, 8, 0, 0, glfw.Windowed) if err != nil { fmt.Printf("GLFW: %s\n", err) return } defer glfw.CloseWindow() glfw.SetWindowTitle(WindowTitle) major, minor, rev := glfw.GLVersion() if major < 3 { fmt.Printf("Error your graphic card does not support OpenGL 3.3\n Your GL-Version is: %d, %d, %d\n", major, minor, rev) fmt.Println("You can try to lower the settings in glfw.OpenWindowHint(glfw.OpenGLVersionMajor/Minor.") } initStatus := gl.Init() // Init glew if initStatus != 0 { fmt.Printf("Error-code: %d Init-Status: %d\n", gl.GetError(), initStatus) } // Enable transparency in OpenGL gl.Enable(gl.BLEND) gl.BlendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA) initResources() for { display() } // Free resources free() }
func uploadTexture_RGBA32(w, h int, data []byte) gl.Texture { id := gl.GenTexture() id.Bind(gl.TEXTURE_2D) gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR) gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR) gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE) gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE) gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_R, gl.CLAMP_TO_EDGE) gl.TexImage2D(gl.TEXTURE_2D, 0, gl.RGBA, int(w), int(h), 0, gl.RGBA, data) if gl.GetError() != gl.NO_ERROR { id.Delete() panic("Failed to load a texture") return 0 } return id }
func uploadTexture_RGBA32(w, h int, data []byte) gl.GLuint { var id gl.GLuint gl.GenTextures(1, &id) gl.BindTexture(gl.TEXTURE_2D, id) gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR) gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR) gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE) gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE) gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_R, gl.CLAMP_TO_EDGE) gl.TexImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.GLsizei(w), gl.GLsizei(h), 0, gl.RGBA, gl.UNSIGNED_BYTE, unsafe.Pointer(&data[0])) if gl.GetError() != gl.NO_ERROR { gl.DeleteTextures(1, &id) panic("Failed to load a texture") return 0 } return id }
func main() { // We need to lock the goroutine to one thread due time.Ticker runtime.LockOSThread() var err os.Error err = glfw.Init() if err != nil { fmt.Printf("GLFW: %s\n", err) return } defer glfw.Terminate() // You could probably change the required versions down glfw.OpenWindowHint(glfw.OpenGLVersionMajor, 3) glfw.OpenWindowHint(glfw.OpenGLVersionMinor, 3) glfw.OpenWindowHint(glfw.OpenGLProfile, 1) // Open Window with 8 bit Alpha err = glfw.OpenWindow(ScreenWidth, ScreenHeight, 0, 0, 0, 8, 8, 0, glfw.Windowed) if err != nil { fmt.Printf("GLFW: %s\n", err) return } defer glfw.CloseWindow() glfw.SetWindowTitle(WindowTitle) glfw.SetWindowSizeCallback(onResize) major, minor, rev := glfw.GLVersion() if major < 3 { fmt.Printf("Error your graphic card does not support OpenGL 3.3\n Your GL-Version is: %d, %d, %d\n", major, minor, rev) fmt.Println("You can try to lower the settings in glfw.OpenWindowHint(glfw.OpenGLVersionMajor/Minor.") } initStatus := gl.Init() // Init glew if initStatus != 0 { fmt.Printf("Error-code: %d Init-Status: %d\n", gl.GetError(), initStatus) } // Enable transparency in OpenGL gl.Enable(gl.BLEND) gl.Enable(gl.DEPTH_TEST) //gl.DepthFunc(gl.LESS) gl.BlendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA) initResources() // We are limiting the calls to display() (frames per second) to 60. This prevents the 100% cpu usage. ticker := time.NewTicker(int64(second) / 60) // max 60 fps for { <-ticker.C angle := float32(glfw.Time()) anim := math3d.MakeYRotationMatrix(angle) model := math3d.MakeTranslationMatrix(0, 0, -4) view := math3d.MakeLookAtMatrix(math3d.Vector3{0, 2, 0}, math3d.Vector3{0, 0, -4}, math3d.Vector3{0, 1, 0}) projection := math3d.MakePerspectiveMatrix(45, float32(ScreenWidth)/float32(ScreenHeight), 0.1, 10.0) matrix = math3d.MakeIdentity().Multiply(projection).Multiply(view).Multiply(model).Multiply(anim) program.Use() uniformMTransform.UniformMatrix4fv(1, false, matrix.Transposed()) display() } // Free resources free() runtime.UnlockOSThread() }