/************************************************************************************** # 076 Free License Copyright (c) 2026 テクニカル諏訪子 Permission is hereby granted to any person obtaining a copy of the software OpenGL-Odin (the "Software") to use, modify, merge, copy, publish, distribute, sublicense, and/or sell copies of the Software, subject to the following conditions: 1. **Origin Attribution**: - You must not misrepresent the origin of the Software; you must not claim you created the original Software. 2. **Notice Preservation**: - This license and the above copyright notice must remain intact in all copies of the source code. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. **************************************************************************************/ 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() } }