Advertisement
Guest User

Untitled

a guest
Nov 21st, 2018
389
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Go 3.32 KB | None | 0 0
  1. package main
  2.  
  3. import (
  4.     "fmt"
  5.     "log"
  6.     "runtime"
  7.     "strings"
  8.  
  9.     "github.com/go-gl/gl/v4.1-core/gl" // OR: github.com/go-gl/gl/v2.1/gl
  10.     "github.com/go-gl/glfw/v3.2/glfw"
  11. )
  12.  
  13. const (
  14.     width  = 500
  15.     height = 500
  16.  
  17.     vertexShaderSource = `
  18.         #version 410
  19.         in vec3 vp;
  20.         void main() {
  21.             gl_Position = vec4(vp, 1.0);
  22.         }
  23.     ` + "\x00"
  24.  
  25.     fragmentShaderSource = `
  26.         #version 410
  27.         out vec4 frag_colour;
  28.         void main() {
  29.             frag_colour = vec4(1, 1, 1, 1.0);
  30.         }
  31.     ` + "\x00"
  32. )
  33.  
  34. var (
  35.     triangle = []float32{
  36.         0, 0.5, 0,
  37.         -0.5, -0.5, 0,
  38.         0.5, -0.5, 0,
  39.     }
  40. )
  41.  
  42. func main() {
  43.     runtime.LockOSThread()
  44.  
  45.     window := initGlfw()
  46.     defer glfw.Terminate()
  47.     program := initOpenGL()
  48.  
  49.     vao := makeVao(triangle)
  50.     for !window.ShouldClose() {
  51.         draw(vao, window, program)
  52.     }
  53. }
  54.  
  55. func draw(vao uint32, window *glfw.Window, program uint32) {
  56.     gl.Clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT)
  57.     gl.UseProgram(program)
  58.  
  59.     gl.BindVertexArray(vao)
  60.     gl.DrawArrays(gl.TRIANGLES, 0, int32(len(triangle)/3))
  61.  
  62.     glfw.PollEvents()
  63.     window.SwapBuffers()
  64. }
  65.  
  66. // initGlfw initializes glfw and returns a Window to use.
  67. func initGlfw() *glfw.Window {
  68.     if err := glfw.Init(); err != nil {
  69.         panic(err)
  70.     }
  71.     glfw.WindowHint(glfw.Resizable, glfw.False)
  72.     glfw.WindowHint(glfw.ContextVersionMajor, 4)
  73.     glfw.WindowHint(glfw.ContextVersionMinor, 1)
  74.     glfw.WindowHint(glfw.OpenGLProfile, glfw.OpenGLCoreProfile)
  75.     glfw.WindowHint(glfw.OpenGLForwardCompatible, glfw.True)
  76.  
  77.     window, err := glfw.CreateWindow(width, height, "Conway's Game of Life", nil, nil)
  78.     if err != nil {
  79.         panic(err)
  80.     }
  81.     window.MakeContextCurrent()
  82.  
  83.     return window
  84. }
  85.  
  86. // initOpenGL initializes OpenGL and returns an intiialized program.
  87. func initOpenGL() uint32 {
  88.     if err := gl.Init(); err != nil {
  89.         panic(err)
  90.     }
  91.     version := gl.GoStr(gl.GetString(gl.VERSION))
  92.     log.Println("OpenGL version", version)
  93.  
  94.     vertexShader, err := compileShader(vertexShaderSource, gl.VERTEX_SHADER)
  95.     if err != nil {
  96.         panic(err)
  97.     }
  98.  
  99.     fragmentShader, err := compileShader(fragmentShaderSource, gl.FRAGMENT_SHADER)
  100.     if err != nil {
  101.         panic(err)
  102.     }
  103.  
  104.     prog := gl.CreateProgram()
  105.     gl.AttachShader(prog, vertexShader)
  106.     gl.AttachShader(prog, fragmentShader)
  107.     gl.LinkProgram(prog)
  108.     return prog
  109. }
  110.  
  111. // makeVao initializes and returns a vertex array from the points provided.
  112. func makeVao(points []float32) uint32 {
  113.     var vbo uint32
  114.     gl.GenBuffers(1, &vbo)
  115.     gl.BindBuffer(gl.ARRAY_BUFFER, vbo)
  116.     gl.BufferData(gl.ARRAY_BUFFER, 4*len(points), gl.Ptr(points), gl.STATIC_DRAW)
  117.  
  118.     var vao uint32
  119.     gl.GenVertexArrays(1, &vao)
  120.     gl.BindVertexArray(vao)
  121.     gl.EnableVertexAttribArray(0)
  122.     gl.BindBuffer(gl.ARRAY_BUFFER, vbo)
  123.     gl.VertexAttribPointer(0, 3, gl.FLOAT, false, 0, nil)
  124.  
  125.     return vao
  126. }
  127.  
  128. func compileShader(source string, shaderType uint32) (uint32, error) {
  129.     shader := gl.CreateShader(shaderType)
  130.  
  131.     csources, free := gl.Strs(source)
  132.     gl.ShaderSource(shader, 1, csources, nil)
  133.     free()
  134.     gl.CompileShader(shader)
  135.  
  136.     var status int32
  137.     gl.GetShaderiv(shader, gl.COMPILE_STATUS, &status)
  138.     if status == gl.FALSE {
  139.         var logLength int32
  140.         gl.GetShaderiv(shader, gl.INFO_LOG_LENGTH, &logLength)
  141.  
  142.         log := strings.Repeat("\x00", int(logLength+1))
  143.         gl.GetShaderInfoLog(shader, logLength, nil, gl.Str(log))
  144.  
  145.         return 0, fmt.Errorf("failed to compile %v: %v", source, log)
  146.     }
  147.  
  148.     return shader, nil
  149. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement