persp_hint.c revision 32001f49
132001f49Smrg/*
232001f49Smrg * Test the GL_PERSPECTIVE_CORRECTION_HINT setting and its effect on
332001f49Smrg * color interpolation.
432001f49Smrg *
532001f49Smrg * Press 'i' to toggle between GL_NICEST/GL_FASTEST/GL_DONT_CARE.
632001f49Smrg *
732001f49Smrg * Depending on the driver, the hint may make a difference, or not.
832001f49Smrg */
932001f49Smrg
1032001f49Smrg
1132001f49Smrg#include <stdlib.h>
1232001f49Smrg#include <stdio.h>
1332001f49Smrg#include "glut_wrap.h"
1432001f49Smrg
1532001f49Smrg
1632001f49Smrgstatic GLenum PerspHint = GL_DONT_CARE;
1732001f49Smrg
1832001f49Smrg
1932001f49Smrgstatic void
2032001f49Smrginit(void)
2132001f49Smrg{
2232001f49Smrg   GLubyte image[256][256][4];
2332001f49Smrg   GLuint i, j;
2432001f49Smrg   for (i = 0; i < 256; i++) {
2532001f49Smrg      for (j = 0; j < 256; j++) {
2632001f49Smrg         image[i][j][0] = j;
2732001f49Smrg         image[i][j][1] = j;
2832001f49Smrg         image[i][j][2] = j;
2932001f49Smrg         image[i][j][3] = 255;
3032001f49Smrg      }
3132001f49Smrg   }
3232001f49Smrg   glTexImage2D(GL_TEXTURE_2D, 0, 4, 256, 256, 0,
3332001f49Smrg                GL_RGBA, GL_UNSIGNED_BYTE, image);
3432001f49Smrg   glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
3532001f49Smrg   glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
3632001f49Smrg   glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
3732001f49Smrg   glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
3832001f49Smrg   glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
3932001f49Smrg
4032001f49Smrg   printf("GL_RENDERER = %s\n", (char *) glGetString(GL_RENDERER));
4132001f49Smrg}
4232001f49Smrg
4332001f49Smrg
4432001f49Smrgstatic void
4532001f49Smrgdisplay(void)
4632001f49Smrg{
4732001f49Smrg   switch (PerspHint) {
4832001f49Smrg   case GL_NICEST:
4932001f49Smrg      printf("hint = GL_NICEST\n");
5032001f49Smrg      break;
5132001f49Smrg   case GL_FASTEST:
5232001f49Smrg      printf("hint = GL_FASTEST\n");
5332001f49Smrg      break;
5432001f49Smrg   case GL_DONT_CARE:
5532001f49Smrg      printf("hint = GL_DONT_CARE\n");
5632001f49Smrg      break;
5732001f49Smrg   default:
5832001f49Smrg      ;
5932001f49Smrg   }
6032001f49Smrg
6132001f49Smrg   glClear(GL_COLOR_BUFFER_BIT);
6232001f49Smrg
6332001f49Smrg#if 1
6432001f49Smrg   glBegin(GL_QUADS);
6532001f49Smrg   /* exercise perspective interpolation */
6632001f49Smrg   glColor3f(0.0, 0.0, 0.0); glVertex3f(-1.0, -1.0, -1.0);
6732001f49Smrg   glColor3f(0.0, 0.0, 0.0); glVertex3f(-1.0, 1.0, -1.0);
6832001f49Smrg   glColor3f(0.0, 1.0, 0.0); glVertex3f( 7.0, 1.0, -7.0);
6932001f49Smrg   glColor3f(0.0, 1.0, 0.0); glVertex3f( 7.0, -1.0, -7.0);
7032001f49Smrg
7132001f49Smrg   /* stripe of linear interpolation */
7232001f49Smrg   glColor3f(0.0, 0.0, 0.0); glVertex3f(-1.0, -0.1, -1.001);
7332001f49Smrg   glColor3f(0.0, 0.0, 0.0); glVertex3f(-1.0,  0.1, -1.001);
7432001f49Smrg   glColor3f(0.0, 1.0, 0.0); glVertex3f( 1.0,  0.1, -1.001);
7532001f49Smrg   glColor3f(0.0, 1.0, 0.0); glVertex3f( 1.0, -0.1, -1.001);
7632001f49Smrg   glEnd();
7732001f49Smrg#else
7832001f49Smrg   glEnable(GL_TEXTURE_2D);
7932001f49Smrg   glBegin(GL_QUADS);
8032001f49Smrg   glTexCoord2f(0.0, 0.0); glVertex3f(-1.0, 0.0, -1.0);
8132001f49Smrg   glTexCoord2f(0.0, 1.0); glVertex3f(-1.0, 1.0, -1.0);
8232001f49Smrg   glTexCoord2f(1.0, 1.0); glVertex3f( 5.0, 1.0, -7.0);
8332001f49Smrg   glTexCoord2f(1.0, 0.0); glVertex3f( 5.0, 0.0, -7.0);
8432001f49Smrg
8532001f49Smrg   glTexCoord2f(0.0, 0.0); glVertex3f(-1.0, -1.0, -1.001);
8632001f49Smrg   glTexCoord2f(0.0, 1.0); glVertex3f(-1.0, 0.0, -1.001);
8732001f49Smrg   glTexCoord2f(1.0, 1.0); glVertex3f( 1.0, 0.0, -1.001);
8832001f49Smrg   glTexCoord2f(1.0, 0.0); glVertex3f( 1.0, -1.0, -1.001);
8932001f49Smrg   glEnd();
9032001f49Smrg#endif
9132001f49Smrg
9232001f49Smrg   glFlush();
9332001f49Smrg}
9432001f49Smrg
9532001f49Smrg
9632001f49Smrgstatic void
9732001f49Smrgreshape(int w, int h)
9832001f49Smrg{
9932001f49Smrg   glViewport(0, 0, w, h);
10032001f49Smrg   glMatrixMode(GL_PROJECTION);
10132001f49Smrg   glLoadIdentity();
10232001f49Smrg   gluPerspective(90.0, (GLfloat) w / h, 1.0, 300.0);
10332001f49Smrg   glMatrixMode(GL_MODELVIEW);
10432001f49Smrg   glLoadIdentity();
10532001f49Smrg}
10632001f49Smrg
10732001f49Smrg
10832001f49Smrgstatic void
10932001f49Smrgkey(unsigned char k, int x, int y)
11032001f49Smrg{
11132001f49Smrg   switch (k) {
11232001f49Smrg   case 27:  /* Escape */
11332001f49Smrg      exit(0);
11432001f49Smrg      break;
11532001f49Smrg   case 'i':
11632001f49Smrg      if (PerspHint == GL_FASTEST)
11732001f49Smrg         PerspHint = GL_NICEST;
11832001f49Smrg      else if (PerspHint == GL_NICEST)
11932001f49Smrg         PerspHint = GL_DONT_CARE;
12032001f49Smrg      else
12132001f49Smrg         PerspHint = GL_FASTEST;
12232001f49Smrg      glHint(GL_PERSPECTIVE_CORRECTION_HINT, PerspHint);
12332001f49Smrg      break;
12432001f49Smrg   default:
12532001f49Smrg      return;
12632001f49Smrg   }
12732001f49Smrg   glutPostRedisplay();
12832001f49Smrg}
12932001f49Smrg
13032001f49Smrg
13132001f49Smrgint
13232001f49Smrgmain(int argc, char** argv)
13332001f49Smrg{
13432001f49Smrg    glutInit(&argc, argv);
13532001f49Smrg    glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);
13632001f49Smrg    glutInitWindowSize (500, 500);
13732001f49Smrg    glutCreateWindow (argv[0]);
13832001f49Smrg    glutReshapeFunc (reshape);
13932001f49Smrg    glutDisplayFunc(display);
14032001f49Smrg    glutKeyboardFunc(key);
14132001f49Smrg
14232001f49Smrg    printf("Main quad: perspective projection\n");
14332001f49Smrg    printf("Middle stripe: linear interpolation\n");
14432001f49Smrg    printf("Press 'i' to toggle interpolation hint\n");
14532001f49Smrg    init();
14632001f49Smrg
14732001f49Smrg    glutMainLoop();
14832001f49Smrg    return 0;
14932001f49Smrg}
150