progs/trivial: added two simple texture tests
authorBrian Paul <brianp@vmware.com>
Mon, 30 Nov 2009 22:31:30 +0000 (15:31 -0700)
committerBrian Paul <brianp@vmware.com>
Mon, 30 Nov 2009 22:31:34 +0000 (15:31 -0700)
One draws a series of quads with different textures.
The other draws with one texture which is changed with glTexSubImage2D().

progs/trivial/Makefile
progs/trivial/SConscript
progs/trivial/sub-tex.c [new file with mode: 0644]
progs/trivial/tex-quads.c [new file with mode: 0644]

index 70728616d28b187ac1783178d651949e9efefd4c..a78837611c19aecd003c9a2718b32a895c4874bc 100644 (file)
@@ -90,6 +90,8 @@ SOURCES = \
        quadstrip-flat.c \
        quadstrip.c \
        readpixels.c \
+       sub-tex.c \
+       tex-quads.c \
        tri-alpha.c \
        tri-alpha-tex.c \
        tri-array-interleaved.c \
index 9a1f3575bdc9b65c951e744f67fdc2b7cee48371..37a53293bfc1ccd009937d7ec1b973a83d66e7e1 100644 (file)
@@ -77,6 +77,8 @@ progs = [
        'quadstrip-cont',
        'quadstrip-flat',
        'quadstrip',
+       'sub-tex',
+       'tex-quads',
        'tri-alpha',
        'tri-blend-color',
        'tri-blend-max',
diff --git a/progs/trivial/sub-tex.c b/progs/trivial/sub-tex.c
new file mode 100644 (file)
index 0000000..0b8bb28
--- /dev/null
@@ -0,0 +1,137 @@
+/**
+ * Draw a series of textured quads after each quad, use glTexSubImage()
+ * to change one row of the texture image.
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <GL/glew.h>
+#include <GL/glut.h>
+
+
+static GLint Win = 0;
+static GLuint Tex = 0;
+
+
+static void Init(void)
+{
+   fprintf(stderr, "GL_RENDERER   = %s\n", (char *) glGetString(GL_RENDERER));
+   fflush(stderr);
+
+   glGenTextures(1, &Tex);
+   glBindTexture(GL_TEXTURE_2D, Tex);
+
+   glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
+   glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+   glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+   glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+   glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+}
+
+
+static void Reshape(int width, int height)
+{
+   float ar = (float) width / height;
+   glViewport(0, 0, width, height);
+   glMatrixMode(GL_PROJECTION);
+   glLoadIdentity();
+   glOrtho(-ar, ar, -1.0, 1.0, -1.0, 1.0);
+   glMatrixMode(GL_MODELVIEW);
+}
+
+
+static void Key(unsigned char key, int x, int y)
+{
+   if (key == 27) {
+      glDeleteTextures(1, &Tex);
+      glutDestroyWindow(Win);
+      exit(1);
+   }
+   glutPostRedisplay();
+}
+
+
+static void Draw(void)
+{
+   GLubyte tex[16][16][4];
+   GLubyte row[16][4];
+   int i, j;
+
+   for (i = 0; i < 16; i++) {
+      for (j = 0; j < 16; j++) {
+         if ((i + j) & 1) {
+            tex[i][j][0] = 128;
+            tex[i][j][1] = 128;
+            tex[i][j][2] = 128;
+            tex[i][j][3] = 255;
+         }
+         else {
+            tex[i][j][0] = 255;
+            tex[i][j][1] = 255;
+            tex[i][j][2] = 255;
+            tex[i][j][3] = 255;
+         }
+      }
+   }
+
+   for (i = 0; i < 16; i++) {
+      row[i][0] = 255;
+      row[i][1] = 0;
+      row[i][2] = 0;
+      row[i][3] = 255;
+   }
+
+   glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0,
+                GL_RGBA, GL_UNSIGNED_BYTE, tex);
+   glEnable(GL_TEXTURE_2D);
+
+   glClear(GL_COLOR_BUFFER_BIT);
+
+   for (i = 0; i < 9; i++) {
+
+      glPushMatrix();
+      glTranslatef(-4.0 + i, 0, 0);
+      glScalef(0.5, 0.5, 1.0);
+
+      glBegin(GL_QUADS);
+      glTexCoord2f(1,0);
+      glVertex3f( 0.9, -0.9, 0.0);
+      glTexCoord2f(1,1);
+      glVertex3f( 0.9,  0.9, 0.0);
+      glTexCoord2f(0,1);
+      glVertex3f(-0.9,  0.9, 0.0);
+      glTexCoord2f(0,0);
+      glVertex3f(-0.9,  -0.9, 0.0);
+      glEnd();
+
+      glPopMatrix();
+
+      /* replace a row of the texture image with red texels */
+      if (i * 2 < 16)
+         glTexSubImage2D(GL_TEXTURE_2D, 0, 0, i*2, 16, 1,
+                         GL_RGBA, GL_UNSIGNED_BYTE, row);
+   }
+
+
+   glutSwapBuffers();
+}
+
+
+int main(int argc, char **argv)
+{
+   glutInit(&argc, argv);
+   glutInitWindowSize(900, 200);
+   glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
+   Win = glutCreateWindow(*argv);
+   if (!Win) {
+      exit(1);
+   }
+   glewInit();
+   Init();
+   glutReshapeFunc(Reshape);
+   glutKeyboardFunc(Key);
+   glutDisplayFunc(Draw);
+   glutMainLoop();
+   return 0;
+}
diff --git a/progs/trivial/tex-quads.c b/progs/trivial/tex-quads.c
new file mode 100644 (file)
index 0000000..626e178
--- /dev/null
@@ -0,0 +1,143 @@
+/**
+ * Draw a series of quads, each with a different texture.
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <GL/glew.h>
+#include <GL/glut.h>
+
+#define NUM_TEX 10
+
+static GLint Win = 0;
+static GLuint Tex[NUM_TEX];
+
+
+static void Init(void)
+{
+   int i;
+
+   fprintf(stderr, "GL_RENDERER   = %s\n", (char *) glGetString(GL_RENDERER));
+   fflush(stderr);
+
+   glGenTextures(NUM_TEX, Tex);
+
+   for (i = 0; i < NUM_TEX; i++) {
+      glBindTexture(GL_TEXTURE_2D, Tex[i]);
+
+      glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
+      glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+      glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+      glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+      glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+   }
+}
+
+
+static void Reshape(int width, int height)
+{
+   float ar = (float) width / height;
+   glViewport(0, 0, width, height);
+   glMatrixMode(GL_PROJECTION);
+   glLoadIdentity();
+   glOrtho(-ar, ar, -1.0, 1.0, -1.0, 1.0);
+   glMatrixMode(GL_MODELVIEW);
+}
+
+
+static void Key(unsigned char key, int x, int y)
+{
+   if (key == 27) {
+      glDeleteTextures(NUM_TEX, Tex);
+      glutDestroyWindow(Win);
+      exit(1);
+   }
+   glutPostRedisplay();
+}
+
+
+static void Draw(void)
+{
+   GLubyte tex[16][16][4];
+   int t, i, j;
+
+   for (t = 0; t < NUM_TEX; t++) {
+
+      for (i = 0; i < 16; i++) {
+         for (j = 0; j < 16; j++) {
+            if (i < t) {
+               /* red row */
+               tex[i][j][0] = 255;
+               tex[i][j][1] = 0;
+               tex[i][j][2] = 0;
+               tex[i][j][3] = 255;
+            }
+            else if ((i + j) & 1) {
+               tex[i][j][0] = 128;
+               tex[i][j][1] = 128;
+               tex[i][j][2] = 128;
+               tex[i][j][3] = 255;
+            }
+            else {
+               tex[i][j][0] = 255;
+               tex[i][j][1] = 255;
+               tex[i][j][2] = 255;
+               tex[i][j][3] = 255;
+            }
+         }
+      }
+
+      glBindTexture(GL_TEXTURE_2D, Tex[t]);
+      glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0,
+                   GL_RGBA, GL_UNSIGNED_BYTE, tex);
+   }
+
+   glEnable(GL_TEXTURE_2D);
+
+   glClear(GL_COLOR_BUFFER_BIT);
+
+   for (i = 0; i < NUM_TEX; i++) {
+
+      glBindTexture(GL_TEXTURE_2D, Tex[i]);
+
+      glPushMatrix();
+      glTranslatef(-4.0 + i, 0, 0);
+      glScalef(0.5, 0.5, 1.0);
+
+      glBegin(GL_QUADS);
+      glTexCoord2f(1,0);
+      glVertex3f( 0.9, -0.9, 0.0);
+      glTexCoord2f(1,1);
+      glVertex3f( 0.9,  0.9, 0.0);
+      glTexCoord2f(0,1);
+      glVertex3f(-0.9,  0.9, 0.0);
+      glTexCoord2f(0,0);
+      glVertex3f(-0.9,  -0.9, 0.0);
+      glEnd();
+
+      glPopMatrix();
+   }
+
+
+   glutSwapBuffers();
+}
+
+
+int main(int argc, char **argv)
+{
+   glutInit(&argc, argv);
+   glutInitWindowSize(900, 200);
+   glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
+   Win = glutCreateWindow(*argv);
+   if (!Win) {
+      exit(1);
+   }
+   glewInit();
+   Init();
+   glutReshapeFunc(Reshape);
+   glutKeyboardFunc(Key);
+   glutDisplayFunc(Draw);
+   glutMainLoop();
+   return 0;
+}