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