diff options
-rw-r--r-- | postproc.cpp | 591 |
1 files changed, 591 insertions, 0 deletions
diff --git a/postproc.cpp b/postproc.cpp new file mode 100644 index 0000000..2c64361 --- /dev/null +++ b/postproc.cpp @@ -0,0 +1,591 @@ + +#include <stdio.h> +#include <stdlib.h> +#define GL_GLEXT_PROTOTYPES +#include <GL/gl.h> +#include <GL/glu.h> +#include <GL/glext.h> +#include "SDL.h" + + +static GLfloat Xrot = 0, Yrot = 0, Zrot = 0; +//static GLfloat ClearColor[4] = {0.2, 0.2, 0.9, 0.0}; +static GLfloat ClearColor[4] = {0.0, 0.0, 0.0, 0.0}; +//static GLfloat ClearColor[4] = {1.0, 1.0, 1.0, 1.0}; +static GLfloat NearClip = 5.0, FarClip = 25.0, ViewDist = 7.0; +static GLuint color_tex, depth_tex, render_fb; +static GLhandleARB prog_glsl; + +struct box { + float tx, ty, tz; + float rx, ry, rz, ra; + float sx, sy, sz; + float color[4]; +}; + +#define NUM_BOXES 100 + +struct box Boxes[NUM_BOXES]; + +#define test_opengl_error() test_opengl_error_real(__FILE__,__func__, __LINE__) +void test_opengl_error_real (const char * file, const char* func, int line) +{ + GLenum errCode; + const GLubyte *errString; + + // did we get an error ? + if ((errCode = glGetError ()) != GL_NO_ERROR) + { + printf("============================================================\n"); + printf("OpenGL error at %s:%d\nin function %s\n",file,line,func); + printf("Error code 0x%x :",errCode); + errString = gluErrorString (errCode); + // work around older versions of glu not supporting error 0x0506 + if ((errCode==0x0506)&&(!errString)) + printf("GL_INVALID_FRAMEBUFFER_OPERATION_EXT\n"); + else if (!errString) + printf("Unknown OpenGL error\n"); + else + printf("%s\n", (const char *) errString); + printf("============================================================\n"); + } +} + +static PFNGLGETOBJECTPARAMETERIVARBPROC eglGetObjectParameterivARB =NULL; +static PFNGLGETINFOLOGARBPROC eglGetInfoLogARB =NULL; +static PFNGLCREATESHADEROBJECTARBPROC eglCreateShaderObjectARB =NULL; +static PFNGLSHADERSOURCEARBPROC eglShaderSourceARB =NULL; +static PFNGLCOMPILESHADERARBPROC eglCompileShaderARB =NULL; +static PFNGLCREATEPROGRAMOBJECTARBPROC eglCreateProgramObjectARB =NULL; +static PFNGLATTACHOBJECTARBPROC eglAttachObjectARB =NULL; +static PFNGLLINKPROGRAMARBPROC eglLinkProgramARB =NULL; +static PFNGLUNIFORM1IARBPROC eglUniform1iARB =NULL; +static PFNGLGETUNIFORMLOCATIONARBPROC eglGetUniformLocationARB =NULL; +static PFNGLUSEPROGRAMOBJECTARBPROC eglUseProgramObjectARB =NULL; + +static void vr_glext_glsl_init_exts() +{ + static bool init=false; + if (init) + return; + eglGetObjectParameterivARB=(PFNGLGETOBJECTPARAMETERIVARBPROC)SDL_GL_GetProcAddress("glGetObjectParameterivARB"); + eglGetInfoLogARB=(PFNGLGETINFOLOGARBPROC)SDL_GL_GetProcAddress("glGetInfoLogARB"); + eglCreateShaderObjectARB=(PFNGLCREATESHADEROBJECTARBPROC)SDL_GL_GetProcAddress("glCreateShaderObjectARB"); + eglShaderSourceARB=(PFNGLSHADERSOURCEARBPROC)SDL_GL_GetProcAddress("glShaderSourceARB"); + eglCompileShaderARB=(PFNGLCOMPILESHADERARBPROC)SDL_GL_GetProcAddress("glCompileShaderARB"); + eglCreateProgramObjectARB=(PFNGLCREATEPROGRAMOBJECTARBPROC)SDL_GL_GetProcAddress("glCreateProgramObjectARB"); + eglAttachObjectARB=(PFNGLATTACHOBJECTARBPROC)SDL_GL_GetProcAddress("glAttachObjectARB"); + eglLinkProgramARB=(PFNGLLINKPROGRAMARBPROC)SDL_GL_GetProcAddress("glLinkProgramARB"); + eglUniform1iARB=(PFNGLUNIFORM1IARBPROC)SDL_GL_GetProcAddress("glUniform1iARB"); + eglGetUniformLocationARB=(PFNGLGETUNIFORMLOCATIONARBPROC)SDL_GL_GetProcAddress("glGetUniformLocationARB"); + eglUseProgramObjectARB=(PFNGLUSEPROGRAMOBJECTARBPROC)SDL_GL_GetProcAddress("glUseProgramObjectARB"); +} + + +static void vr_glext_glsl_dump_log(GLhandleARB p,const GLcharARB* shader) +{ + vr_glext_glsl_init_exts(); + GLint log_size; + eglGetObjectParameterivARB(p, GL_OBJECT_INFO_LOG_LENGTH_ARB, &log_size); + if (log_size>1) + { + GLcharARB* s=(GLcharARB*)malloc((log_size+1)*sizeof(GLcharARB)); + eglGetInfoLogARB(p,log_size,NULL,s); + printf("============================================================\n"); + printf("Faulty ARB program. Log (%d bytes) : \n%s\n",log_size,s); + free(s); + printf("Faulty ARB program : \n"); + int lc=0; + printf("\n%4d: ",++lc); + for(int i=0;i<(int)strlen(shader);i++) + { + if (shader[i]=='\n') + printf("\n%4d: ",++lc); + else + printf("%c",shader[i]); + } + printf("\n"); + printf("============================================================\n"); + } +} + +bool vr_glext_glsl_create_program(const GLcharARB* vshader,const GLcharARB* fshader,GLhandleARB* res) +{ + vr_glext_glsl_init_exts(); + GLint ok; + + GLhandleARB vs=eglCreateShaderObjectARB(GL_VERTEX_SHADER_ARB); + GLhandleARB fs=eglCreateShaderObjectARB(GL_FRAGMENT_SHADER_ARB); + eglShaderSourceARB(vs, 1, &vshader,NULL); + eglShaderSourceARB(fs, 1, &fshader,NULL); + eglCompileShaderARB(vs); + vr_glext_glsl_dump_log(vs,vshader); + eglGetObjectParameterivARB(vs,GL_OBJECT_COMPILE_STATUS_ARB,&ok); + if (!ok) + { + printf("compiling vertex shader\n"); + return false; + } + eglCompileShaderARB(fs); + vr_glext_glsl_dump_log(fs,fshader); + eglGetObjectParameterivARB(fs,GL_OBJECT_COMPILE_STATUS_ARB,&ok); + if (!ok) + { + printf("compiling fragment shader\n"); + return false; + } + GLhandleARB p = eglCreateProgramObjectARB(); + eglAttachObjectARB(p,vs); + eglAttachObjectARB(p,fs); + eglLinkProgramARB(p); + vr_glext_glsl_dump_log(p,"(Linking Stage)"); + eglGetObjectParameterivARB(p,GL_OBJECT_LINK_STATUS_ARB,&ok); + if (!ok) + { + printf("linking program\n"); + return false; + } + *res=p; + return true; +} + +char vshader[] = +"void main()" +"{" +" gl_TexCoord[0] = gl_MultiTexCoord0;" +" gl_Position = ftransform();" +"}"; + + +char fshader[] = +"uniform sampler2D depth_texture; \n" +"uniform sampler2D color_texture; \n" +"void main () \n" +"{ \n" +" const float delta = 1.0/1024.0; \n" +" const float half = delta / 2.0; \n" + +#if 0 +" float d1 = float(texture2D(depth_texture, gl_TexCoord[0].xy + vec2(half) + vec2( 10.0 * delta, 0.0))); \n" +" float d2 = float(texture2D(depth_texture, gl_TexCoord[0].xy + vec2(half) + vec2( -10.0 * delta, 0.0))); \n" +" float d3 = float(texture2D(depth_texture, gl_TexCoord[0].xy + vec2(half) + vec2( 8.0 * delta, 8.0 * delta))); \n" +" float d4 = float(texture2D(depth_texture, gl_TexCoord[0].xy + vec2(half) + vec2( -8.0 * delta, 8.0 * delta))); \n" +" float d5 = float(texture2D(depth_texture, gl_TexCoord[0].xy + vec2(half) + vec2( 8.0 * delta, -8.0 * delta))); \n" +" float d6 = float(texture2D(depth_texture, gl_TexCoord[0].xy + vec2(half) + vec2( -8.0 * delta, -8.0 * delta))); \n" +" float d7 = float(texture2D(depth_texture, gl_TexCoord[0].xy + vec2(half) + vec2( 0.0, 10.0 * delta))); \n" +" float d8 = float(texture2D(depth_texture, gl_TexCoord[0].xy + vec2(half) + vec2( 0.0, -10.0 * delta))); \n" +" float d9 = float(texture2D(depth_texture, gl_TexCoord[0].xy + vec2(half) + vec2( 8.0 * delta, 8.0 * delta))); \n" +" float da = float(texture2D(depth_texture, gl_TexCoord[0].xy + vec2(half) + vec2( 8.0 * delta, -8.0 * delta))); \n" +" float db = float(texture2D(depth_texture, gl_TexCoord[0].xy + vec2(half) + vec2( -8.0 * delta, 8.0 * delta))); \n" +" float dc = float(texture2D(depth_texture, gl_TexCoord[0].xy + vec2(half) + vec2( -8.0 * delta, -8.0 * delta))); \n" + +" float ds1 = float(texture2D(depth_texture, gl_TexCoord[0].xy + vec2(half) + vec2( 7.0 * delta, 0.0))); \n" +" float ds2 = float(texture2D(depth_texture, gl_TexCoord[0].xy + vec2(half) + vec2( -7.0 * delta, 0.0))); \n" +" float ds3 = float(texture2D(depth_texture, gl_TexCoord[0].xy + vec2(half) + vec2( 5.0 * delta, 5.0 * delta))); \n" +" float ds4 = float(texture2D(depth_texture, gl_TexCoord[0].xy + vec2(half) + vec2( -5.0 * delta, 5.0 * delta))); \n" +" float ds5 = float(texture2D(depth_texture, gl_TexCoord[0].xy + vec2(half) + vec2( 5.0 * delta, -5.0 * delta))); \n" +" float ds6 = float(texture2D(depth_texture, gl_TexCoord[0].xy + vec2(half) + vec2( -5.0 * delta, -5.0 * delta))); \n" +" float ds7 = float(texture2D(depth_texture, gl_TexCoord[0].xy + vec2(half) + vec2( 0.0, 7.0 * delta))); \n" +" float ds8 = float(texture2D(depth_texture, gl_TexCoord[0].xy + vec2(half) + vec2( 0.0, -7.0 * delta))); \n" +" float ds9 = float(texture2D(depth_texture, gl_TexCoord[0].xy + vec2(half) + vec2( 5.0 * delta, 5.0 * delta))); \n" +" float dsa = float(texture2D(depth_texture, gl_TexCoord[0].xy + vec2(half) + vec2( 5.0 * delta, -5.0 * delta))); \n" +" float dsb = float(texture2D(depth_texture, gl_TexCoord[0].xy + vec2(half) + vec2( -5.0 * delta, 5.0 * delta))); \n" +" float dsc = float(texture2D(depth_texture, gl_TexCoord[0].xy + vec2(half) + vec2( -5.0 * delta, -5.0 * delta))); \n" + +" float dc1 = float(texture2D(depth_texture, gl_TexCoord[0].xy + vec2(half) + vec2( 3.0 * delta, 0.0))); \n" +" float dc2 = float(texture2D(depth_texture, gl_TexCoord[0].xy + vec2(half) + vec2( -3.0 * delta, 0.0))); \n" +" float dc3 = float(texture2D(depth_texture, gl_TexCoord[0].xy + vec2(half) + vec2( 2.0 * delta, 2.0 * delta))); \n" +" float dc4 = float(texture2D(depth_texture, gl_TexCoord[0].xy + vec2(half) + vec2( -2.0 * delta, 2.0 * delta))); \n" +" float dc5 = float(texture2D(depth_texture, gl_TexCoord[0].xy + vec2(half) + vec2( 2.0 * delta, -2.0 * delta))); \n" +" float dc6 = float(texture2D(depth_texture, gl_TexCoord[0].xy + vec2(half) + vec2( -2.0 * delta, -2.0 * delta))); \n" +" float dc7 = float(texture2D(depth_texture, gl_TexCoord[0].xy + vec2(half) + vec2( 0.0, 3.0 * delta))); \n" +" float dc8 = float(texture2D(depth_texture, gl_TexCoord[0].xy + vec2(half) + vec2( 0.0, -3.0 * delta))); \n" +" float dc9 = float(texture2D(depth_texture, gl_TexCoord[0].xy + vec2(half) + vec2( 2.0 * delta, 2.0 * delta))); \n" +" float dca = float(texture2D(depth_texture, gl_TexCoord[0].xy + vec2(half) + vec2( 2.0 * delta, -2.0 * delta))); \n" +" float dcb = float(texture2D(depth_texture, gl_TexCoord[0].xy + vec2(half) + vec2( -2.0 * delta, 2.0 * delta))); \n" +" float dcc = float(texture2D(depth_texture, gl_TexCoord[0].xy + vec2(half) + vec2( -2.0 * delta, -2.0 * delta))); \n" + +" float d = float(texture2D(depth_texture, gl_TexCoord[0].xy )); \n" +" float fd = (1.0/3.0 * (d1 + d2 + d3 + d4 + d5 + d6 + d7 + d8 + d9 + da + db + dc) + 2.0/3.0 * (ds1 + ds2 + ds3 + ds4 + ds5 + ds6 + ds7 + ds8 + ds9 + dsa + dsb + dsc) + dc1 + dc2 + dc3 + dc4 + dc5 + dc6 + dc7 + dc8 + dc9 + dca + dcb + dcc +d)/25.0 - d; \n" +//" float fd = ((d1 + d2 + d3 + d4 + d5 + d6 + d7 + d8 + d9 + da + db + dc) + d)/13.0 - d; \n" +#else +" float d = 0.0; \n" + +" d += 0.505480 * float(texture2D(depth_texture, gl_TexCoord[0].xy + vec2(half) + vec2(0.695047 * delta,7.355039 * delta)));\n" +" d += 0.220702 * float(texture2D(depth_texture, gl_TexCoord[0].xy + vec2(half) + vec2(5.121977 * delta,-9.728344 * delta)));\n" +" d += 0.543350 * float(texture2D(depth_texture, gl_TexCoord[0].xy + vec2(half) + vec2(-0.606182 * delta,6.959354 * delta)));\n" +" d += 0.743143 * float(texture2D(depth_texture, gl_TexCoord[0].xy + vec2(half) + vec2(-4.867543 * delta,-0.237501 * delta)));\n" +" d += 0.558876 * float(texture2D(depth_texture, gl_TexCoord[0].xy + vec2(half) + vec2(-1.481525 * delta,-6.659680 * delta)));\n" +" d += 0.932282 * float(texture2D(depth_texture, gl_TexCoord[0].xy + vec2(half) + vec2(-2.215878 * delta,0.836371 * delta)));\n" +" d += 0.210786 * float(texture2D(depth_texture, gl_TexCoord[0].xy + vec2(half) + vec2(4.699031 * delta,10.122847 * delta)));\n" +" d += 0.242755 * float(texture2D(depth_texture, gl_TexCoord[0].xy + vec2(half) + vec2(5.846053 * delta,8.892679 * delta)));\n" +" d += 0.987660 * float(texture2D(depth_texture, gl_TexCoord[0].xy + vec2(half) + vec2(-0.761120 * delta,0.643427 * delta)));\n" +" d += 0.985361 * float(texture2D(depth_texture, gl_TexCoord[0].xy + vec2(half) + vec2(-0.218133 * delta,-1.064058 * delta)));\n" +" d += 0.753374 * float(texture2D(depth_texture, gl_TexCoord[0].xy + vec2(half) + vec2(2.938722 * delta,3.744242 * delta)));\n" +" d += 0.403444 * float(texture2D(depth_texture, gl_TexCoord[0].xy + vec2(half) + vec2(4.737152 * delta,7.083564 * delta)));\n" +" d += 0.206273 * float(texture2D(depth_texture, gl_TexCoord[0].xy + vec2(half) + vec2(-7.325160 * delta,8.522102 * delta)));\n" +" d += 0.831194 * float(texture2D(depth_texture, gl_TexCoord[0].xy + vec2(half) + vec2(3.334447 * delta,-1.916467 * delta)));\n" +" d += 0.475257 * float(texture2D(depth_texture, gl_TexCoord[0].xy + vec2(half) + vec2(-1.215176 * delta,-7.618093 * delta)));\n" +" d += 0.920091 * float(texture2D(depth_texture, gl_TexCoord[0].xy + vec2(half) + vec2(-1.202422 * delta,-2.284027 * delta)));\n" +" d += 0.300928 * float(texture2D(depth_texture, gl_TexCoord[0].xy + vec2(half) + vec2(-2.672836 * delta,-9.430100 * delta)));\n" +" d += 0.425978 * float(texture2D(depth_texture, gl_TexCoord[0].xy + vec2(half) + vec2(1.773709 * delta,8.069904 * delta)));\n" +" d += 0.579018 * float(texture2D(depth_texture, gl_TexCoord[0].xy + vec2(half) + vec2(-0.293382 * delta,6.605125 * delta)));\n" +" d += 0.883902 * float(texture2D(depth_texture, gl_TexCoord[0].xy + vec2(half) + vec2(2.890216 * delta,-1.232641 * delta)));\n" +" d += 0.735226 * float(texture2D(depth_texture, gl_TexCoord[0].xy + vec2(half) + vec2(4.188049 * delta,2.658273 * delta)));\n" +" d += 0.817384 * float(texture2D(depth_texture, gl_TexCoord[0].xy + vec2(half) + vec2(1.743708 * delta,3.618174 * delta)));\n" +" d += 0.462156 * float(texture2D(depth_texture, gl_TexCoord[0].xy + vec2(half) + vec2(-7.668356 * delta,-1.715950 * delta)));\n" +" d += 0.357720 * float(texture2D(depth_texture, gl_TexCoord[0].xy + vec2(half) + vec2(2.648421 * delta,-8.673310 * delta)));\n" +" d += 0.443542 * float(texture2D(depth_texture, gl_TexCoord[0].xy + vec2(half) + vec2(-0.123771 * delta,8.063602 * delta)));\n" +" d += 0.439365 * float(texture2D(depth_texture, gl_TexCoord[0].xy + vec2(half) + vec2(6.855833 * delta,-4.334925 * delta)));\n" +" d += 0.785900 * float(texture2D(depth_texture, gl_TexCoord[0].xy + vec2(half) + vec2(3.040863 * delta,-3.166581 * delta)));\n" +" d += 0.392074 * float(texture2D(depth_texture, gl_TexCoord[0].xy + vec2(half) + vec2(3.127253 * delta,-8.069988 * delta)));\n" +" d += 0.533866 * float(texture2D(depth_texture, gl_TexCoord[0].xy + vec2(half) + vec2(7.060996 * delta,-0.592556 * delta)));\n" +" d += 0.599526 * float(texture2D(depth_texture, gl_TexCoord[0].xy + vec2(half) + vec2(2.694366 * delta,5.802559 * delta)));\n" +" d /= 17.276613;\n" + +" float fd = d - float(texture2D(depth_texture, gl_TexCoord[0].xy )); \n" +#endif +" fd = fd * 25.0;\n" +" if (fd>0.0) fd = 0.0; \n" +" vec4 cs = texture2D(color_texture, gl_TexCoord[0].xy); \n" + +/* +" float luminance = 0.3 * cs.r + 0.59 * cs.g + 0.11 * cs.b; \n" +" cs = 0.8 * cs + (0.2 *(1.0 - d)) * cs + 0.2 * (d) * vec4(0.5); \n" +*/ + "vec4 c = vec4(0.0);\n" + "vec4 cl = vec4(0.0);\n" + "vec4 sample;\n" + + + +" sample = vec4(0.161729) * texture2D(color_texture, gl_TexCoord[0].xy + vec2(-12.071574 * delta, 0.153622 * delta) );\n" +" c += sample;\n" +" cl = max(cl, sample);\n" +" sample = vec4(0.421053) * texture2D(color_texture, gl_TexCoord[0].xy + vec2(-0.944107 * delta, -8.264892 * delta) );\n" +" c += sample;\n" +" cl = max(cl, sample);\n" +" sample = vec4(0.051966) * texture2D(color_texture, gl_TexCoord[0].xy + vec2(-4.213698 * delta, -14.792520 * delta) );\n" +" c += sample;\n" +" cl = max(cl, sample);\n" +" sample = vec4(0.341270) * texture2D(color_texture, gl_TexCoord[0].xy + vec2(6.621652 * delta, 6.493092 * delta) );\n" +" c += sample;\n" +" cl = max(cl, sample);\n" +" sample = vec4(0.391833) * texture2D(color_texture, gl_TexCoord[0].xy + vec2(6.028410 * delta, -6.213845 * delta) );\n" +" c += sample;\n" +" cl = max(cl, sample);\n" +" sample = vec4(0.583215) * texture2D(color_texture, gl_TexCoord[0].xy + vec2(-5.705786 * delta, -3.252683 * delta) );\n" +" c += sample;\n" +" cl = max(cl, sample);\n" +" sample = vec4(0.060565) * texture2D(color_texture, gl_TexCoord[0].xy + vec2(14.832157 * delta, 2.080770 * delta) );\n" +" c += sample;\n" +" cl = max(cl, sample);\n" +" sample = vec4(0.140813) * texture2D(color_texture, gl_TexCoord[0].xy + vec2(-12.243018 * delta, -2.633351 * delta) );\n" +" c += sample;\n" +" cl = max(cl, sample);\n" +" sample = vec4(0.436842) * texture2D(color_texture, gl_TexCoord[0].xy + vec2(-0.602685 * delta, -8.117351 * delta) );\n" +" c += sample;\n" +" cl = max(cl, sample);\n" +" sample = vec4(0.218144) * texture2D(color_texture, gl_TexCoord[0].xy + vec2(-7.784732 * delta, 7.823411 * delta) );\n" +" c += sample;\n" +" cl = max(cl, sample);\n" +" sample = vec4(0.999171) * texture2D(color_texture, gl_TexCoord[0].xy + vec2(-0.043027 * delta, -0.253957 * delta) );\n" +" c += sample;\n" +" cl = max(cl, sample);\n" +" sample = vec4(0.935022) * texture2D(color_texture, gl_TexCoord[0].xy + vec2(-2.315059 * delta, -0.123630 * delta) );\n" +" c += sample;\n" +" cl = max(cl, sample);\n" +" sample = vec4(0.999983) * texture2D(color_texture, gl_TexCoord[0].xy + vec2(0.005478 * delta, -0.036014 * delta) );\n" +" c += sample;\n" +" cl = max(cl, sample);\n" +" sample = vec4(0.691448) * texture2D(color_texture, gl_TexCoord[0].xy + vec2(-2.251168 * delta, -4.944656 * delta) );\n" +" c += sample;\n" +" cl = max(cl, sample);\n" +" sample = vec4(0.093066) * texture2D(color_texture, gl_TexCoord[0].xy + vec2(11.980635 * delta, -6.813206 * delta) );\n" +" c += sample;\n" +" cl = max(cl, sample);\n" +" sample = vec4(0.421495) * texture2D(color_texture, gl_TexCoord[0].xy + vec2(7.886395 * delta, 2.630699 * delta) );\n" +" c += sample;\n" +" cl = max(cl, sample);\n" +" sample = vec4(0.405684) * texture2D(color_texture, gl_TexCoord[0].xy + vec2(-8.258098 * delta, 1.994588 * delta) );\n" +" c += sample;\n" +" cl = max(cl, sample);\n" +" sample = vec4(0.990040) * texture2D(color_texture, gl_TexCoord[0].xy + vec2(-0.682021 * delta, 0.579320 * delta) );\n" +" c += sample;\n" +" cl = max(cl, sample);\n" +" sample = vec4(0.431295) * texture2D(color_texture, gl_TexCoord[0].xy + vec2(0.163248 * delta, -8.200633 * delta) );\n" +" c += sample;\n" +" cl = max(cl, sample);\n" +" sample = vec4(0.662642) * texture2D(color_texture, gl_TexCoord[0].xy + vec2(1.552690 * delta, -5.523653 * delta) );\n" +" c += sample;\n" +" cl = max(cl, sample);\n" +" c /= vec4(9.437279);\n" +// border extraction filter +" vec4 fc = (2.0 * cs - c ) ; \n" + + +// bloom +" float luminance = 0.3 * cl.r + 0.59 * cl.g + 0.11 * cl.b; \n" +" luminance *= luminance; \n" +" luminance *= luminance; \n" +" luminance *= luminance; \n" +" gl_FragColor = (fc + vec4(fd)) * vec4(1.0 + 1.0 * luminance) ; \n" +//" gl_FragColor = fc; \n" +//" gl_FragColor = texture2D(color_texture, gl_TexCoord[0].xy); \n" +//" gl_FragColor = 1.0 + vec4(fd); \n" +//" gl_FragColor = vec4(d); \n" +"} \n" +; + + + + +/* Return random float in [0,1] */ +static float Random(void) +{ + int i = rand(); + return (float) (i % 1000) / 1000.0; +} + + +static void MakeBoxes(void) +{ + int i; + for (i = 0; i < NUM_BOXES; i++) { + Boxes[i].tx = -1.0 + 2.0 * Random(); + Boxes[i].ty = -1.0 + 2.0 * Random(); + Boxes[i].tz = -1.0 + 2.0 * Random(); + Boxes[i].sx = 0.1 + Random() * 0.4; + Boxes[i].sy = 0.1 + Random() * 0.4; + Boxes[i].sz = 0.1 + Random() * 0.4; + Boxes[i].rx = Random(); + Boxes[i].ry = Random(); + Boxes[i].rz = Random(); + Boxes[i].ra = Random() * 360.0; + Boxes[i].color[0] = 0.2 + 0.8*Random(); + Boxes[i].color[1] = 0.2 + 0.8*Random(); + Boxes[i].color[2] = 0.2 + 0.8*Random(); + Boxes[i].color[3] = 1.0; + } +} + +static void +drawBox(GLfloat size, GLenum type) +{ + static GLfloat n[6][3] = + { + {-1.0, 0.0, 0.0}, + {0.0, 1.0, 0.0}, + {1.0, 0.0, 0.0}, + {0.0, -1.0, 0.0}, + {0.0, 0.0, 1.0}, + {0.0, 0.0, -1.0} + }; + static GLint faces[6][4] = + { + {0, 1, 2, 3}, + {3, 2, 6, 7}, + {7, 6, 5, 4}, + {4, 5, 1, 0}, + {5, 6, 2, 1}, + {7, 4, 0, 3} + }; + GLfloat v[8][3]; + GLint i; + + v[0][0] = v[1][0] = v[2][0] = v[3][0] = -size / 2; + v[4][0] = v[5][0] = v[6][0] = v[7][0] = size / 2; + v[0][1] = v[1][1] = v[4][1] = v[5][1] = -size / 2; + v[2][1] = v[3][1] = v[6][1] = v[7][1] = size / 2; + v[0][2] = v[3][2] = v[4][2] = v[7][2] = -size / 2; + v[1][2] = v[2][2] = v[5][2] = v[6][2] = size / 2; + + for (i = 5; i >= 0; i--) { + glBegin(type); + glNormal3fv(&n[i][0]); + glVertex3fv(&v[faces[i][0]][0]); + glVertex3fv(&v[faces[i][1]][0]); + glVertex3fv(&v[faces[i][2]][0]); + glVertex3fv(&v[faces[i][3]][0]); + glEnd(); + } +} + + + + +static void DrawBoxes(void) +{ + int i; + for (i = 0; i < NUM_BOXES; i++) { + glPushMatrix(); + glTranslatef(Boxes[i].tx, Boxes[i].ty, Boxes[i].tz); + glRotatef(Boxes[i].ra, Boxes[i].rx, Boxes[i].ry, Boxes[i].rz); + glScalef(Boxes[i].sx, Boxes[i].sy, Boxes[i].sz); + glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, Boxes[i].color); + drawBox(1.0, GL_QUADS); + glPopMatrix(); + } +} + + + +static void Draw(void) +{ + // render data to offscreen color+depth buffer + glBindFramebuffer(GL_FRAMEBUFFER_EXT, render_fb); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + eglUseProgramObjectARB(0); + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + glFrustum(-1.0, 1.0, -1.0, 1.0, NearClip, FarClip); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + glTranslatef(0.0, 0.0, -ViewDist); + glRotatef(Xrot, 1, 0, 0); + glRotatef(Yrot, 0, 1, 0); + glRotatef(Zrot, 0, 0, 1); + + glActiveTextureARB( GL_TEXTURE1_ARB ); + glDisable(GL_TEXTURE_3D); + glDisable(GL_TEXTURE_2D); + glActiveTextureARB( GL_TEXTURE0_ARB ); + glDisable(GL_TEXTURE_3D); + glDisable(GL_TEXTURE_2D); + glEnable(GL_LIGHTING); + glDepthFunc(GL_LESS); + DrawBoxes(); + + + // now postprocess to front buffer + glBindFramebuffer(GL_FRAMEBUFFER_EXT, 0); + eglUseProgramObjectARB(prog_glsl); + + glActiveTextureARB( GL_TEXTURE1_ARB ); + glBindTexture(GL_TEXTURE_2D, color_tex); + glDisable(GL_TEXTURE_3D); + glEnable(GL_TEXTURE_2D); + eglUniform1iARB(eglGetUniformLocationARB(prog_glsl, "color_texture"),1); + + + glActiveTextureARB( GL_TEXTURE0_ARB ); + glBindTexture(GL_TEXTURE_2D, depth_tex); + glDisable(GL_TEXTURE_3D); + glEnable(GL_TEXTURE_2D); + eglUniform1iARB(eglGetUniformLocationARB(prog_glsl, "depth_texture"),0); + + glColor4f(1.0,1.0,1.0,1.0); + + + + glDisable(GL_LIGHTING); + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + glBegin(GL_QUADS); + glTexCoord2f(0.0, 0.0); glVertex2f(-1.0, -1.0); + glTexCoord2f(1.0, 0.0); glVertex2f(1.0, -1.0); + glTexCoord2f(1.0, 1.0); glVertex2f(1.0, 1.0); + glTexCoord2f(0.0, 1.0); glVertex2f(-1.0, 1.0); + glEnd(); + + test_opengl_error(); + + SDL_GL_SwapBuffers(); +} + + +static void Reshape(int width, int height) +{ + glViewport(0, 0, width, height); + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + glFrustum(-1.0, 1.0, -1.0, 1.0, NearClip, FarClip); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + glTranslatef(0.0, 0.0, -ViewDist); +} + + +static void Init(int w,int h) +{ + SDL_Init(SDL_INIT_EVERYTHING); + SDL_GL_SetAttribute( SDL_GL_RED_SIZE, 5 ); + SDL_GL_SetAttribute( SDL_GL_GREEN_SIZE, 5 ); + SDL_GL_SetAttribute( SDL_GL_BLUE_SIZE, 5 ); + SDL_GL_SetAttribute( SDL_GL_DEPTH_SIZE, 0 ); + SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 ); + SDL_SetVideoMode(w, h, 0, SDL_OPENGL); + Reshape(w, h); + + glClearColor(ClearColor[0], ClearColor[1], ClearColor[2], ClearColor[3]); + glEnable(GL_DEPTH_TEST); + glEnable(GL_LIGHTING); + glEnable(GL_LIGHT0); + glEnable(GL_CULL_FACE); + glEnable(GL_NORMALIZE); + MakeBoxes(); + + + glGenFramebuffersEXT(1, &render_fb); + glBindFramebuffer(GL_FRAMEBUFFER_EXT, render_fb); + + + // color buffer stuff + glGenTextures(1,&color_tex); + glBindTexture(GL_TEXTURE_2D, color_tex); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); + + // depth buffer stuff + glGenTextures(1,&depth_tex); + glBindTexture(GL_TEXTURE_2D, depth_tex); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexImage2D( GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, w, h, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, NULL); + glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP ); + glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP ); + + // Attach texture to FBO + glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, color_tex, 0); + glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_2D, depth_tex, 0); + test_opengl_error(); + + if ( !vr_glext_glsl_create_program(vshader,fshader,&prog_glsl) ) + return; +} + + + +int main(int argc, char *argv[]) +{ + Init(1024,1024); + bool quit=false; + do + { + Draw(); + + double dt = 0.012; + Xrot += 16.0 * dt; + Yrot += 12.0 * dt; + Zrot += 8.0 * dt; + + SDL_Event event; + while(SDL_PollEvent(&event)>0) + { + switch(event.type) + { + case SDL_KEYDOWN: + case SDL_QUIT: + quit = true; + } + } + } + while(!quit); + + return 0; +} |