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

Brian Paul brian.e.paul at gmail.com
Thu Oct 14 08:42:17 PDT 2010


Guess so.  I hadn't noticed that test before.

-Brian


On Thu, Oct 14, 2010 at 9:05 AM, Keith Whitwell
<keith.whitwell at gmail.com> wrote:
> 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
>>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
>


More information about the mesa-dev mailing list