3 * Example of using the 1.1 texture object functions.
4 * Also, this demo utilizes Mesa's fast texture map path.
6 * Brian Paul June 1996 This file is in the public domain.
16 static GLuint Window
= 0;
18 static GLuint TexObj
[2];
19 static GLfloat Angle
= 0.0f
;
20 static GLboolean UseObj
= GL_FALSE
;
23 #if defined(GL_VERSION_1_1) || defined(GL_VERSION_1_2)
24 # define TEXTURE_OBJECT 1
25 #elif defined(GL_EXT_texture_object)
26 # define TEXTURE_OBJECT 1
27 # define glBindTexture(A,B) glBindTextureEXT(A,B)
28 # define glGenTextures(A,B) glGenTexturesEXT(A,B)
29 # define glDeleteTextures(A,B) glDeleteTexturesEXT(A,B)
35 static void draw( void )
37 glClear( GL_COLOR_BUFFER_BIT
);
39 glColor3f( 1.0, 1.0, 1.0 );
41 /* draw first polygon */
43 glTranslatef( -1.0, 0.0, 0.0 );
44 glRotatef( Angle
, 0.0, 0.0, 1.0 );
47 glBindTexture( GL_TEXTURE_2D
, TexObj
[0] );
51 glCallList( TexObj
[0] );
53 glBegin( GL_POLYGON
);
54 glTexCoord2f( 0.0, 0.0 ); glVertex2f( -1.0, -1.0 );
55 glTexCoord2f( 1.0, 0.0 ); glVertex2f( 1.0, -1.0 );
56 glTexCoord2f( 1.0, 1.0 ); glVertex2f( 1.0, 1.0 );
57 glTexCoord2f( 0.0, 1.0 ); glVertex2f( -1.0, 1.0 );
61 /* draw second polygon */
63 glTranslatef( 1.0, 0.0, 0.0 );
64 glRotatef( Angle
-90.0, 0.0, 1.0, 0.0 );
67 glBindTexture( GL_TEXTURE_2D
, TexObj
[1] );
71 glCallList( TexObj
[1] );
73 glBegin( GL_POLYGON
);
74 glTexCoord2f( 0.0, 0.0 ); glVertex2f( -1.0, -1.0 );
75 glTexCoord2f( 1.0, 0.0 ); glVertex2f( 1.0, -1.0 );
76 glTexCoord2f( 1.0, 1.0 ); glVertex2f( 1.0, 1.0 );
77 glTexCoord2f( 0.0, 1.0 ); glVertex2f( -1.0, 1.0 );
86 static void idle( void )
88 static double t0
= -1.;
89 double dt
, t
= glutGet(GLUT_ELAPSED_TIME
) / 1000.0;
100 /* change view Angle, exit upon ESC */
101 static void key(unsigned char k
, int x
, int y
)
107 #ifdef TEXTURE_OBJECT
108 glDeleteTextures( 2, TexObj
);
110 glutDestroyWindow(Window
);
117 /* new window size or exposure */
118 static void reshape( int width
, int height
)
120 glViewport(0, 0, (GLint
)width
, (GLint
)height
);
121 glMatrixMode(GL_PROJECTION
);
123 /* glOrtho( -3.0, 3.0, -3.0, 3.0, -10.0, 10.0 );*/
124 glFrustum( -2.0, 2.0, -2.0, 2.0, 6.0, 20.0 );
125 glMatrixMode(GL_MODELVIEW
);
127 glTranslatef( 0.0, 0.0, -8.0 );
131 static void init( void )
133 static int width
=8, height
=8;
134 static GLubyte tex1
[] = {
135 0, 0, 0, 0, 0, 0, 0, 0,
136 0, 0, 0, 0, 1, 0, 0, 0,
137 0, 0, 0, 1, 1, 0, 0, 0,
138 0, 0, 0, 0, 1, 0, 0, 0,
139 0, 0, 0, 0, 1, 0, 0, 0,
140 0, 0, 0, 0, 1, 0, 0, 0,
141 0, 0, 0, 1, 1, 1, 0, 0,
142 0, 0, 0, 0, 0, 0, 0, 0 };
144 static GLubyte tex2
[] = {
145 0, 0, 0, 0, 0, 0, 0, 0,
146 0, 0, 0, 2, 2, 0, 0, 0,
147 0, 0, 2, 0, 0, 2, 0, 0,
148 0, 0, 0, 0, 0, 2, 0, 0,
149 0, 0, 0, 0, 2, 0, 0, 0,
150 0, 0, 0, 2, 0, 0, 0, 0,
151 0, 0, 2, 2, 2, 2, 0, 0,
152 0, 0, 0, 0, 0, 0, 0, 0 };
158 glDisable( GL_DITHER
);
160 /* Setup texturing */
161 glEnable( GL_TEXTURE_2D
);
162 glTexEnvi( GL_TEXTURE_ENV
, GL_TEXTURE_ENV_MODE
, GL_DECAL
);
163 glHint( GL_PERSPECTIVE_CORRECTION_HINT
, GL_FASTEST
);
166 /* generate texture object IDs */
168 #ifdef TEXTURE_OBJECT
169 glGenTextures( 2, TexObj
);
173 TexObj
[0] = glGenLists(2);
174 TexObj
[1] = TexObj
[0]+1;
177 /* setup first texture object */
179 #ifdef TEXTURE_OBJECT
180 glBindTexture( GL_TEXTURE_2D
, TexObj
[0] );
181 assert(glIsTexture(TexObj
[0]));
185 glNewList( TexObj
[0], GL_COMPILE
);
188 for (i
=0;i
<height
;i
++) {
189 for (j
=0;j
<width
;j
++) {
191 if (tex1
[(height
-i
-1)*width
+j
]) {
192 tex
[p
][0] = 255; tex
[p
][1] = 0; tex
[p
][2] = 0;
195 tex
[p
][0] = 255; tex
[p
][1] = 255; tex
[p
][2] = 255;
200 glTexImage2D( GL_TEXTURE_2D
, 0, 3, width
, height
, 0,
201 GL_RGB
, GL_UNSIGNED_BYTE
, tex
);
202 glTexParameteri( GL_TEXTURE_2D
, GL_TEXTURE_MIN_FILTER
, GL_NEAREST
);
203 glTexParameteri( GL_TEXTURE_2D
, GL_TEXTURE_MAG_FILTER
, GL_NEAREST
);
204 glTexParameteri( GL_TEXTURE_2D
, GL_TEXTURE_WRAP_S
, GL_REPEAT
);
205 glTexParameteri( GL_TEXTURE_2D
, GL_TEXTURE_WRAP_T
, GL_REPEAT
);
209 /* end of texture object */
211 /* setup second texture object */
213 #ifdef TEXTURE_OBJECT
214 glBindTexture( GL_TEXTURE_2D
, TexObj
[1] );
215 assert(glIsTexture(TexObj
[1]));
217 assert(!glIsTexture(TexObj
[1] + 999));
220 glNewList( TexObj
[1], GL_COMPILE
);
223 for (i
=0;i
<height
;i
++) {
224 for (j
=0;j
<width
;j
++) {
226 if (tex2
[(height
-i
-1)*width
+j
]) {
227 tex
[p
][0] = 0; tex
[p
][1] = 255; tex
[p
][2] = 0;
230 tex
[p
][0] = 0; tex
[p
][1] = 0; tex
[p
][2] = 255;
234 glTexImage2D( GL_TEXTURE_2D
, 0, 3, width
, height
, 0,
235 GL_RGB
, GL_UNSIGNED_BYTE
, tex
);
236 glTexParameteri( GL_TEXTURE_2D
, GL_TEXTURE_MIN_FILTER
, GL_NEAREST
);
237 glTexParameteri( GL_TEXTURE_2D
, GL_TEXTURE_MAG_FILTER
, GL_NEAREST
);
238 glTexParameteri( GL_TEXTURE_2D
, GL_TEXTURE_WRAP_S
, GL_REPEAT
);
239 glTexParameteri( GL_TEXTURE_2D
, GL_TEXTURE_WRAP_T
, GL_REPEAT
);
243 /* end texture object */
249 int main( int argc
, char *argv
[] )
251 glutInit(&argc
, argv
);
252 glutInitWindowPosition(0, 0);
253 glutInitWindowSize(300, 300);
254 glutInitDisplayMode( GLUT_RGB
| GLUT_DEPTH
| GLUT_DOUBLE
);
256 Window
= glutCreateWindow("Texture Objects");
261 /* check that renderer has the GL_EXT_texture_object extension
262 * or supports OpenGL 1.1
264 #ifdef TEXTURE_OBJECT
266 char *exten
= (char *) glGetString( GL_EXTENSIONS
);
267 char *version
= (char *) glGetString( GL_VERSION
);
268 if ( strstr( exten
, "GL_EXT_texture_object" )
269 || strncmp( version
, "1.1", 3 )==0
270 || strncmp( version
, "1.2", 3 )==0 ) {
278 glutReshapeFunc( reshape
);
279 glutKeyboardFunc( key
);
280 glutIdleFunc( idle
);
281 glutDisplayFunc( draw
);