[Mesa-dev] Demos (master): mipmap_tunnel: new test to examine mipmap filtering

Keith Whitwell keith.whitwell at gmail.com
Thu Oct 14 08:05:21 PDT 2010


Isn't this a quite similar concept to tests/texfilt?

Keith


On Thu, Oct 14, 2010 at 3:55 PM, Brian Paul
<brianp at kemper.freedesktop.org> wrote:
> Module: Demos
> Branch: master
> Commit: 4d981d192bcff29fd85c794415148988518c6eae
> URL:    http://cgit.freedesktop.org/mesa/demos/commit/?id=4d981d192bcff29fd85c794415148988518c6eae
>
> Author: Brian Paul <brianp at vmware.com>
> Date:   Thu Oct 14 08:49:01 2010 -0600
>
> mipmap_tunnel: new test to examine mipmap filtering
>
> ---
>
>  src/tests/Makefile.am     |    1 +
>  src/tests/mipmap_tunnel.c |  250 +++++++++++++++++++++++++++++++++++++++++++++
>  2 files changed, 251 insertions(+), 0 deletions(-)
>
> diff --git a/src/tests/Makefile.am b/src/tests/Makefile.am
> index 03e3c97..cd7424b 100644
> --- a/src/tests/Makefile.am
> +++ b/src/tests/Makefile.am
> @@ -107,6 +107,7 @@ noinst_PROGRAMS = \
>        mipmap_comp_tests \
>        mipmap_limits \
>        mipmap_view \
> +       mipmap_tunnel \
>        multipal \
>        multitexarray \
>        multiwindow \
> diff --git a/src/tests/mipmap_tunnel.c b/src/tests/mipmap_tunnel.c
> new file mode 100644
> index 0000000..05c4e9e
> --- /dev/null
> +++ b/src/tests/mipmap_tunnel.c
> @@ -0,0 +1,250 @@
> +/**
> + * Display trilinear mipmap filtering quality.
> + * We look down a long tunnel shape which has a mipmapped texture
> + * applied to it.  Ideally, the transition from one mipmap level to
> + * another should be nice and regular/circular.
> + * This sort of test is frequently seen in online articles about GPU
> + * texture filtering.
> + *
> + * Brian Paul
> + * 13 Oct 2010
> + */
> +
> +
> +#include <stdlib.h>
> +#include <stdio.h>
> +#include <GL/glew.h>
> +#include <GL/glut.h>
> +#include <GL/glu.h>
> +
> +
> +static GLfloat LodBias = 0.0;
> +static GLboolean NearestFilter = GL_FALSE;
> +static GLfloat Zpos = -10.0, Zrot = 0.0;
> +static GLuint TexObj;
> +
> +#define TEX_SIZE 1024
> +
> +
> +/** Make a solid-colored texture image */
> +static void
> +MakeImage(int level, int width, int height, const GLubyte color[4])
> +{
> +   const int makeStripes = 0;
> +   GLubyte img[TEX_SIZE * TEX_SIZE * 3];
> +   int i, j;
> +   for (i = 0; i < height; i++) {
> +      for (j = 0; j < width; j++) {
> +         int k = (i * width + j) * 3;
> +         int p = (i / 8) & makeStripes;
> +         if (p == 0) {
> +            img[k + 0] = color[0];
> +            img[k + 1] = color[1];
> +            img[k + 2] = color[2];
> +         }
> +         else {
> +            img[k + 0] = 0;
> +            img[k + 1] = 0;
> +            img[k + 2] = 0;
> +         }
> +      }
> +   }
> +
> +   glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
> +   glTexImage2D(GL_TEXTURE_2D, level, GL_RGB, width, height, 0,
> +                GL_RGB, GL_UNSIGNED_BYTE, img);
> +}
> +
> +
> +/** Make a mipmap in which each level is a different, solid color */
> +static void
> +MakeMipmap(void)
> +{
> +   static const GLubyte colors[12][3] = {
> +      {255, 0, 0},
> +      {0, 255, 0},
> +      {0, 0, 255},
> +      {0, 255, 255},
> +      {255, 0, 255},
> +      {255, 255, 0},
> +      {255, 0, 0},
> +      {0, 255, 0},
> +      {0, 0, 255},
> +      {0, 255, 255},
> +      {255, 0, 255},
> +      {255, 255, 0},
> +   };
> +   int i, sz = TEX_SIZE;
> +
> +   for (i = 0; sz > 0; i++) {
> +      MakeImage(i, sz, sz, colors[i]);
> +      printf("Level %d size: %d x %d\n", i, sz, sz);
> +      sz /= 2;
> +   }
> +}
> +
> +
> +static void
> +Init(void)
> +{
> +   glClearColor(.5, .5, .5, .5);
> +
> +   glGenTextures(1, &TexObj);
> +   glBindTexture(GL_TEXTURE_2D, TexObj);
> +   MakeMipmap();
> +
> +   glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
> +   glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
> +   glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
> +
> +   printf("GL_RENDERER = %s\n", (char *) glGetString(GL_RENDERER));
> +   printf("GL_VERSION = %s\n", (char *) glGetString(GL_VERSION));
> +}
> +
> +
> +static void
> +DrawTunnel(void)
> +{
> +   const float radius = 10.0, height = 500.0;
> +   const int slices = 24, stacks = 52;
> +   const float bias = 0.995;
> +   GLUquadric *q = gluNewQuadric();
> +
> +   glPushMatrix();
> +      glRotatef(180, 1, 0, 0);
> +      glEnable(GL_TEXTURE_2D);
> +      gluQuadricTexture(q, GL_TRUE);
> +      gluCylinder(q, radius, radius, height, slices, stacks);
> +
> +      glDisable(GL_TEXTURE_2D);
> +      glColor3f(0, 0, 0);
> +      gluQuadricDrawStyle(q, GLU_LINE);
> +      gluCylinder(q, bias*radius, bias*radius, height/4, slices, stacks/4);
> +   glPopMatrix();
> +
> +   gluDeleteQuadric(q);
> +}
> +
> +
> +static void
> +PrintString(const char *s)
> +{
> +   while (*s) {
> +      glutBitmapCharacter(GLUT_BITMAP_8_BY_13, (int) *s);
> +      s++;
> +   }
> +}
> +
> +
> +static void
> +Display(void)
> +{
> +   char str[100];
> +
> +   glBindTexture(GL_TEXTURE_2D, TexObj);
> +
> +   if (NearestFilter) {
> +      glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
> +      glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
> +                      GL_NEAREST_MIPMAP_NEAREST);
> +   }
> +   else {
> +      glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
> +      glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
> +                      GL_LINEAR_MIPMAP_LINEAR);
> +   }
> +
> +   glTexEnvf(GL_TEXTURE_FILTER_CONTROL_EXT, GL_TEXTURE_LOD_BIAS_EXT, LodBias);
> +
> +   glClear(GL_COLOR_BUFFER_BIT);
> +
> +   glPushMatrix();
> +      glTranslatef(0.0, 0.0, Zpos);
> +      glRotatef(Zrot, 0, 0, 1);
> +      DrawTunnel();
> +   glPopMatrix();
> +
> +   glColor3f(1, 1, 1);
> +   glWindowPos2i(10, 10);
> +   sprintf(str, "LOD bias (b/B): %.3f", LodBias);
> +   PrintString(str);
> +
> +   glutSwapBuffers();
> +}
> +
> +
> +static void
> +Reshape(int w, int h)
> +{
> +   glViewport(0, 0, w, h);
> +   glMatrixMode(GL_PROJECTION);
> +   glLoadIdentity();
> +   gluPerspective(80.0, 1.0 * (GLfloat) w / (GLfloat) h, 1.0, 3000.0);
> +   glMatrixMode(GL_MODELVIEW);
> +   glLoadIdentity();
> +}
> +
> +
> +static void
> +Key(unsigned char k, int x, int y)
> +{
> +   (void) x;
> +   (void) y;
> +   switch (k) {
> +   case 'b':
> +      LodBias -= 0.125;
> +      break;
> +   case 'B':
> +      LodBias += 0.125;
> +      break;
> +   case 'f':
> +      NearestFilter = !NearestFilter;
> +      break;
> +   case 'r':
> +      Zrot--;
> +      break;
> +   case 'R':
> +      Zrot++;
> +      break;
> +   case 'z':
> +      Zpos--;
> +      break;
> +   case 'Z':
> +      Zpos++;
> +      break;
> +   case 27:
> +      exit(0);
> +      break;
> +   default:
> +      return;
> +   }
> +   glutPostRedisplay();
> +}
> +
> +
> +static void
> +Usage(void)
> +{
> +   printf("Keys:\n");
> +   printf("  b/B    decrease/increase GL_TEXTURE_LOD_BIAS\n");
> +   printf("  f      toggle nearest/linear filtering\n");
> +   printf("  r/R    rotate tunnel\n");
> +}
> +
> +
> +int
> +main(int argc, char **argv)
> +{
> +   glutInitWindowSize(600, 600);
> +   glutInit(&argc, argv);
> +   glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
> +   glutCreateWindow(argv[0]);
> +   glewInit();
> +   glutReshapeFunc(Reshape);
> +   glutDisplayFunc(Display);
> +   glutKeyboardFunc(Key);
> +   Init();
> +   Usage();
> +   glutMainLoop();
> +   return 0;
> +}
>
> _______________________________________________
> mesa-commit mailing list
> mesa-commit at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-commit
>


More information about the mesa-dev mailing list