2 * Test vertex arrays and multitexture.
3 * Press 'a' to toggle vertex arrays on/off.
4 * When you run this program you should see a square with four colors:
20 #include "glut_wrap.h"
22 static GLuint Window
= 0;
24 static GLuint TexObj
[2];
25 static GLfloat Angle
= 0.0f
;
26 static GLboolean UseArrays
= 1, Anim
= 0;
28 static GLfloat VertArray
[4][2] = {
29 {-1.2, -1.2}, {1.2, -1.2}, {1.2, 1.2}, {-1.2, 1.2}
32 static GLfloat Tex0Array
[4][2] = {
33 {0, 0}, {1, 0}, {1, 1}, {0, 1}
36 static GLfloat Tex1Array
[4][2] = {
37 {0, 0}, {1, 0}, {1, 1}, {0, 1}
41 static void init_arrays(void)
43 glVertexPointer(2, GL_FLOAT
, 0, VertArray
);
44 glEnableClientState(GL_VERTEX_ARRAY
);
46 glClientActiveTextureARB(GL_TEXTURE0_ARB
);
47 glTexCoordPointer(2, GL_FLOAT
, 0, Tex0Array
);
48 glEnableClientState(GL_TEXTURE_COORD_ARRAY
);
50 glClientActiveTextureARB(GL_TEXTURE1_ARB
);
51 glTexCoordPointer(2, GL_FLOAT
, 0, Tex1Array
);
52 glEnableClientState(GL_TEXTURE_COORD_ARRAY
);
56 static void draw( void )
58 glClear( GL_COLOR_BUFFER_BIT
);
60 glColor3f( 0.0, 0.0, 0.0 );
62 /* draw first polygon */
64 glRotatef( Angle
, 0.0, 0.0, 1.0 );
67 glDrawArrays(GL_POLYGON
, 0, 4);
70 glBegin( GL_POLYGON
);
71 glTexCoord2f( 0.0, 0.0 );
72 glMultiTexCoord2fARB(GL_TEXTURE1_ARB
, 0.0, 0.0);
73 glVertex2f( -1.0, -1.0 );
75 glTexCoord2f( 1.0, 0.0 );
76 glMultiTexCoord2fARB(GL_TEXTURE1_ARB
, 1.0, 0.0);
77 glVertex2f( 1.0, -1.0 );
79 glTexCoord2f( 1.0, 1.0 );
80 glMultiTexCoord2fARB(GL_TEXTURE1_ARB
, 1.0, 1.0);
81 glVertex2f( 1.0, 1.0 );
83 glTexCoord2f( 0.0, 1.0 );
84 glMultiTexCoord2fARB(GL_TEXTURE1_ARB
, 0.0, 1.0);
85 glVertex2f( -1.0, 1.0 );
96 static void idle( void )
104 /* change view Angle, exit upon ESC */
105 static void key(unsigned char k
, int x
, int y
)
111 UseArrays
= !UseArrays
;
112 printf("UseArrays: %d\n", UseArrays
);
122 glDeleteTextures( 2, TexObj
);
123 glutDestroyWindow(Window
);
131 /* new window size or exposure */
132 static void reshape( int width
, int height
)
134 glViewport(0, 0, (GLint
)width
, (GLint
)height
);
135 glMatrixMode(GL_PROJECTION
);
137 /* glOrtho( -3.0, 3.0, -3.0, 3.0, -10.0, 10.0 );*/
138 glFrustum( -2.0, 2.0, -2.0, 2.0, 6.0, 20.0 );
139 glMatrixMode(GL_MODELVIEW
);
141 glTranslatef( 0.0, 0.0, -8.0 );
145 static void init( void )
147 static int width
=8, height
=8;
151 /* generate texture object IDs */
152 glGenTextures( 2, TexObj
);
155 * setup first texture object
157 glActiveTextureARB(GL_TEXTURE0_ARB
);
158 glEnable( GL_TEXTURE_2D
);
159 glTexEnvi( GL_TEXTURE_ENV
, GL_TEXTURE_ENV_MODE
, GL_ADD
);
161 glBindTexture( GL_TEXTURE_2D
, TexObj
[0] );
162 assert(glIsTexture(TexObj
[0]));
165 for (i
=0;i
<height
;i
++) {
166 for (j
=0;j
<width
;j
++) {
168 if (i
< height
/ 2) {
169 tex
[p
][0] = 0; tex
[p
][1] = 0; tex
[p
][2] = 0;
172 tex
[p
][0] = 255; tex
[p
][1] = 0; tex
[p
][2] = 0;
177 glTexImage2D( GL_TEXTURE_2D
, 0, 3, width
, height
, 0,
178 GL_RGB
, GL_UNSIGNED_BYTE
, tex
);
179 glTexParameteri( GL_TEXTURE_2D
, GL_TEXTURE_MIN_FILTER
, GL_NEAREST
);
180 glTexParameteri( GL_TEXTURE_2D
, GL_TEXTURE_MAG_FILTER
, GL_NEAREST
);
181 glTexParameteri( GL_TEXTURE_2D
, GL_TEXTURE_WRAP_S
, GL_REPEAT
);
182 glTexParameteri( GL_TEXTURE_2D
, GL_TEXTURE_WRAP_T
, GL_REPEAT
);
186 * setup second texture object
188 glActiveTextureARB(GL_TEXTURE1_ARB
);
189 glEnable( GL_TEXTURE_2D
);
190 glTexEnvi( GL_TEXTURE_ENV
, GL_TEXTURE_ENV_MODE
, GL_ADD
);
192 glBindTexture( GL_TEXTURE_2D
, TexObj
[1] );
193 assert(glIsTexture(TexObj
[1]));
195 /* left=green, right = blue */
196 for (i
=0;i
<height
;i
++) {
197 for (j
=0;j
<width
;j
++) {
200 tex
[p
][0] = 0; tex
[p
][1] = 255; tex
[p
][2] = 0;
203 tex
[p
][0] = 0; tex
[p
][1] = 0; tex
[p
][2] = 255;
207 glTexImage2D( GL_TEXTURE_2D
, 0, 3, width
, height
, 0,
208 GL_RGB
, GL_UNSIGNED_BYTE
, tex
);
209 glTexParameteri( GL_TEXTURE_2D
, GL_TEXTURE_MIN_FILTER
, GL_NEAREST
);
210 glTexParameteri( GL_TEXTURE_2D
, GL_TEXTURE_MAG_FILTER
, GL_NEAREST
);
211 glTexParameteri( GL_TEXTURE_2D
, GL_TEXTURE_WRAP_S
, GL_REPEAT
);
212 glTexParameteri( GL_TEXTURE_2D
, GL_TEXTURE_WRAP_T
, GL_REPEAT
);
217 int main( int argc
, char *argv
[] )
219 glutInit(&argc
, argv
);
220 glutInitWindowPosition(0, 0);
221 glutInitWindowSize(300, 300);
222 glutInitDisplayMode( GLUT_RGB
| GLUT_DOUBLE
);
224 Window
= glutCreateWindow("Texture Objects");
233 glutReshapeFunc( reshape
);
234 glutKeyboardFunc( key
);
236 glutIdleFunc( idle
);
237 glutDisplayFunc( draw
);