Viewport-aligned texture shimmer problem...

Started by
0 comments, last by GenPFault 15 years, 4 months ago
Using fixed-function OpenGL hardware, is there any way to emulate GDI-style patterned brushes using textures in a fast/batched way? E.g., you have a polygon and want a nice 16x16 screen-aligned bitmap tiled across its surface. I've got the screen-aligned part figured out (go glTexGen!). I'd thought of using a big texture with all the patterns on it (so you'd only have one glBindTexture() per draw call) but I can't figure how to tile the subtextures. [Edited by - GenPFault on December 9, 2008 2:43:49 PM]
Advertisement
Well, turns out the number of glBindTexture()s and glDrawElements() I was doing on a vertex array were not breaking the performance bank.

I got the perspective texture coordinate generation case figured out too:
#include <GL/glut.h>#include <cstdlib>#include <cmath>static GLuint texName;void init(void){glClearColor(0,0,0,0);// create random textureconst int texWidth = 8;const int texHeight = 8;GLubyte tex[texHeight][texWidth][4];for(int i = 0; i < texHeight; i++)    {    for(int j = 0; j < texWidth; j++)         {        tex[j][0] = (GLubyte) rand()%255;        tex[j][1] = (GLubyte) rand()%255;        tex[j][2] = (GLubyte) rand()%255;        tex[j][3] = (GLubyte) 255;        }    }glPixelStorei(GL_UNPACK_ALIGNMENT, 1);glGenTextures(1, &texName);glBindTexture(GL_TEXTURE_2D, texName);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, texWidth, texHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, tex);// planes for texture coordinate generationGLfloat xp[] = {1,0,0,0};GLfloat yp[] = {0,1,0,0};GLfloat zp[] = {0,0,1,0};GLfloat wp[] = {0,0,0,1};glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);glTexGeni(GL_Q, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);glTexGenfv(GL_S, GL_EYE_PLANE, xp);glTexGenfv(GL_T, GL_EYE_PLANE, yp);glTexGenfv(GL_R, GL_EYE_PLANE, zp);glTexGenfv(GL_Q, GL_EYE_PLANE, wp);glEnable(GL_TEXTURE_GEN_S);glEnable(GL_TEXTURE_GEN_T);glEnable(GL_TEXTURE_GEN_R);glEnable(GL_TEXTURE_GEN_Q);glEnable(GL_DEPTH_TEST);glShadeModel(GL_SMOOTH);glEnable(GL_TEXTURE_2D);glEnable(GL_CULL_FACE);glEnable(GL_LIGHTING);glEnable(GL_LIGHT0);}void display(void){glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);// projectionglMatrixMode(GL_PROJECTION); glLoadIdentity();int viewport[4]; glGetIntegerv(GL_VIEWPORT, viewport);gluPerspective(60.0, (GLdouble)viewport[2]/(GLdouble)viewport[3], 1.0, 100.0 );// texture matrix trickeryint tw,th;glMatrixMode(GL_TEXTURE); glLoadIdentity();glBindTexture(GL_TEXTURE_2D, texName);glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &tw);glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_HEIGHT, &th);glScaled( (viewport[2]/2)/(GLdouble)tw, (viewport[3]/2)/(GLdouble)th, 0 );GLdouble proj[16];glGetDoublev(GL_PROJECTION_MATRIX, proj); // grab projection matrixglMultMatrixd(proj);// view transformglMatrixMode(GL_MODELVIEW); glLoadIdentity();glTranslatef(0,0,-2.5);// render textured teapotglPushMatrix();const float ANGLE_SPEED = 60; // degrees/secfloat angle = ANGLE_SPEED * (glutGet(GLUT_ELAPSED_TIME) / 1000.0f);glRotatef(angle*0.5f, 1, 0, 0);glRotatef(angle, 0, 1, 0);glRotatef(angle*0.7f, 0, 0, 1);glScalef(-1,-1,-1); // teapot is wound backwards (GL_CW), so flip itglutSolidTeapot(1);glPopMatrix();glutSwapBuffers();}void reshape(int w, int h){// make width/height evenly divisible by 2w -= (w%2);h -= (h%2);glViewport(0, 0, (GLsizei) w, (GLsizei) h);}void keyboard (unsigned char key, int x, int y){switch (key)     {     case 27: exit(0); break;    default: break;     }}void idle() { glutPostRedisplay(); }int main(int argc, char** argv){glutInit(&argc, argv);glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);glutInitWindowSize(640, 480);glutInitWindowPosition(100, 100);glutCreateWindow (argv[0]);glutDisplayFunc(display);glutReshapeFunc(reshape);glutKeyboardFunc(keyboard);glutIdleFunc(idle);init();glutMainLoop();return 0;}


However, it shimmers pretty badly without the hack in reshape(), using GL_NEAREST and non-even viewport dimensions. I think some sort of glTranslate() in the texture matrix might fix it, but I'm not sure what to use. Any ideas?

Thanks!

This topic is closed to new replies.

Advertisement