This repository has been archived on 2026-05-27. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
OpenGL-Odin/main.odin
2026-04-29 00:44:46 +09:00

159 lines
4.5 KiB
Odin

/**************************************************************************************
# 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()
}
}