From 61adffe06172bf79aafbe9b4add21c15c3a1d7f9 Mon Sep 17 00:00:00 2001 From: Andrew Cohn Date: Sat, 29 Nov 2025 12:39:05 -0800 Subject: [PATCH] query window size every frame so we have something that makes a little bit of sense --- Makefile | 2 +- fallingCand | Bin 81768 -> 86000 bytes main.c | 44 ++++++++++++++++++++++++++---------------- shaders/gradient.frag | 4 ++-- 4 files changed, 30 insertions(+), 20 deletions(-) diff --git a/Makefile b/Makefile index 03be6bb..5bd163d 100644 --- a/Makefile +++ b/Makefile @@ -6,7 +6,7 @@ SRC = glad.c gl_utils.c main.c OBJ = $(SRC:.c=.o) BIN = fallingCand -all: $(BIN) +all: clean $(BIN) $(BIN): $(OBJ) $(CC) $(OBJ) -o $@ $(LDFLAGS) diff --git a/fallingCand b/fallingCand index 250e73b8e07fea4c9df409576b0db9bce2b585d5..7695f50d260f275e9c91afa5f1c3e0717ed17654 100755 GIT binary patch literal 86000 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 literal 81768 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 diff --git a/main.c b/main.c index cf693c6..7a4c27c 100644 --- a/main.c +++ b/main.c @@ -3,27 +3,26 @@ #include #include "gl_utils.h" +static int g_fbWidth = 800; +static int g_fbHeight = 800; int main(void) { - int winW = 800; - int winH = 600; - - GLFWwindow* window = init_glfw_glad("Falling Sand - Fullscreen Quad", winW, winH); + GLFWwindow* window = init_glfw_glad("Falling Sand - Fullscreen Quad", g_fbWidth, g_fbHeight); if (!window) { return EXIT_FAILURE; } - - printf("Renderer: %s\n", (const char*)glGetString(GL_RENDERER)); - printf("OpenGL: %s\n", (const char*)glGetString(GL_VERSION)); - printf("GLSL: %s\n", (const char*)glGetString(GL_SHADING_LANGUAGE_VERSION)); + glfwGetFramebufferSize(window, &g_fbWidth, &g_fbHeight); + glViewport(0, 0, g_fbWidth, g_fbHeight); + printf("Renderer: %s\n", (const char*)glGetString(GL_RENDERER)); + printf("OpenGL: %s\n", (const char*)glGetString(GL_VERSION)); + printf("GLSL: %s\n", (const char*)glGetString(GL_SHADING_LANGUAGE_VERSION)); // --- Create fullscreen triangle geometry (VAO + VBO) --- float vertices[] = { // x, y -1.0f, -1.0f, - 3.0f, -1.0f, - -1.0f, 3.0f - }; + 3.0f, -1.0f, + -1.0f, 3.0f}; GLuint vao = 0, vbo = 0; glGenVertexArrays(1, &vao); @@ -42,17 +41,18 @@ int main(void) { GL_FLOAT, GL_FALSE, 2 * sizeof(float), - (void*)0 - ); + (void*)0); glBindVertexArray(0); // --- Create shader program --- GLuint program = create_program_from_files( "shaders/fullscreen.vert", - "shaders/gradient.frag" - ); - + "shaders/gradient.frag"); + GLint uResLoc = glGetUniformLocation(program, "u_resolution"); + if (uResLoc == -1) { + fprintf(stderr, "[warn] u_resolution uniform not found (maybe optimized out?)\n"); + } glUseProgram(program); glClearColor(0.0f, 0.0f, 0.0f, 1.0f); @@ -60,10 +60,20 @@ int main(void) { // --- Main loop --- while (!glfwWindowShouldClose(window)) { glfwPollEvents(); - + // Re-query framebuffer size each frame (cheap and simple) + int fbw, fbh; + glfwGetFramebufferSize(window, &fbw, &fbh); + if (fbw != g_fbWidth || fbh != g_fbHeight) { + g_fbWidth = fbw; + g_fbHeight = fbh; + glViewport(0, 0, g_fbWidth, g_fbHeight); + } glClear(GL_COLOR_BUFFER_BIT); glUseProgram(program); + if (uResLoc != -1) { + glUniform2f(uResLoc, (float)g_fbWidth, (float)g_fbHeight); + } glBindVertexArray(vao); glDrawArrays(GL_TRIANGLES, 0, 3); diff --git a/shaders/gradient.frag b/shaders/gradient.frag index 6f8726d..5b212c9 100644 --- a/shaders/gradient.frag +++ b/shaders/gradient.frag @@ -1,11 +1,11 @@ #version 430 core out vec4 FragColor; - +uniform vec2 u_resolution; void main() { // Normalized coordinates in [0,1] - vec2 uv = gl_FragCoord.xy / vec2(800.0, 600.0); // we’ll fix this later with a uniform + vec2 uv = gl_FragCoord.xy / u_resolution; vec3 color = vec3(uv.x, uv.y, 0.2); FragColor = vec4(color, 1.0); }