Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
49 changes: 49 additions & 0 deletions opengl/learn_opengl/1_getting_started/1_hello_window/main.odin
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
package main

import gl "vendor:OpenGL"
import "vendor:glfw"
import "core:fmt"
import "core:os"

framebuffer_size_callback :: proc "c" (window: glfw.WindowHandle, width: i32, height: i32) {
gl.Viewport(0, 0, width, height)
}

processInput :: proc "c" (window: glfw.WindowHandle) {
if glfw.GetKey(window, glfw.KEY_ESCAPE) == glfw.PRESS {
glfw.SetWindowShouldClose(window, true)
}
}

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(800, 600, "LearnOpenGL", nil, nil)
if window == nil {
fmt.println("Failed to create GLFW window")
glfw.Terminate()
os.exit(-1)
}
glfw.MakeContextCurrent(window)

gl.load_up_to(3, 3, glfw.gl_set_proc_address)

gl.Viewport(0, 0, 800, 600)

glfw.SetFramebufferSizeCallback(window, framebuffer_size_callback)

for !glfw.WindowShouldClose(window) {
processInput(window)

gl.ClearColor(0.2, 0.3, 0.3, 1.0)
gl.Clear(gl.COLOR_BUFFER_BIT)

glfw.SwapBuffers(window)
glfw.PollEvents()
}

glfw.Terminate()
}
146 changes: 146 additions & 0 deletions opengl/learn_opengl/1_getting_started/2_hello_triangle/main.odin
Original file line number Diff line number Diff line change
@@ -0,0 +1,146 @@
package main

import gl "vendor:OpenGL"
import "vendor:glfw"
import "core:fmt"
import "core:os"
import "core:c"

framebuffer_size_callback :: proc "c" (window: glfw.WindowHandle, width: i32, height: i32) {
gl.Viewport(0, 0, width, height)
}

processInput :: proc "c" (window: glfw.WindowHandle) {
if glfw.GetKey(window, glfw.KEY_ESCAPE) == glfw.PRESS {
glfw.SetWindowShouldClose(window, true)
}
}

vertexShaderSource: cstring =
`#version 330 core
layout (location = 0) in vec3 aPos;
void main()
{
gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);
}`

fragmentShaderSource: cstring =
`#version 330 core
out vec4 FragColor;

void main()
{
FragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f);
}`

SCR_WIDTH :: 800
SCR_HEIGHT :: 600

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(SCR_WIDTH, SCR_HEIGHT, "LearnOpenGL", nil, nil)
if window == nil {
fmt.println("Failed to create GLFW window")
glfw.Terminate()
os.exit(-1)
}
glfw.MakeContextCurrent(window)

gl.load_up_to(3, 3, glfw.gl_set_proc_address)

gl.Viewport(0, 0, SCR_WIDTH, SCR_HEIGHT)

glfw.SetFramebufferSizeCallback(window, framebuffer_size_callback)

success: i32
infoLog: [512]c.char

vertexShader := gl.CreateShader(gl.VERTEX_SHADER)
gl.ShaderSource(vertexShader, 1, &vertexShaderSource, nil)
gl.CompileShader(vertexShader)

gl.GetShaderiv(vertexShader, gl.COMPILE_STATUS, &success)
if success != 1 {
gl.GetShaderInfoLog(vertexShader, 512, nil, raw_data(&infoLog))
}

fragmentShader := gl.CreateShader(gl.FRAGMENT_SHADER)
gl.ShaderSource(fragmentShader, 1, &fragmentShaderSource, nil)
gl.CompileShader(fragmentShader)

gl.GetShaderiv(fragmentShader, gl.COMPILE_STATUS, &success)
if success != 1 {
gl.GetShaderInfoLog(fragmentShader, 512, nil, raw_data(&infoLog))
os.exit(-1)
}

shaderProgram := gl.CreateProgram()
gl.AttachShader(shaderProgram, vertexShader)
gl.AttachShader(shaderProgram, fragmentShader)
gl.LinkProgram(shaderProgram)

gl.GetProgramiv(fragmentShader, gl.LINK_STATUS, &success)
if success != 1 {
gl.GetProgramInfoLog(fragmentShader, 512, nil, raw_data(&infoLog))
os.exit(-1)
}

gl.DeleteShader(vertexShader)
gl.DeleteShader(fragmentShader)

vertices := [?]f32 {
0.5, 0.5, 0.0,
0.5, -0.5, 0.0,
-0.5, -0.5, 0.0,
-0.5, 0.5, 0.0,
}

indices := [?]u32 {
0, 1, 3,
1, 2, 3,
}

