Oops forgot to attach the source code....

Scott McMillan wrote:
> 
> I have been playing with scaling the texture matrix and I have
> come across a weird result on my Linux box running Mesa 3.0
> (that doesn't show up on my SGI at work).
> 
> The attached program scales the texture matrix (2, 2, 0), and
> renders a textured triangle strip with texture coords in the
> range [0, 1]  (the result looks like I have an identity texture
> matrix with texture coords in the range [0, 2] and I have set
> clamp.
> 
> The resulting texturing gets messed up in area outside the normal
> texture (where the CLAMP causes the edge pixel to be "stretched"
> across the polygon), but (and this is the good part) ONLY WHEN THE
> POLYGON GETS TOO CLOSE TO THE VIEW.
> 
> Can anyone else recreate this in current beta versions (I am still
> trying to set up CVS at home)?  If so, is this a bug or just an
> area outside of the spec?
> 
> Regards,
> scott

-- 
Scott McMillan                        mailto:[EMAIL PROTECTED]
Cambridge Research Associates         http://www.cambridge.com
1430 Spring Hill Road, Ste. 200       Voice: (703) 790-0505 x7235
McLean, VA 22102                      Fax:   (703) 790-0370
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glut.h>
#include <math.h>


//----------------------------------------------------------------------------
#define imageSize 64
GLubyte checkImage[imageSize][imageSize][4];

void makeCheckImage()
{
   int i, j, c;

   for (i=0; i<imageSize; i++)
   {
      for (j=0; j<imageSize; j++)
      {
         c = (1 - (((i&0x8)==0)^((j&0x8))==0))*255;
         checkImage[i][j][0] = c;
         checkImage[i][j][1] = c/2;
         checkImage[i][j][2] = 0;
         checkImage[i][j][3] = 255;
      }
   }
}

//----------------------------------------------------------------------------
void myInit()
{
   glClearColor(0,0,0,0);
   glEnable(GL_DEPTH_TEST);
   glDepthFunc(GL_LEQUAL);

   makeCheckImage();

   glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
   glTexImage2D(GL_TEXTURE_2D, 0, 4, imageSize, imageSize, 0, GL_RGBA,
                GL_UNSIGNED_BYTE, &checkImage[0][0][0]);

   glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
   glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);

   glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
   glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);

   glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
   glEnable(GL_TEXTURE_2D);
}

//----------------------------------------------------------------------------
float mytime = 0.0;

void display()
{
   glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

   mytime += 0.1;

   glMatrixMode(GL_MODELVIEW);
   glLoadIdentity();
   glTranslatef(-1.5, 0.0, -4.6 + cos(mytime));

   glBegin(GL_TRIANGLE_STRIP);
   {
      glTexCoord2f(0.0, 0.0); glVertex3f(1.0, -1.0, 0.0);
      glTexCoord2f(0.0, 1.0); glVertex3f(1.0,  1.0, 0.0);
      glTexCoord2f(1.0, 0.0); glVertex3f(2.41421, -1.0, -1.41421);
      glTexCoord2f(1.0, 1.0); glVertex3f(2.41421,  1.0, -1.41421);
   }
   glEnd();

   glFlush();
   glutSwapBuffers();
}

//----------------------------------------------------------------------------
void myReshape(GLsizei w, GLsizei h)
{
   glViewport (0, 0, w, h);

   glMatrixMode(GL_PROJECTION);
   glLoadIdentity();
   gluPerspective(45.0, (GLfloat)w/(GLfloat)h, 1.0, 200.0);

   glMatrixMode(GL_TEXTURE);
   glPushMatrix();
   glScalef(2.0, 2.0, 1.0);
}

//----------------------------------------------------------------------------
int main(int argc, char** argv)
{
   glutInit(&argc, argv);

   glutInitWindowSize(700, 512);
   glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
   glutCreateWindow("texScaleTest");

   myInit();

   glutReshapeFunc(myReshape);
   glutDisplayFunc(display);
   glutIdleFunc(display);

   glutMainLoop();
   return 0;
}

Reply via email to