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;
}