123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149 |
- /*
- * 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;
- }
|