Advertisement
Guest User

main.go

a guest
Aug 27th, 2017
109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Go 4.87 KB | None | 0 0
  1. package main
  2.  
  3. import (
  4.     "fmt"
  5.     "github.com/go-gl/gl/v4.1-core/gl"
  6.     "github.com/go-gl/glfw/v3.2/glfw"
  7.     "image"
  8.     _ "image/png"
  9.     "io/ioutil"
  10.     "log"
  11.     "os"
  12.     "runtime"
  13.     "strings"
  14. )
  15.  
  16. const (
  17.     vertexShaderSource   = "vertex.glsl"
  18.     fragmentShaderSource = "fragment.glsl"
  19. )
  20.  
  21. var (
  22.     g_winWidth        = 400
  23.     g_winHeight       = 400
  24.     g_winTitle        = "test"
  25.     g_textureFileName = "d.png"
  26.  
  27.     g_vertices = []float32{
  28.         //x  y    z texture x y
  29.         0.5, 0.5, 0, 1, 0,
  30.         0.5, -0.5, 0, 1, 1,
  31.         -0.5, -0.5, 0, 0, 1,
  32.         -0.5, 0.5, 0, 0, 0,
  33.     }
  34.     g_indeces = []uint32{
  35.         0, 1, 3,
  36.         1, 2, 3,
  37.     }
  38. )
  39.  
  40. func main() {
  41.     runtime.LockOSThread()
  42.     window := initGLFW(g_winWidth, g_winHeight, g_winTitle)
  43.     defer glfw.Terminate()
  44.     glProgram := initGL()
  45.     texture, err := loadTexture(g_textureFileName)
  46.     log.Println(texture)
  47.     vao := makeVao(g_vertices, g_indeces)
  48.     if err != nil {
  49.         panic(err)
  50.     }
  51.     for !window.ShouldClose() {
  52.         gl.Clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT)
  53.         gl.UseProgram(glProgram)
  54.  
  55.         gl.BindTexture(gl.TEXTURE_2D, texture)
  56.         gl.BindVertexArray(vao)
  57.         gl.DrawElements(gl.TRIANGLES, 6, gl.UNSIGNED_INT, nil)
  58.         gl.BindVertexArray(0)
  59.  
  60.         glfw.PollEvents()
  61.         window.SwapBuffers()
  62.     }
  63.  
  64. }
  65.  
  66. func loadTexture(filename string) (uint32, error) {
  67.     file, err := os.Open(filename)
  68.     if err != nil {
  69.         return 0, err
  70.     }
  71.     defer file.Close()
  72.  
  73.     img, _, err := image.Decode(file)
  74.     if err != nil {
  75.         return 0, err
  76.     }
  77.     bounds := img.Bounds()
  78.     width := bounds.Max.X - bounds.Min.X
  79.     height := bounds.Max.Y - bounds.Min.Y
  80.  
  81.     var binImg []uint8
  82.     for y := bounds.Min.Y; y <= bounds.Max.Y; y++ {
  83.         for x := bounds.Min.X; x <= bounds.Max.X; x++ {
  84.             r, g, b, a := img.At(x, y).RGBA()
  85.             binImg = append(binImg, uint8(r/256))
  86.             binImg = append(binImg, uint8(g/256))
  87.             binImg = append(binImg, uint8(b/256))
  88.             binImg = append(binImg, uint8(a/256))
  89.         }
  90.     }
  91.  
  92.     var texture uint32
  93.     gl.GenTextures(1, &texture)
  94.     gl.BindTexture(gl.TEXTURE_2D, texture)
  95.     gl.TexImage2D(gl.TEXTURE_2D, 0, gl.RGBA, int32(width), int32(height), 0, gl.RGBA, gl.UNSIGNED_BYTE, gl.Ptr(binImg))
  96.     gl.GenerateMipmap(gl.TEXTURE_2D)
  97.     gl.BindTexture(gl.TEXTURE_2D, 0)
  98.     return texture, nil
  99. }
  100.  
  101. func makeVao(va []float32, vi []uint32) uint32 {
  102.     var vao, vbo, ebo uint32
  103.     gl.GenVertexArrays(1, &vao)
  104.     gl.GenBuffers(1, &vbo)
  105.     gl.GenBuffers(1, &ebo)
  106.  
  107.     gl.BindVertexArray(vao)
  108.  
  109.     gl.BindBuffer(gl.ARRAY_BUFFER, vbo)
  110.     gl.BufferData(gl.ARRAY_BUFFER, 4*len(va), gl.Ptr(va), gl.STATIC_DRAW)
  111.     gl.BindBuffer(gl.ELEMENT_ARRAY_BUFFER, ebo)
  112.     gl.BufferData(gl.ELEMENT_ARRAY_BUFFER, 4*len(vi), gl.Ptr(vi), gl.STATIC_DRAW)
  113.     gl.VertexAttribPointer(0, 3, gl.FLOAT, false, int32(5*4), nil)
  114.     gl.VertexAttribPointer(1, 2, gl.FLOAT, false, int32(5*4), gl.PtrOffset(3*4))
  115.     gl.EnableVertexAttribArray(0)
  116.     gl.EnableVertexAttribArray(1)
  117.  
  118.     gl.BindBuffer(gl.ARRAY_BUFFER, 0)
  119.  
  120.     gl.BindVertexArray(0)
  121.     return vao
  122. }
  123.  
  124. func initGLFW(width, height int, title string) *glfw.Window {
  125.     if err := glfw.Init(); err != nil {
  126.         panic(err)
  127.     }
  128.     glfw.WindowHint(glfw.Resizable, glfw.False)
  129.     glfw.WindowHint(glfw.ContextVersionMajor, 4)
  130.     glfw.WindowHint(glfw.ContextVersionMinor, 1)
  131.     glfw.WindowHint(glfw.OpenGLProfile, glfw.OpenGLCoreProfile)
  132.     glfw.WindowHint(glfw.OpenGLForwardCompatible, glfw.True)
  133.  
  134.     window, err := glfw.CreateWindow(width, height, title, nil, nil)
  135.     if err != nil {
  136.         panic(err)
  137.     }
  138.     window.MakeContextCurrent()
  139.     return window
  140. }
  141.  
  142. func initGL() uint32 {
  143.     if err := gl.Init(); err != nil {
  144.         panic(err)
  145.     }
  146.  
  147.     vertexShader, err := compileShader(vertexShaderSource, gl.VERTEX_SHADER)
  148.     if err != nil {
  149.         panic(err)
  150.     }
  151.     defer gl.DeleteShader(vertexShader)
  152.  
  153.     fragmentShader, err := compileShader(fragmentShaderSource,
  154.         gl.FRAGMENT_SHADER)
  155.     if err != nil {
  156.         panic(err)
  157.     }
  158.     defer gl.DeleteShader(fragmentShader)
  159.  
  160.     version := gl.GoStr(gl.GetString(gl.VERSION))
  161.     log.Println("OpenGL version" + version)
  162.     prog := gl.CreateProgram()
  163.     gl.AttachShader(prog, vertexShader)
  164.     gl.AttachShader(prog, fragmentShader)
  165.     gl.LinkProgram(prog)
  166.     var status int32
  167.     gl.GetProgramiv(prog, gl.LINK_STATUS, &status)
  168.     if status == gl.FALSE {
  169.         log.Println("failed to link")
  170.     }
  171.     return prog
  172. }
  173.  
  174. func compileShader(shaderSourceFile string, shaderType uint32) (uint32,
  175.     error) {
  176.     source, err := ioutil.ReadFile(shaderSourceFile)
  177.     if err != nil {
  178.         panic(err)
  179.     }
  180.     source = append(source, byte(0))
  181.     shader := gl.CreateShader(shaderType)
  182.  
  183.     csources, free := gl.Strs(string(source))
  184.     gl.ShaderSource(shader, 1, csources, nil)
  185.     free()
  186.     gl.CompileShader(shader)
  187.  
  188.     var status int32
  189.     gl.GetShaderiv(shader, gl.COMPILE_STATUS, &status)
  190.     if status == gl.FALSE {
  191.         var logLength int32
  192.         gl.GetShaderiv(shader, gl.INFO_LOG_LENGTH, &logLength)
  193.         log := strings.Repeat("\x00", int(logLength+1))
  194.         gl.GetShaderInfoLog(shader, logLength, nil, gl.Str(log))
  195.         return 0, fmt.Errorf("failed to compile %v: %v", shaderSourceFile, log)
  196.     }
  197.     return shader, nil
  198. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement