最初コミット
This commit is contained in:
7
README.md
Normal file
7
README.md
Normal file
@@ -0,0 +1,7 @@
|
||||
# Odinで書いたOpenGLレンダー
|
||||
|
||||
記事:
|
||||
* [日本語](https://technicalsuwako.moe/blog/odin-review)
|
||||
* [English](https://technicalsuwako.moe/enblog/odin-review)
|
||||
|
||||

|
||||
135
main.odin
Normal file
135
main.odin
Normal file
@@ -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()
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user