VBO, VAO, EBO: u32
gl.GenVertexArrays(1, &VAO)
gl.GenBuffers(1, &VBO)
gl.GenBuffers(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) {
processInput(window)

gl.ClearColor(0.2, 0.3, 0.3, 1.0)
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()
}

gl.DeleteVertexArrays(1, &VAO)
gl.DeleteBuffers(1, &VBO)
gl.DeleteBuffers(1, &EBO)
gl.DeleteProgram(shaderProgram)

glfw.Terminate()
}
99 changes: 99 additions & 0 deletions opengl/learn_opengl/1_getting_started/3_shaders/main.odin
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
package main

import gl "vendor:OpenGL"
import "vendor:glfw"
import "core:fmt"
import "core:os"

framebuffer_size_callback :: proc "c" (window: glfw.WindowHandle, width: i32, height: i32) {
gl.Viewport(0, 0, width, height)
}

processInput :: proc "c" (window: glfw.WindowHandle) {
if glfw.GetKey(window, glfw.KEY_ESCAPE) == glfw.PRESS {
glfw.SetWindowShouldClose(window, true)
}
}

shader_set_bool :: proc(id: u32, name: cstring, value: bool) {
gl.Uniform1i(gl.GetUniformLocation(id, name), i32(value))
}

shader_set_int :: proc(id: u32, name: cstring, value: i32) {
gl.Uniform1i(gl.GetUniformLocation(id, name), value)
}

shader_set_float :: proc(id: u32, name: cstring, value: f32) {
gl.Uniform1f(gl.GetUniformLocation(id, name), value)
}

SCR_WIDTH :: 800
SCR_HEIGHT :: 600

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(SCR_WIDTH, SCR_HEIGHT, "LearnOpenGL", nil, nil)
if window == nil {
fmt.println("Failed to create GLFW window")
glfw.Terminate()
os.exit(-1)
}
glfw.MakeContextCurrent(window)

gl.load_up_to(3, 3, glfw.gl_set_proc_address)

gl.Viewport(0, 0, SCR_WIDTH, SCR_HEIGHT)

glfw.SetFramebufferSizeCallback(window, framebuffer_size_callback)

vertices := [?]f32 {
0.5, -0.5, 0.0, 1.0, 0.0, 0.0,
-0.5, -0.5, 0.0, 0.0, 1.0, 0.0,
0.0, 0.5, 0.0, 0.0, 0.0, 1.0,
}

// The shader loading they create can be replaced with just this
shaderProgram, loaded_ok := gl.load_shaders_file("./res/vertex.vs", "./res/fragment.fs")
if !loaded_ok {
os.exit(-1)
}

VBO, VAO: u32
gl.GenVertexArrays(1, &VAO)
gl.GenBuffers(1, &VBO)

gl.BindVertexArray(VAO)

gl.BindBuffer(gl.ARRAY_BUFFER, VBO)
gl.BufferData(gl.ARRAY_BUFFER, size_of(vertices), raw_data(&vertices), gl.STATIC_DRAW)

gl.VertexAttribPointer(0, 3, gl.FLOAT, gl.FALSE, 6 * size_of(f32), 0)
gl.EnableVertexAttribArray(0)

gl.VertexAttribPointer(1, 3, gl.FLOAT, gl.FALSE, 6 * size_of(f32), 3 * size_of(f32))
gl.EnableVertexAttribArray(1)

for !glfw.WindowShouldClose(window) {
processInput(window)

gl.ClearColor(0.2, 0.3, 0.3, 1.0)
gl.Clear(gl.COLOR_BUFFER_BIT)

gl.UseProgram(shaderProgram)
gl.BindVertexArray(VAO)
gl.DrawArrays(gl.TRIANGLES, 0, 3)

glfw.SwapBuffers(window)
glfw.PollEvents()
}

gl.DeleteVertexArrays(1, &VAO)
gl.DeleteBuffers(1, &VBO)
gl.DeleteProgram(shaderProgram)

glfw.Terminate()
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
#version 330 core
out vec4 FragColor;
in vec3 ourColor;

void main()
{
FragColor = vec4(ourColor, 1.0);
}
11 changes: 11 additions & 0 deletions opengl/learn_opengl/1_getting_started/3_shaders/res/vertex.vs
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
#version 330 core
layout (location = 0) in vec3 aPos; // the position variable has attribute position 0
layout (location = 1) in vec3 aColor; // the color variable has attribute position 1

out vec3 ourColor; // output a color to the fragment shader

void main()
{
gl_Position = vec4(aPos, 1.0);
ourColor = aColor; // set ourColor to the input color we got from the vertex data
}
Loading