tests: added persp_hint.c test
authorBrian Paul <brianp@vmware.com>
Fri, 12 Jun 2009 21:58:34 +0000 (15:58 -0600)
committerBrian Paul <brianp@vmware.com>
Fri, 12 Jun 2009 21:59:53 +0000 (15:59 -0600)
Test the effect of GL_PERSPECTIVE_CORRECTION_HINT on color interpolation.

progs/tests/Makefile
progs/tests/SConscript
progs/tests/persp_hint.c [new file with mode: 0644]

index f3f1aea9442a56a48871c3068b1032707c7efc03..23fe3c35c1ff96a235e1512b4a2a580ffb338fbe 100644 (file)
@@ -67,6 +67,7 @@ SOURCES = \
        no_s3tc.c \
        packedpixels.c \
        pbo.c \
+       persp_hint.c \
        prog_parameter.c \
        quads.c \
        random.c \
index 9d89ff6a0d019cf3f6fe8846b042986db589135a..9e3a646f806a4fcc539d0804d55f44ea1db30d58 100644 (file)
@@ -90,6 +90,7 @@ progs = [
     'no_s3tc',
     'packedpixels',
     'pbo',
+    'persp_hint',
     'prog_parameter',
     'quads',
     'random',
diff --git a/progs/tests/persp_hint.c b/progs/tests/persp_hint.c
new file mode 100644 (file)
index 0000000..27140d1
--- /dev/null
@@ -0,0 +1,149 @@
+/*
+ * Test the GL_PERSPECTIVE_CORRECTION_HINT setting and its effect on
+ * color interpolation.
+ *
+ * Press 'i' to toggle between GL_NICEST/GL_FASTEST/GL_DONT_CARE.
+ *
+ * Depending on the driver, the hint may make a difference, or not.
+ */
+
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <GL/glut.h>
+
+
+static GLenum PerspHint = GL_DONT_CARE;
+
+
+static void
+init(void)
+{
+   GLubyte image[256][256][4];
+   GLuint i, j;
+   for (i = 0; i < 256; i++) {
+      for (j = 0; j < 256; j++) {
+         image[i][j][0] = j;
+         image[i][j][1] = j;
+         image[i][j][2] = j;
+         image[i][j][3] = 255;
+      }
+   }
+   glTexImage2D(GL_TEXTURE_2D, 0, 4, 256, 256, 0,
+                GL_RGBA, GL_UNSIGNED_BYTE, image);
+   glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+   glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+   glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+   glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+   glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
+
+   printf("GL_RENDERER = %s\n", (char *) glGetString(GL_RENDERER));
+}
+
+
+static void
+display(void)
+{
+   switch (PerspHint) {
+   case GL_NICEST:
+      printf("hint = GL_NICEST\n");
+      break;
+   case GL_FASTEST:
+      printf("hint = GL_FASTEST\n");
+      break;
+   case GL_DONT_CARE:
+      printf("hint = GL_DONT_CARE\n");
+      break;
+   default:
+      ;
+   }
+
+   glClear(GL_COLOR_BUFFER_BIT);
+
+#if 1
+   glBegin(GL_QUADS);
+   /* exercise perspective interpolation */
+   glColor3f(0.0, 0.0, 0.0); glVertex3f(-1.0, -1.0, -1.0);
+   glColor3f(0.0, 0.0, 0.0); glVertex3f(-1.0, 1.0, -1.0);
+   glColor3f(0.0, 1.0, 0.0); glVertex3f( 7.0, 1.0, -7.0);
+   glColor3f(0.0, 1.0, 0.0); glVertex3f( 7.0, -1.0, -7.0);
+
+   /* stripe of linear interpolation */
+   glColor3f(0.0, 0.0, 0.0); glVertex3f(-1.0, -0.1, -1.001);
+   glColor3f(0.0, 0.0, 0.0); glVertex3f(-1.0,  0.1, -1.001);
+   glColor3f(0.0, 1.0, 0.0); glVertex3f( 1.0,  0.1, -1.001);
+   glColor3f(0.0, 1.0, 0.0); glVertex3f( 1.0, -0.1, -1.001);
+   glEnd();
+#else
+   glEnable(GL_TEXTURE_2D);
+   glBegin(GL_QUADS);
+   glTexCoord2f(0.0, 0.0); glVertex3f(-1.0, 0.0, -1.0);
+   glTexCoord2f(0.0, 1.0); glVertex3f(-1.0, 1.0, -1.0);
+   glTexCoord2f(1.0, 1.0); glVertex3f( 5.0, 1.0, -7.0);
+   glTexCoord2f(1.0, 0.0); glVertex3f( 5.0, 0.0, -7.0);
+
+   glTexCoord2f(0.0, 0.0); glVertex3f(-1.0, -1.0, -1.001);
+   glTexCoord2f(0.0, 1.0); glVertex3f(-1.0, 0.0, -1.001);
+   glTexCoord2f(1.0, 1.0); glVertex3f( 1.0, 0.0, -1.001);
+   glTexCoord2f(1.0, 0.0); glVertex3f( 1.0, -1.0, -1.001);
+   glEnd();
+#endif
+
+   glFlush();
+}
+
+
+static void
+reshape(int w, int h)
+{
+   glViewport(0, 0, w, h);
+   glMatrixMode(GL_PROJECTION);
+   glLoadIdentity();
+   gluPerspective(90.0, (GLfloat) w / h, 1.0, 300.0);
+   glMatrixMode(GL_MODELVIEW);
+   glLoadIdentity();
+}
+
+
+static void
+key(unsigned char k, int x, int y)
+{
+   switch (k) {
+   case 27:  /* Escape */
+      exit(0);
+      break;
+   case 'i':
+      if (PerspHint == GL_FASTEST)
+         PerspHint = GL_NICEST;
+      else if (PerspHint == GL_NICEST)
+         PerspHint = GL_DONT_CARE;
+      else
+         PerspHint = GL_FASTEST;
+      glHint(GL_PERSPECTIVE_CORRECTION_HINT, PerspHint);
+      break;
+   default:
+      return;
+   }
+   glutPostRedisplay();
+}
+
+
+int
+main(int argc, char** argv)
+{
+    glutInit(&argc, argv);
+    glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);
+    glutInitWindowSize (500, 500);
+    glutCreateWindow (argv[0]);
+    glutReshapeFunc (reshape);
+    glutDisplayFunc(display);
+    glutKeyboardFunc(key);
+
+    printf("Main quad: perspective projection\n");
+    printf("Middle stripe: linear interpolation\n");
+    printf("Press 'i' to toggle interpolation hint\n");
+    init();
+
+    glutMainLoop();
+    return 0;
+}