diff options
Diffstat (limited to 'progs/demos/anisotropic.c')
-rw-r--r-- | progs/demos/anisotropic.c | 220 |
1 files changed, 220 insertions, 0 deletions
diff --git a/progs/demos/anisotropic.c b/progs/demos/anisotropic.c new file mode 100644 index 00000000000..9f67c2dbff7 --- /dev/null +++ b/progs/demos/anisotropic.c @@ -0,0 +1,220 @@ +/* $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 <math.h> +#include <stdio.h> +#include <stdlib.h> +#include <GL/glut.h> + +#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; +} |