package main import gl "vendor:OpenGL" import "vendor:glfw" import "core:fmt" import "core:os" import "core:c" framebuffer_cb :: proc "c" (window: glfw.WindowHandle, width: i32, height: i32) { gl.Viewport(0, 0, width, height) } vertexSrc: cstring = `#version 330 core layout (location = 0) in vec3 aPos; void main() { gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0); }` fragSrc: cstring = `#version 330 core out vec4 FragColor; void main() { FragColor = vec4(1.f, .5f, .2f, 1.f); }` WIDTH :: 500 HEIGHT :: 300 main ::proc() { glfw.Init() glfw.WindowHint(glfw.CONTEXT_VERSION_MAJOR, 3) glfw.WindowHint(glfw.CONTEXT_VERSION_MINOR, 3) glfw.WindowHint(glfw.OPENGL_PROFILE, glfw.OPENGL_CORE_PROFILE) window := glfw.CreateWindow(WIDTH, HEIGHT, "例え", nil, nil) defer glfw.Terminate() if window == nil { fmt.println("GLFWウィンドウを開くに失敗") os.exit(-1) } glfw.MakeContextCurrent(window) gl.load_up_to(3, 3, glfw.gl_set_proc_address) gl.Viewport(0, 0, WIDTH, HEIGHT) glfw.SetFramebufferSizeCallback(window, framebuffer_cb) success: i32 infoLog: [512]c.char vertexShader := gl.CreateShader(gl.VERTEX_SHADER) gl.ShaderSource(vertexShader, 1, &vertexSrc, nil) gl.CompileShader(vertexShader) gl.GetShaderiv(vertexShader, gl.COMPILE_STATUS, &success) if success != 1 { gl.GetShaderInfoLog(vertexShader, 512, nil, raw_data(&infoLog)) os.exit(-1) } fragShader := gl.CreateShader(gl.FRAGMENT_SHADER) gl.ShaderSource(fragShader, 1, &fragSrc, nil) gl.CompileShader(fragShader) gl.GetShaderiv(fragShader, gl.COMPILE_STATUS, &success) if success != 1 { gl.GetShaderInfoLog(fragShader, 512, nil, raw_data(&infoLog)) os.exit(-1) } shaderProgram := gl.CreateProgram() defer gl.DeleteProgram(shaderProgram) gl.AttachShader(shaderProgram, vertexShader) gl.AttachShader(shaderProgram, fragShader) gl.LinkProgram(shaderProgram) gl.GetProgramiv(fragShader, gl.LINK_STATUS, &success) if success != 1 { gl.GetShaderInfoLog(fragShader, 512, nil, raw_data(&infoLog)) os.exit(-1) } gl.DeleteShader(vertexShader) gl.DeleteShader(fragShader) vertices := [?]f32 { .5, .5, .0, .5, -.5, .0, -.5, -.5, .0, -.5, .5, .0, } indices := [?]u32 { 0, 1, 3, 1, 2, 3, } VBO, VAO, EBO: u32 gl.GenVertexArrays(1, &VAO) defer gl.DeleteVertexArrays(1, &VAO) gl.GenBuffers(1, &VBO) defer gl.DeleteBuffers(1, &VBO) gl.GenBuffers(1, &EBO) defer gl.DeleteBuffers(1, &EBO) gl.BindVertexArray(VAO) gl.BindBuffer(gl.ARRAY_BUFFER, VBO) gl.BufferData(gl.ARRAY_BUFFER, size_of(vertices), raw_data(&vertices), gl.STATIC_DRAW) gl.BindBuffer(gl.ELEMENT_ARRAY_BUFFER, EBO) gl.BufferData(gl.ELEMENT_ARRAY_BUFFER, size_of(indices), raw_data(&indices), gl.STATIC_DRAW) gl.VertexAttribPointer(0, 3, gl.FLOAT, gl.FALSE, 3 * size_of(f32), 0) gl.EnableVertexAttribArray(0) gl.BindBuffer(gl.ARRAY_BUFFER, 0) gl.BindVertexArray(0) for !glfw.WindowShouldClose(window) { if glfw.GetKey(window, glfw.KEY_Q) == glfw.PRESS { glfw.SetWindowShouldClose(window, true) } gl.ClearColor(.6, .1, .6, 1.) gl.Clear(gl.COLOR_BUFFER_BIT) gl.UseProgram(shaderProgram) gl.BindVertexArray(VAO) gl.DrawElements(gl.TRIANGLES, 6, gl.UNSIGNED_INT, nil) glfw.SwapBuffers(window) glfw.PollEvents() } }