non-sRGB gamma correction post fix for VR mode
[laserbrain_demo] / src / post.cc
1 #include "opengl.h"
2 #include "app.h"
3 #include "texture.h"    // next_pow2
4
5 static void update_fbtex();
6
7 static unsigned int fb_tex;
8 static int fb_tex_width, fb_tex_height;
9
10 void slow_post(unsigned int sdr)
11 {
12         update_fbtex();
13
14         glBindTexture(GL_TEXTURE_2D, fb_tex);
15         glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, win_width, win_height);
16
17         glPushAttrib(GL_ENABLE_BIT);
18         glDisable(GL_DEPTH_TEST);
19
20         glUseProgram(sdr);
21
22         float umax = (float)win_width / (float)fb_tex_width;
23         float vmax = (float)win_height / (float)fb_tex_height;
24
25         glBegin(GL_QUADS);
26         glTexCoord2f(0, 0);
27         glVertex2f(-1, -1);
28         glTexCoord2f(umax, 0);
29         glVertex2f(1, -1);
30         glTexCoord2f(umax, vmax);
31         glVertex2f(1, 1);
32         glTexCoord2f(0, vmax);
33         glVertex2f(-1, 1);
34         glEnd();
35
36         glPopAttrib();
37 }
38
39 static void update_fbtex()
40 {
41         if(win_width <= fb_tex_width && win_height <= fb_tex_height) {
42                 return;         // nothing to do
43         }
44         if(!fb_tex) {
45                 glGenTextures(1, &fb_tex);
46                 glBindTexture(GL_TEXTURE_2D, fb_tex);
47                 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
48                 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
49         } else {
50                 glBindTexture(GL_TEXTURE_2D, fb_tex);
51         }
52
53         fb_tex_width = next_pow2(win_width);
54         fb_tex_height = next_pow2(win_height);
55         glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, fb_tex_width, fb_tex_height, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
56 }