159 lines
4.5 KiB
Odin
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()
|
|
}
|
|
}
|