From f850e3f08278a5e1d50045d25e519708cb486e08 Mon Sep 17 00:00:00 2001 From: bx Date: Mon, 21 Mar 2022 21:56:24 +0000 Subject: [PATCH] got uniform iResolution working --- sdfps.c | 63 ++++++++++++++++++++++++++++++++++++++------------------- 1 file changed, 42 insertions(+), 21 deletions(-) diff --git a/sdfps.c b/sdfps.c index 5a288dc..e853fb4 100644 --- a/sdfps.c +++ b/sdfps.c @@ -4,6 +4,8 @@ #include +#include + #include "types.h" GLuint create_shader(GLenum shader_type, const char *src) { @@ -54,10 +56,15 @@ void init(Sdfps* s) { /* TODO: Error checks */ s -> frag_shader = create_shader(GL_FRAGMENT_SHADER, "#version 330\n" "precision highp float;\n" + + /* viewport resolution (in pixels), z = 1 */ + "uniform vec3 iResolution;\n" + "out vec4 out_color;\n" "void main() {\n" - "vec2 xy = mod(gl_FragCoord.xy, vec2(200.0, 200.0));\n" - "out_color = vec4(xy.x / 100.0, xy.x / 200.0, xy.y / 200.0, 1);\n" + "vec2 xy = gl_FragCoord.xy;\n" + "out_color = vec4(sin(xy.x), sin(xy.y), sin(xy.x) + sin(xy.y), 1);\n" + "if(xy.x > iResolution.x / 2.0) out_color = out_color.zxyw;\n" "}\n"); s -> shader_program = glCreateProgram(); @@ -75,34 +82,44 @@ void init(Sdfps* s) { /* TODO: Error checks */ } void deinit(Sdfps *s) { + glDeleteProgram(s -> shader_program); + glDeleteShader(s -> vert_shader); + glDeleteShader(s -> frag_shader); SDL_GL_DeleteContext(s -> context); SDL_DestroyWindow(s -> window); } -void render(Sdfps *s) { - // setup render texture - const s32 fb_w = 512, fb_h = 512; - GLuint render_tex; - glGenTextures(1, &render_tex); - glBindTexture(GL_TEXTURE_2D, render_tex); +s32 create_framebuffer(s32 w, s32 h, GLuint *texture, GLuint *framebuffer) { + glGenTextures(1, texture); + glBindTexture(GL_TEXTURE_2D, *texture); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, - fb_w, fb_h, // width height - 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); - GLuint framebuf; - glGenFramebuffers(1, &framebuf); - glBindFramebuffer(GL_FRAMEBUFFER, framebuf); - glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, render_tex, 0); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); + + glGenFramebuffers(1, framebuffer); + glBindFramebuffer(GL_FRAMEBUFFER, *framebuffer); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, *texture, 0); + GLenum fb_status = glCheckFramebufferStatus(GL_FRAMEBUFFER); - if (fb_status != GL_FRAMEBUFFER_COMPLETE) + if (fb_status != GL_FRAMEBUFFER_COMPLETE) { puts("FRAME BUFFER FUCKED UP SOMEWHERE"); + return 1; + } + return 0; +} + +void render(Sdfps *s) { + // setup render texture + const s32 fb_w = 4, fb_h = 4; + GLuint render_tex, framebuf; + create_framebuffer(fb_w, fb_h, &render_tex, &framebuf); glViewport(0, 0, fb_w, fb_h); - - + GLuint iResolution = glGetUniformLocation(s -> shader_program, "iResolution"); + // TODO: error check? + glUniform3f(iResolution, (f32) fb_w, (f32) fb_h, 1.0f); glClearColor(0.1f, 0.25f, 0.24f, 1); glClear(GL_COLOR_BUFFER_BIT); @@ -142,9 +159,13 @@ void render(Sdfps *s) { ); #if 1 - // just here to check that it works, since it can be used as an easy way to - // get data back out of a shader, there's probs a more proper way to do it - // that we could change to later + /* + just here to check that it works, since it can be used as an easy way to + get data back out of a shader, there's probs a more proper way to do it + that we could change to later + UPDATE: looking at shader toy's source it seems it uses this function to + get output for sound shaders + */ f32 pixels[16 * 16 * 4] = { 0.0f }; glReadPixels( 10, // x pixel starting bottom left,