xerebus: average samples in shader
[erebus2020] / xerebus / src / main.c
index e7c0728..7f288ab 100644 (file)
@@ -1,6 +1,8 @@
 #include <stdio.h>
+#include "opengl.h"
 #include "miniglut.h"
 #include "erebus.h"
+#include "sdr.h"
 
 static void display(void);
 static void reshape(int x, int y);
@@ -18,10 +20,34 @@ static int mouse_x, mouse_y;
 static int drag_x, drag_y;
 static int drag;
 
+static float disp_gamma = 2.2f;
+
 static unsigned int fbtex;
+static unsigned int sdr;
+
+static const char *vs_src =
+       "void main()\n"
+       "{\n"
+       "       gl_Position = ftransform();\n"
+       "       gl_TexCoord[0] = gl_MultiTexCoord0;\n"
+       "}\n";
+
+static const char *ps_src =
+       "uniform sampler2D tex;\n"
+       "uniform float inv_gamma;\n"
+       "\n"
+       "void main()\n"
+       "{\n"
+       "       vec4 texel = texture2D(tex, gl_TexCoord[0].st);\n"
+       "       gl_FragColor.rgb = pow(texel.xyz / texel.w, vec3(inv_gamma));\n"
+       "       gl_FragColor.a = 1.0;\n"
+       "}\n";
+
 
 int main(int argc, char **argv)
 {
+       unsigned int vs, ps;
+
        glutInit(&argc, argv);
        glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
        glutInitWindowSize(1280, 800);
@@ -33,6 +59,17 @@ int main(int argc, char **argv)
        glutMouseFunc(mouse);
        glutMotionFunc(motion);
 
+       if(!(vs = create_vertex_shader(vs_src))) {
+               return 1;
+       }
+       if(!(ps = create_pixel_shader(ps_src))) {
+               return 1;
+       }
+       if(!(sdr = create_program_link(vs, ps, 0))) {
+               return 1;
+       }
+       set_uniform_float(sdr, "inv_gamma", 1.0f / disp_gamma);
+
        if(!(erb = erb_create())) {
                return 1;
        }
@@ -42,7 +79,6 @@ int main(int argc, char **argv)
        glBindTexture(GL_TEXTURE_2D, fbtex);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
-       glEnable(GL_TEXTURE_2D);
 
        glutMainLoop();
        erb_destroy(erb);
@@ -68,6 +104,8 @@ static void display(void)
 
        glClear(GL_COLOR_BUFFER_BIT);
 
+       glUseProgram(sdr);
+
        glBegin(GL_QUADS);
        glColor3f(1, 1, 1);
        glTexCoord2f(0, 0);
@@ -81,8 +119,8 @@ static void display(void)
        glEnd();
 
        if(drag) {
-               glPushAttrib(GL_ENABLE_BIT);
-               glDisable(GL_TEXTURE_2D);
+               glUseProgram(0);
+
                glEnable(GL_LOGIC_OP);
                glLogicOp(GL_XOR);
 
@@ -94,7 +132,7 @@ static void display(void)
                glVertex2f(drag_x, mouse_y);
                glEnd();
 
-               glPopAttrib();
+               glDisable(GL_LOGIC_OP);
        }
 
        glutSwapBuffers();