1/* GL_NV_fragment_program texture test */ 2 3#include <assert.h> 4#include <string.h> 5#include <stdio.h> 6#include <stdlib.h> 7#include <math.h> 8#include <GL/glew.h> 9#include "glut_wrap.h" 10 11#include "../util/readtex.c" 12 13 14#define TEXTURE_FILE DEMOS_DATA_DIR "girl.rgb" 15 16static GLfloat Xrot = 0.0, Yrot = 0.0, Zrot = 0.0; 17 18 19static void Display( void ) 20{ 21 glClear( GL_COLOR_BUFFER_BIT ); 22 23 glPushMatrix(); 24 glRotatef(Xrot, 1.0, 0.0, 0.0); 25 glRotatef(Yrot, 0.0, 1.0, 0.0); 26 glRotatef(Zrot, 0.0, 0.0, 1.0); 27 28 glBegin(GL_POLYGON); 29 glColor4f(1.0, 1.0, 1.0, 1); glTexCoord2f(0, 0); glVertex2f(-1, -1); 30 glColor4f(0.2, 0.2, 1.0, 1); glTexCoord2f(1, 0); glVertex2f( 1, -1); 31 glColor4f(0.2, 1.0, 0.2, 1); glTexCoord2f(1, 1); glVertex2f( 1, 1); 32 glColor4f(1.0, 0.2, 0.2, 1); glTexCoord2f(0, 1); glVertex2f(-1, 1); 33 glEnd(); 34 35 glPopMatrix(); 36 37 glutSwapBuffers(); 38} 39 40 41static void Reshape( int width, int height ) 42{ 43 glViewport( 0, 0, width, height ); 44 glMatrixMode( GL_PROJECTION ); 45 glLoadIdentity(); 46 glFrustum( -1.0, 1.0, -1.0, 1.0, 5.0, 25.0 ); 47 glMatrixMode( GL_MODELVIEW ); 48 glLoadIdentity(); 49 glTranslatef( 0.0, 0.0, -8.0 ); 50} 51 52 53static void SpecialKey( int key, int x, int y ) 54{ 55 float step = 3.0; 56 (void) x; 57 (void) y; 58 59 switch (key) { 60 case GLUT_KEY_UP: 61 Xrot += step; 62 break; 63 case GLUT_KEY_DOWN: 64 Xrot -= step; 65 break; 66 case GLUT_KEY_LEFT: 67 Yrot += step; 68 break; 69 case GLUT_KEY_RIGHT: 70 Yrot -= step; 71 break; 72 } 73 glutPostRedisplay(); 74} 75 76 77static void Key( unsigned char key, int x, int y ) 78{ 79 (void) x; 80 (void) y; 81 switch (key) { 82 case 27: 83 exit(0); 84 break; 85 } 86 glutPostRedisplay(); 87} 88 89 90static void Init( void ) 91{ 92 static const char *modulate2D = 93 "!!FP1.0\n" 94 "TEX R0, f[TEX0], TEX0, 2D; \n" 95 "MUL o[COLR], R0, f[COL0]; \n" 96 "END" 97 ; 98 GLuint modulateProg; 99 GLuint Texture; 100 101 if (!glutExtensionSupported("GL_NV_fragment_program")) { 102 printf("Error: GL_NV_fragment_program not supported!\n"); 103 exit(1); 104 } 105 printf("GL_RENDERER = %s\n", (char *) glGetString(GL_RENDERER)); 106 107 /* Setup the fragment program */ 108 glGenProgramsNV(1, &modulateProg); 109 glLoadProgramNV(GL_FRAGMENT_PROGRAM_NV, modulateProg, 110 strlen(modulate2D), 111 (const GLubyte *) modulate2D); 112 printf("glGetError = 0x%x\n", (int) glGetError()); 113 printf("glError(GL_PROGRAM_ERROR_STRING_NV) = %s\n", 114 (char *) glGetString(GL_PROGRAM_ERROR_STRING_NV)); 115 assert(glIsProgramNV(modulateProg)); 116 117 glBindProgramNV(GL_FRAGMENT_PROGRAM_NV, modulateProg); 118 glEnable(GL_FRAGMENT_PROGRAM_NV); 119 120 /* Load texture */ 121 glGenTextures(1, &Texture); 122 glBindTexture(GL_TEXTURE_2D, Texture); 123 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 124 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 125 glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 126 if (!LoadRGBMipmaps(TEXTURE_FILE, GL_RGB)) { 127 printf("Error: couldn't load texture image file %s\n", TEXTURE_FILE); 128 exit(1); 129 } 130 /* XXX this enable shouldn't really be needed!!! */ 131 glEnable(GL_TEXTURE_2D); 132 133 glClearColor(.3, .3, .3, 0); 134} 135 136 137int main( int argc, char *argv[] ) 138{ 139 glutInit( &argc, argv ); 140 glutInitWindowPosition( 0, 0 ); 141 glutInitWindowSize( 250, 250 ); 142 glutInitDisplayMode( GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH ); 143 glutCreateWindow(argv[0]); 144 glewInit(); 145 glutReshapeFunc( Reshape ); 146 glutKeyboardFunc( Key ); 147 glutSpecialFunc( SpecialKey ); 148 glutDisplayFunc( Display ); 149 Init(); 150 glutMainLoop(); 151 return 0; 152} 153