Weird behavior with textures

Started by
6 comments, last by zzzBlackStar 16 years, 4 months ago
I am putting together a little application in OpenGL and this is the first time I have had to deal with textures. My application is set up as follows: I have an Object3D class that holds vertex and normal arrays for rendering my 3D objects. I have a Texture class that generates a textures based on Perlin noise and holds the pixel data in a public array. My Object3D class has a private Texture object that is created when the Object3D is constructed. The pixel data is grabbed from the array and it is bound using the following code (again all in the constructor):


  glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
  glGenTextures(1, &texName);
  glBindTexture(GL_TEXTURE_2D, texName);

  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, HEIGHT, WIDTH, 0, GL_RGBA, GL_UNSIGNED_BYTE, texture.textureImage);

  glEnable(GL_TEXTURE_2D);
  glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
Note that texName is a private GLuint. Then in my Object3D's draw function, I draw the texture using calls to glTexCoord2f() on each vertex. However, nothing shows up. If I call glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, HEIGHT, WIDTH, 0, GL_RGBA, GL_UNSIGNED_BYTE, texture.textureImage); in my draw() function (ie it is being called every frame), then i get a crazy looking orange texture that looks nothing like it should, plus the application slows down to about 10fps. I know that the texture generation code works fine, as I have tested it with a simple application (just texturing a simple cube) and it works with no problems. I have some idea that my problem likely comes from the fact that each frame I am calling the draw function of multiple Object3Ds, but I have been hacking away at this for hours no without making any progress. If anyone has any suggestions I would really appreciate it. Thank you.
Advertisement
You said your texture program worked fine with the cube? What are you doing differently?
Holy crap, you can read!
With the cube, I am generating one texture and then directly mapping it onto the cube all in one file, with no classes. With my application, the program calls the draw() function of each Object3D (some of which have textures, some of which do not) and the textures are mapped inside the draw() function. My application is much more complex than the simple cube one, so it is likely I am missing something pretty simple but I can't figure out what it is. I was just hoping someone has come across a similar issue in the past and could give me some pointers.
Could you post the applicable drawing code for Object3D? This will let us check things like enable/disabling texturing, binding the correct texture, etc.
void Object3D::draw(bool dn, int mode, float crease, int shadingMode) {        ...	glMatrixMode(GL_MODELVIEW);	glPushMatrix(); 	if(textureSet) {		glEnable(GL_TEXTURE);		glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);		glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, HEIGHT, WIDTH, 0, GL_RGBA, GL_UNSIGNED_BYTE, texture.textureImage);                 // if this is commented everything is drawn untextured. If it is uncommented,                    // everything is drawn red (even those objects where                 // textureSet = false). I also removed all calls to glColor3f to                // see if I could figure out where the red color was coming                 // from, but still everything was drawn red.		 glBindTexture(GL_TEXTURE_2D, texName);	}	else		glDisable(GL_TEXTURE);    	// draw the geometry	glBegin(GL_TRIANGLES);	// draw each triangle based on the info in the faces vector			if(textureSet)			glTexCoord2f(0,0);		// add first face vertex		...				// bind texture		if(textureSet)			glTexCoord2f(1,0);		// add second face vertex		...				// bind texture		if(textureSet)			glTexCoord2f(1,1);		// add third face vertex		...		}	glEnd();	glPopMatrix();}


I only included the relevant code. For now I am setting the texture coordinates to (0,0), (1,0), (1,1) just to try and get it working.
Quote:Original post by Moof
For now I am setting the texture coordinates to (0,0), (1,0), (1,1) just to try and get it working.

This could be the problem. If the object is made up of lots of little triangles, they will all have the entire (well, half of it, anyway) texture applied. This will lead to lots of triangles with an entire texture squeezed onto them, resulting in garbage. If this is the case, try a standard cube model and see if the same thing happens. Or, for a more complex model, try using glTexGen to generate texture coordinates for you.
Figured it out - my pixel array was defined as GLint instead of GLbyte, doh. Thanks for the help though :)
OK thats right

This topic is closed to new replies.

Advertisement