#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);
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);
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;
}
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);
glClear(GL_COLOR_BUFFER_BIT);
+ glUseProgram(sdr);
+
glBegin(GL_QUADS);
glColor3f(1, 1, 1);
glTexCoord2f(0, 0);
glEnd();
if(drag) {
- glPushAttrib(GL_ENABLE_BIT);
- glDisable(GL_TEXTURE_2D);
+ glUseProgram(0);
+
glEnable(GL_LOGIC_OP);
glLogicOp(GL_XOR);
glVertex2f(drag_x, mouse_y);
glEnd();
- glPopAttrib();
+ glDisable(GL_LOGIC_OP);
}
glutSwapBuffers();