|
|
@@ -1,220 +0,0 @@ |
|
|
|
/* $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; |
|
|
|
} |