Sign in to follow this  
Moof

OpenGL Weird behavior with textures

Recommended Posts

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.

Share this post


Link to post
Share on other sites
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.

Share this post


Link to post
Share on other sites
Could you post the applicable drawing code for Object3D? This will let us check things like enable/disabling texturing, binding the correct texture, etc.

Share this post


Link to post
Share on other sites


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.

Share this post


Link to post
Share on other sites
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.

Share this post


Link to post
Share on other sites
Figured it out - my pixel array was defined as GLint instead of GLbyte, doh. Thanks for the help though :)

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this