From b46ffbe94cbb4888912608e2c7e568c37394b2eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=AB=8F=E8=A8=AA=E5=AD=90?= Date: Tue, 28 Apr 2026 23:42:15 +0900 Subject: [PATCH] =?UTF-8?q?=E6=9C=80=E5=88=9D=E3=82=B3=E3=83=9F=E3=83=83?= =?UTF-8?q?=E3=83=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 7 +++ main.odin | 135 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 142 insertions(+) create mode 100644 README.md create mode 100644 main.odin diff --git a/README.md b/README.md new file mode 100644 index 0000000..a339375 --- /dev/null +++ b/README.md @@ -0,0 +1,7 @@ +# Odinで書いたOpenGLレンダー + +記事: +* [日本語](https://technicalsuwako.moe/blog/odin-review) +* [English](https://technicalsuwako.moe/enblog/odin-review) + +![](https://ass.technicalsuwako.moe/2026-03-04-031210_scrot.png) diff --git a/main.odin b/main.odin new file mode 100644 index 0000000..3d94dec --- /dev/null +++ b/main.odin @@ -0,0 +1,135 @@ +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() + } +}