/* $Id: anisotropic.c,v 1.1 2001/03/22 15:24:15 gareth Exp $ */ /* * GL_ARB_texture_filter_anisotropic demo * * Gareth Hughes * March 2001 * * Copyright (C) 2000 Brian Paul All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /* This is a fairly early version. All it does is draw a couple of * textured quads with different forms of texture filtering. Eventually, * you'll be able to adjust the maximum anisotropy and so on. */ #include #include #include #include #define TEXTURE_SIZE 256 static GLubyte image[TEXTURE_SIZE][TEXTURE_SIZE][3]; static GLfloat repeat = 1.0; static GLfloat texcoords[] = { 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 1.0, 1.0 }; static GLfloat vertices[] = { -400.0, -400.0, 0.0, -400.0, 400.0, -7000.0, 400.0, -400.0, 0.0, 400.0, 400.0, -7000.0 }; static GLfloat maxAnisotropy; static void init( void ) { int i, j; if ( !glutExtensionSupported( "GL_EXT_texture_filter_anisotropic" ) ) { fprintf( stderr, "Sorry, this demo requires GL_EXT_texture_filter_anisotropic.\n" ); exit( 0 ); } glClearColor( 0.0, 0.0, 0.0, 0.0 ); glShadeModel( GL_SMOOTH ); /* Init the vertex arrays. */ glEnableClientState( GL_VERTEX_ARRAY ); glEnableClientState( GL_TEXTURE_COORD_ARRAY ); glVertexPointer( 3, GL_FLOAT, 0, vertices ); glTexCoordPointer( 2, GL_FLOAT, 0, texcoords ); /* Init the texture environment. */ glEnable( GL_TEXTURE_2D ); glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE ); glMatrixMode( GL_TEXTURE ); glScalef( repeat, repeat, 0 ); glMatrixMode( GL_MODELVIEW ); glGetFloatv( GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &maxAnisotropy ); printf( "Maximum supported anisotropy: %.2f\n", maxAnisotropy ); /* Make the texture image. */ glPixelStorei( GL_UNPACK_ALIGNMENT, 1 ); for ( i = 0 ; i < TEXTURE_SIZE ; i++ ) { for ( j = 0 ; j < TEXTURE_SIZE ; j++ ) { if ( (i/4 + j/4) & 1 ) { image[i][j][0] = 0; image[i][j][1] = 0; image[i][j][2] = 0; } else { image[i][j][0] = 255; image[i][j][1] = 255; image[i][j][2] = 255; } } } gluBuild2DMipmaps( GL_TEXTURE_2D, GL_RGB, TEXTURE_SIZE, TEXTURE_SIZE, GL_RGB, GL_UNSIGNED_BYTE, image ); } static void display( void ) { GLint vp[4], w, h; glClear( GL_COLOR_BUFFER_BIT ); glGetIntegerv( GL_VIEWPORT, vp ); w = vp[2] / 2; h = vp[3] / 2; /* Upper left corner: */ glViewport( 1, h + 1, w - 2, h - 2 ); glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, maxAnisotropy ); glDrawArrays( GL_TRIANGLE_STRIP, 0, 4 ); /* Upper right corner: */ glViewport( w + 1, h + 1, w - 2, h - 2 ); glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST ); glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, maxAnisotropy ); glDrawArrays( GL_TRIANGLE_STRIP, 0, 4 ); /* Lower left corner: */ glViewport( 1, 1, w - 2, h - 2 ); glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_LINEAR ); glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, maxAnisotropy ); glDrawArrays( GL_TRIANGLE_STRIP, 0, 4 ); /* Lower right corner: */ glViewport( w + 1, 1, w - 2, h - 2 ); glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR ); glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, maxAnisotropy ); glDrawArrays( GL_TRIANGLE_STRIP, 0, 4 ); glViewport( vp[0], vp[1], vp[2], vp[3] ); glutSwapBuffers(); } static void reshape( int w, int h ) { glViewport( 0, 0, (GLsizei) w, (GLsizei) h ); glMatrixMode( GL_PROJECTION ); glLoadIdentity(); glFrustum( -1.0, 1.0, -1.0, 1.0, 10.0, 10000.0 ); glMatrixMode( GL_MODELVIEW ); glLoadIdentity(); glTranslatef( 0.0, 0.0, -10.0 ); } static void key( unsigned char key, int x, int y ) { (void) x; (void) y; switch ( key ) { case 27: exit( 0 ); } glutPostRedisplay(); } static void usage( void ) { /* Nothing yet... */ } int main( int argc, char **argv ) { glutInit( &argc, argv ); glutInitDisplayMode( GLUT_DOUBLE | GLUT_RGB ); glutInitWindowSize( 600, 300 ); glutInitWindowPosition( 0, 0 ); glutCreateWindow( "Anisotropic Texture Filter Demo" ); init(); glutDisplayFunc( display ); glutReshapeFunc( reshape ); glutKeyboardFunc( key ); usage(); glutMainLoop(); return 0; }