Viewport-aligned texture shimmer problem...
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]
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:
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!
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
Popular Topics
Advertisement