webgl_helpers.odin 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. package webgl
  2. import "core:fmt"
  3. CreateProgramFromStrings :: proc(vs_sources, fs_sources: []string) -> (program: Program, ok: bool) {
  4. ok = true
  5. log: [1024]byte
  6. vs := CreateShader(VERTEX_SHADER)
  7. fs := CreateShader(FRAGMENT_SHADER)
  8. defer DeleteShader(vs)
  9. defer DeleteShader(fs)
  10. ShaderSource(vs, vs_sources)
  11. ShaderSource(fs, fs_sources)
  12. CompileShader(vs)
  13. if GetShaderiv(vs, COMPILE_STATUS) == 0 {
  14. err := GetShaderInfoLog(vs, log[:])
  15. fmt.eprintln("Vertex shader did not compile successfully", err)
  16. ok = false
  17. return
  18. }
  19. CompileShader(fs)
  20. if GetShaderiv(fs, COMPILE_STATUS) == 0 {
  21. err := GetShaderInfoLog(fs, log[:])
  22. fmt.eprintln("Fragment shader did not compile successfully", err)
  23. ok = false
  24. return
  25. }
  26. program = CreateProgram()
  27. defer if !ok do DeleteProgram(program)
  28. AttachShader(program, vs)
  29. AttachShader(program, fs)
  30. LinkProgram(program)
  31. DetachShader(program, vs)
  32. DetachShader(program, fs)
  33. if GetProgramParameter(program, LINK_STATUS) == 0 {
  34. err := GetProgramInfoLog(program, log[:])
  35. fmt.eprintln("Shader program did not link successfully", err)
  36. ok = false
  37. return
  38. }
  39. return
  40. }