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

Reply via email to