# HG changeset patch # User John Tsiombikas # Date 1345432318 -10800 # Node ID d98240a13793a36108b0a26e284ab7416e567aa2 # Parent 91180ee7b7d943d13f8c6a26b86fba5fac1c4285 lalala diff -r 91180ee7b7d9 -r d98240a13793 prototype/Makefile --- a/prototype/Makefile Mon Aug 20 03:40:51 2012 +0300 +++ b/prototype/Makefile Mon Aug 20 06:11:58 2012 +0300 @@ -4,7 +4,11 @@ dep = $(obj:.o=.d) bin = proto -CFLAGS = -pedantic -Wall -g -Ivmath +#opt = -O3 +dbg = -g +warn = -Wall -Wno-format-extra-args -Wno-char-subscripts + +CFLAGS = -pedantic $(warn) $(dbg) $(opt) -Ivmath CXXFLAGS = $(CFLAGS) -std=c++11 LDFLAGS = $(libgl) -lm -lassimpD -limago diff -r 91180ee7b7d9 -r d98240a13793 prototype/sdr/deferred.p.glsl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/prototype/sdr/deferred.p.glsl Mon Aug 20 06:11:58 2012 +0300 @@ -0,0 +1,4 @@ +void main() +{ + gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); +} diff -r 91180ee7b7d9 -r d98240a13793 prototype/sdr/mrt.p.glsl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/prototype/sdr/mrt.p.glsl Mon Aug 20 06:11:58 2012 +0300 @@ -0,0 +1,7 @@ +uniform sampler2D tex_dif; + +void main() +{ + vec4 texel = texture2D(tex_dif, gl_TexCoord[0].st); + gl_FragColor = texel; +} diff -r 91180ee7b7d9 -r d98240a13793 prototype/sdr/mrt0.p.glsl --- a/prototype/sdr/mrt0.p.glsl Mon Aug 20 03:40:51 2012 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,7 +0,0 @@ -uniform sampler2D tex_dif; - -void main() -{ - vec4 texel = texture2D(tex_dif, gl_TexCoord[0].st); - gl_FragColor = texel; -} diff -r 91180ee7b7d9 -r d98240a13793 prototype/src/main.cc --- a/prototype/src/main.cc Mon Aug 20 03:40:51 2012 +0300 +++ b/prototype/src/main.cc Mon Aug 20 06:11:58 2012 +0300 @@ -9,7 +9,7 @@ #include "tileset.h" #include "renderer.h" -bool init(); +bool init(int xsz, int ysz); void cleanup(); void idle(); void disp(); @@ -31,6 +31,8 @@ int main(int argc, char **argv) { + int xsz, ysz; + glutInit(&argc, argv); if(argc > 1) { @@ -40,6 +42,8 @@ glutInitWindowSize(800, 600); glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE | GLUT_MULTISAMPLE); glutCreateWindow("prototype"); + xsz = glutGet(GLUT_WINDOW_WIDTH); + ysz = glutGet(GLUT_WINDOW_HEIGHT); glutIdleFunc(idle); glutDisplayFunc(disp); @@ -51,14 +55,14 @@ glewInit(); - if(!init()) { + if(!init(xsz, ysz)) { return 1; } glutMainLoop(); } -bool init() +bool init(int xsz, int ysz) { glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); @@ -73,7 +77,7 @@ add_data_path("data"); add_data_path("sdr"); - if(!init_renderer()) { + if(!init_renderer(xsz, ysz)) { return false; } diff -r 91180ee7b7d9 -r d98240a13793 prototype/src/renderer.cc --- a/prototype/src/renderer.cc Mon Aug 20 03:40:51 2012 +0300 +++ b/prototype/src/renderer.cc Mon Aug 20 06:11:58 2012 +0300 @@ -7,40 +7,119 @@ #include "sdr.h" #include "datapath.h" -#define MRT_COUNT (sizeof mrt_sdr_file / sizeof *mrt_sdr_file) +static bool create_fbo(int xsz, int ysz); +static bool load_shaders(); +static int round_pow2(int x); -static const char *mrt_sdr_file[][2] = { - {0, "mrt0.p.glsl"}/*, - {0, "mrt1.p.glsl"}, - {0, "mrt2.p.glsl"}, - {0, "mrt3.p.glsl"}*/ + +#define MRT_COUNT 4 +static unsigned int mrt_tex[MRT_COUNT]; + +static unsigned int mrt_prog; +static unsigned int deferred_omni; + +static unsigned int fbo, rbuf_depth; +static const char *fbstname[] = { + "GL_FRAMEBUFFER_COMPLETE", + "GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT", + "GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT", + "no such fbo error", + "GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS", + "GL_FRAMEBUFFER_INCOMPLETE_FORMATS", + "GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER", + "GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER", + "GL_FRAMEBUFFER_UNSUPPORTED" }; -static unsigned int mrt_prog[MRT_COUNT]; -static unsigned int deferred_prog; +static int fb_xsz, fb_ysz, tex_xsz, tex_ysz; -bool init_renderer() +bool init_renderer(int xsz, int ysz) +{ + if(!create_fbo(xsz, ysz)) { + return false; + } + if(!load_shaders()) { + return false; + } + return true; +} + +void destroy_renderer() +{ + free_program(mrt_prog); + free_program(deferred_omni); + + glDeleteTextures(MRT_COUNT, mrt_tex); + glDeleteFramebuffersEXT(1, &fbo); +} + +void render_deferred(void (*draw_func)()) +{ + bind_program(mrt_prog); + draw_func(); + bind_program(0); +} + +static bool create_fbo(int xsz, int ysz) +{ + unsigned int clamp = GL_ARB_texture_border_clamp ? GL_CLAMP_TO_EDGE : GL_CLAMP; + + tex_xsz = round_pow2(xsz); + tex_ysz = round_pow2(ysz); + fb_xsz = xsz; + fb_ysz = ysz; + + if(!glGenFramebuffersEXT) { + fprintf(stderr, "FBO support missing\n"); + return false; + } + glGenFramebuffersEXT(1, &fbo); + + glGenRenderbuffersEXT(1, &rbuf_depth); + glBindRenderbufferEXT(GL_RENDERBUFFER, rbuf_depth); + glRenderbufferStorageEXT(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, tex_xsz, tex_ysz); + glFramebufferRenderbufferEXT(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, rbuf_depth); + + glGenTextures(MRT_COUNT, mrt_tex); + for(int i=0; i> 1) | x; + x = (x >> 2) | x; + x = (x >> 4) | x; + x = (x >> 8) | x; + x = (x >> 16) | x; + return x + 1; } - -void render_deferred(void (*draw_func)()) -{ - - - draw_func(); -} diff -r 91180ee7b7d9 -r d98240a13793 prototype/src/renderer.h --- a/prototype/src/renderer.h Mon Aug 20 03:40:51 2012 +0300 +++ b/prototype/src/renderer.h Mon Aug 20 06:11:58 2012 +0300 @@ -1,7 +1,7 @@ #ifndef RENDERER_H_ #define RENDERER_H_ -bool init_renderer(); +bool init_renderer(int xsz, int ysz); void destroy_renderer(); void render_deferred(void (*draw_func)()); diff -r 91180ee7b7d9 -r d98240a13793 prototype/src/sdr.c --- a/prototype/src/sdr.c Mon Aug 20 03:40:51 2012 +0300 +++ b/prototype/src/sdr.c Mon Aug 20 06:11:58 2012 +0300 @@ -173,10 +173,10 @@ { unsigned int vs = 0, ps = 0; - if(vfile && !(vs = get_vertex_shader(vfile))) { + if(vfile && *vfile && !(vs = get_vertex_shader(vfile))) { return 0; } - if(pfile && !(ps = get_pixel_shader(pfile))) { + if(pfile && *pfile && !(ps = get_pixel_shader(pfile))) { return 0; } return create_program_link(vs, ps);