X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?p=demo_prior;a=blobdiff_plain;f=src%2Fpost.c;h=994c93e12c16f674861cf3070e731e2596896a66;hp=c1a2a2304df540cc2aa47e0c99a1f3b01bafac34;hb=HEAD;hpb=3a9f6854df479d81442273c9d0b133c49c5c8f66 diff --git a/src/post.c b/src/post.c index c1a2a23..994c93e 100644 --- a/src/post.c +++ b/src/post.c @@ -2,6 +2,93 @@ #include "texture.h" #include "post.h" #include "demo.h" +#include "opt.h" +#include "sdr.h" + +static unsigned int post_fbtex_gltexid[2]; +static unsigned int rbuf_depth[2]; + +unsigned int post_fbo[2]; +struct texture post_fbtex[2]; +int post_fbtex_cur; + +unsigned int sdr_vgn; +int vgn_uloc_color, vgn_uloc_offs, vgn_uloc_sharp; + +int post_init(void) +{ + int i; + + if(!(sdr_vgn = create_program_load("sdr/post.v.glsl", "sdr/vignette.p.glsl"))) { + return -1; + } + glUseProgram(sdr_vgn); + vgn_uloc_color = get_uniform_loc(sdr_vgn, "color"); + vgn_uloc_offs = get_uniform_loc(sdr_vgn, "offset"); + vgn_uloc_sharp = get_uniform_loc(sdr_vgn, "sharpness"); + + + glGenTextures(2, post_fbtex_gltexid); + glGenRenderbuffers(2, rbuf_depth); + + for(i=0; i<2; i++) { + post_fbtex[i].id = post_fbtex_gltexid[i]; + post_fbtex[i].width = 0; + post_fbtex[i].height = 0; + post_fbtex[i].pixels = 0; + + glBindTexture(GL_TEXTURE_2D, post_fbtex[i].id); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + } + return 0; +} + +void post_cleanup(void) +{ + if(post_fbtex_gltexid[0]) { + glDeleteTextures(2, post_fbtex_gltexid); + } + if(rbuf_depth[0]) { + glDeleteRenderbuffers(2, rbuf_depth); + } + if(post_fbo[0]) { + glDeleteFramebuffers(2, post_fbo); + } + + if(sdr_vgn) { + free_program(sdr_vgn); + } +} + +void post_reshape(int x, int y) +{ + int i, ifmt; + + if(x != post_fbtex[0].width || y != post_fbtex[0].height) { + ifmt = opt.srgb ? GL_SRGB_ALPHA : GL_RGBA; + + for(i=0; i<2; i++) { + glBindTexture(GL_TEXTURE_2D, post_fbtex[i].id); + glTexImage2D(GL_TEXTURE_2D, 0, ifmt, x, y, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); + post_fbtex[i].width = x; + post_fbtex[i].height = y; + + glBindRenderbuffer(GL_RENDERBUFFER, rbuf_depth[i]); + glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT24, x, y); + } + + if(!post_fbo[0]) { + glGenFramebuffers(2, post_fbo); + for(i=0; i<2; i++) { + glBindFramebuffer(GL_FRAMEBUFFER, post_fbo[i]); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, post_fbtex_gltexid[i], 0); + glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, rbuf_depth[i]); + } + glBindFramebuffer(GL_FRAMEBUFFER, 0); + } + } +} void overlay(unsigned int tex, float aspect, float alpha) { @@ -20,19 +107,23 @@ void overlay(unsigned int tex, float aspect, float alpha) glDisable(GL_LIGHTING); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - glEnable(GL_TEXTURE_2D); - glBindTexture(GL_TEXTURE_2D, tex); + if(tex) { + glEnable(GL_TEXTURE_2D); + glBindTexture(GL_TEXTURE_2D, tex); + } else { + glDisable(GL_TEXTURE_2D); + } glBegin(GL_QUADS); glColor4f(1, 1, 1, alpha); - glTexCoord2f(0, 1); + glTexCoord2f(0, 0); glVertex2f(-1, -1); - glTexCoord2f(1, 1); - glVertex2f(1, -1); glTexCoord2f(1, 0); + glVertex2f(1, -1); + glTexCoord2f(1, 1); glVertex2f(1, 1); - glTexCoord2f(0, 0); + glTexCoord2f(0, 1); glVertex2f(-1, 1); glEnd(); @@ -45,5 +136,29 @@ void overlay(unsigned int tex, float aspect, float alpha) void overlay_tex(struct texture *tex, float alpha) { - overlay(tex->id, (float)tex->width / tex->height, alpha); + unsigned int tid; + float aspect; + if(tex) { + tid = tex->id; + aspect = (float)tex->width / tex->height; + } else { + tid = 0; + aspect = 1.0f; + } + overlay(tid, aspect, alpha); +} + +void vignette(float r, float g, float b, float offs, float sharp) +{ + glUseProgram(sdr_vgn); + if(vgn_uloc_color >= 0) { + glUniform3f(vgn_uloc_color, r, g, b); + } + if(vgn_uloc_offs >= 0) { + glUniform1f(vgn_uloc_offs, offs); + } + if(vgn_uloc_sharp >= 0) { + glUniform1f(vgn_uloc_sharp, sharp); + } + overlay(0, 1.0, 1.0); }