diff options
-rw-r--r-- | consts.h | 4 | ||||
-rw-r--r-- | main.c | 7 | ||||
-rw-r--r-- | makefile | 1 | ||||
-rw-r--r-- | pass1.frag | 15 | ||||
-rw-r--r-- | pass2.frag | 7 | ||||
-rw-r--r-- | uniform.c | 26 | ||||
-rw-r--r-- | uniform.h | 9 |
7 files changed, 30 insertions, 39 deletions
@@ -4,4 +4,8 @@ #define RES_H 800 #define RES_V 600 +#define U_LOC_TIME 1 +#define U_LOC_PASS1 2 +#define U_LOC_WINDOW 3 + #endif @@ -69,18 +69,17 @@ int main(int argc, char** argv) { glewInit(); init_tri(); + init_uniforms(); GLuint pass1 = link_shaders( vert_shader(fill_vert, fill_vert_size), frag_shader(pass1_frag, pass1_frag_size) ); - uniforms_t * pass1_uniforms = init_uniforms(pass1, window); GLuint pass2 = link_shaders( vert_shader(fill_vert, fill_vert_size), frag_shader(pass2_frag, pass2_frag_size) ); - uniforms_t * pass2_uniforms = init_uniforms(pass2, window); GLuint fbo; glGenFramebuffers(1, &fbo); @@ -104,12 +103,12 @@ int main(int argc, char** argv) { glfwPollEvents(); glUseProgram(pass1); - update_uniforms(pass1_uniforms); + update_uniforms(); glBindFramebuffer(GL_FRAMEBUFFER, fbo); glDrawArrays(GL_TRIANGLES, 0, 3); glUseProgram(pass2); - update_uniforms(pass2_uniforms); + update_uniforms(); glBindFramebuffer(GL_FRAMEBUFFER, 0); glDrawArrays(GL_TRIANGLES, 0, 3); @@ -5,7 +5,6 @@ LDFLAGS += -lGLEW CFLAGS += -g GLFLAGS += --target-env=opengl -GLFLAGS += -fauto-map-locations .PHONY: FORCE .SECONDARY: # do not remove intermediate files @@ -2,24 +2,23 @@ #include "consts.h" -out vec4 color; +layout(location = 0) out vec4 color; in vec4 gl_FragCoord; -uniform float time; -uniform sampler2D buf; - -ivec2 window = ivec2(RES_H, RES_V); +layout(location = U_LOC_TIME) uniform float time; +layout(location = U_LOC_PASS1) uniform sampler2D buf; +ivec2 res = ivec2(RES_H, RES_V); void main() { vec2 point = vec2(sin(time), cos(time)) * 0.7; - point.x *= float(window.y) / float(window.x); // adjust for aspect ratio - point = ((point + 1.0) / 2.0) * window.xy; // convert to screen coords + point.x *= float(res.y) / float(res.x); // adjust for aspect ratio + point = ((point + 1.0) / 2.0) * res.xy; // convert to screen coords float r = 20.0; // circle radius color = vec4(0.0); if (length(gl_FragCoord.xy - point) < r) color = vec4(1.0); - color += texture(buf, gl_FragCoord.xy / window.xy) * 0.95; + color += texture(buf, gl_FragCoord.xy / res.xy) * 0.95; } @@ -2,11 +2,12 @@ #include "consts.h" -out vec4 color; +layout(location = 0) out vec4 color; in vec4 gl_FragCoord; -uniform ivec2 window; -uniform sampler2D buf; +layout(location = U_LOC_TIME) uniform float time; +layout(location = U_LOC_PASS1) uniform sampler2D buf; +layout(location = U_LOC_WINDOW) uniform ivec2 window; void main() { vec2 uv = gl_FragCoord.xy / window.xy; @@ -3,40 +3,34 @@ #include <GL/glew.h> #include "uniform.h" +#include "consts.h" int time_start = 0; GLFWwindow* window = NULL; -uniforms_t * init_uniforms(GLuint shader, GLFWwindow* _window) { - window = _window; +void init_uniforms() { + window = glfwGetCurrentContext(); time_start = time(NULL); - - uniforms_t * uniforms = malloc(sizeof(uniforms_t)); - - uniforms->time = glGetUniformLocation(shader, "time"); - uniforms->window = glGetUniformLocation(shader, "window"); - - return uniforms; } //! update `uniform float time` -static void update_u_time(GLuint u_time) { +static void update_u_time() { struct timeval t; gettimeofday(&t, NULL); t.tv_sec -= time_start; float time = t.tv_sec + (t.tv_usec / 1e6); - glUniform1f(u_time, time); + glUniform1f(U_LOC_TIME, time); } //! update `uniform ivec2 window` -static void update_u_window(GLuint u_window) { +static void update_u_window() { int width, height; glfwGetWindowSize(window, &width, &height); - glUniform2i(u_window, width, height); + glUniform2i(U_LOC_WINDOW, width, height); } -void update_uniforms(uniforms_t * uniforms) { - update_u_time(uniforms->time); - update_u_window(uniforms->window); +void update_uniforms() { + update_u_time(); + update_u_window(); } @@ -5,11 +5,6 @@ #include <GLFW/glfw3.h> #include <GL/gl.h> -typedef struct { - GLint time; - GLint window; -} uniforms_t; - -uniforms_t * init_uniforms(GLuint shader, GLFWwindow* window); -void update_uniforms(uniforms_t * uniforms); +void init_uniforms(); +void update_uniforms(); |