Sorry folks, I attached the wrong file. This is the second time in a
week. I have to be more careful. Now the correct program.
Am Do, den 16.12.2004 schrieb Felix Kühling um 1:11:
Hi,
I noticed some strange rendering artifacts with the Savage that are
caused by very large texture coordinates on GL_REPEAT'ed textures. Very
large means that it gets noticeable with texture coordinates 255 or
-256. A real world example that exhibits this problem is Torcs with the
Spring track. Right at the start the effect can be seen very nicely.
The track before the start line shows artifacts, directly after the
start line everything looks fine.
My question is, should I consider such problems an application bug or
would it be wise to implement a workaround? I was thinking of
implementing a TNL pipeline stage that normalizes texture coordinates.
I was also wondering if other hardware has similar problems. I'm
attaching a small test program that demonstrates the effect and a
screenshot of what I get on my ProSavageDDR. With software rendering the
output is almost correct. Compile with
cc -lGL -lGLU -lglut teximage.c -o teximage
Thanks in advance,
Felix
--
| Felix Kühling [EMAIL PROTECTED] http://fxk.de.vu |
| PGP Fingerprint: 6A3C 9566 5B30 DDED 73C3 B152 151C 5CC1 D888 E595 |
#include GL/gl.h
#include GL/glu.h
#include GL/glut.h
#include stdio.h
#include stdlib.h
#define TEX_OFFSET_X 1024.0
#define TEX_OFFSET_Y 1024.0
#define MAX_WIDTH 128
#define MAX_HEIGHT 128
GLubyte texData[MAX_WIDTH * MAX_HEIGHT * 3];
GLuint texture;
GLuint tWidth = 0, tHeight = 0;
void init () {
GLuint x, y;
GLubyte *p;
glClearColor (0.0, 0.0, 0.0, 0.0);
glShadeModel (GL_FLAT);
p = texData;
for (y = 0; y tHeight; ++y)
for (x = 0; x tWidth; ++x, p += 3) {
if ((x 7) == 4 || (y 7) == 4) {
p[0] = 0;
p[1] = 0;
p[2] = 255;
} else {
p[0] = tWidth 1 ? x * 255 / (tWidth-1) : 128;
p[1] = tHeight 1 ? y * 255 / (tHeight-1) : 128;
p[2] = 0;
}
}
glGenTextures (1, texture);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, texture);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, tWidth, tHeight, 0,
GL_RGB, GL_UNSIGNED_BYTE, texData);
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_MAG_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
}
void display () {
glClear (GL_COLOR_BUFFER_BIT);
glEnable(GL_TEXTURE_2D);
glBindTexture (GL_TEXTURE_2D, texture);
glBegin(GL_QUADS);
glColor3f(1.0, 1.0, 0.0);
glTexCoord2f(0.0+TEX_OFFSET_X, 2.0+TEX_OFFSET_Y); glVertex2f(-1.0, -1.0);
glTexCoord2f(2.0+TEX_OFFSET_X, 2.0+TEX_OFFSET_Y); glVertex2f( 1.0, -1.0);
glTexCoord2f(2.0+TEX_OFFSET_X, 0.0+TEX_OFFSET_Y); glVertex2f( 1.0, 1.0);
glTexCoord2f(0.0+TEX_OFFSET_X, 0.0+TEX_OFFSET_Y); glVertex2f(-1.0, 1.0);
glEnd();
glutSwapBuffers();
}
void reshape (int w, int h) {
glViewport (0, 0, (GLsizei) w, (GLsizei) h);
glMatrixMode (GL_PROJECTION);
glLoadIdentity ();
glOrtho (-1.0, 1.0, -1.0, 1.0, -1.0, 1.0);
glMatrixMode (GL_MODELVIEW);
}
int main (int argc, char *argv[]) {
int winId;
if (argc 2)
tWidth = 128;
else if (sscanf (argv[1], %u, tWidth) != 1) {
fprintf (stderr, Error: invalid width: %s\n, argv[1]);
return 1;
}
if (argc 3)
tHeight = 128;
else if (sscanf (argv[2], %u, tHeight) != 1) {
fprintf (stderr, Error: invalid height: %s\n, argv[2]);
return 1;
}
if (tWidth == 0 || tWidth MAX_WIDTH) {
fprintf (stderr, Error: width out of range [1:%u].\n, MAX_WIDTH);
return 1;
}
if (tHeight == 0 || tHeight MAX_HEIGHT) {
fprintf (stderr, Error: height out of range [1:%u].\n, MAX_HEIGHT);
return 1;
}
glutInit (argc, argv);
glutInitDisplayMode (GLUT_RGBA | GLUT_DOUBLE);
glutInitWindowSize (250, 250);
glutInitWindowPosition (100, 100);
winId = glutCreateWindow (Texture Test);
init ();
glutDisplayFunc (display);
glutReshapeFunc (reshape);
glutMainLoop ();
return 0;
}