views:

67

answers:

1

I'm using a full-screen background texture. It's stored in a 512x512 PNG file. When rendering it to the screen using glDrawTexfOES, for some reason I need to add a 32 point y-offset in order to make it align with the screen. Why?

glBindTexture(GL_TEXTURE_2D, backgroundTexture);
int backgroundRectangle[] = { 0, 480, 320, -480 }; // Handle origin at upper left
glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_CROP_RECT_OES, backgroundRectangle);
glColor4f(1, 1, 1, 1);
glDrawTexfOES(0, 32, 1, 320, 480);
+2  A: 

The logical origin of textures on OpenGL is the lower left corner of the texture..

Your screen has a height of 480 pixels and the texture is 512 pixels in size. This won't match without an offset.

To compensate for this you have to draw your texture using the 32 pixel offset. Let's see how much: 512-480 is ... you guessed it ... 32. That's where your offset comes from.

You can get around this by changing your texture-load code to align the image to the upper-left corner of the texture. Afterwards you don't need the offset during rendering anymore. Instead it will move to your texture load function.

I for one would do this because textures only get loaded once and drawn quite a bit. It makes the hard to understand code (drawing) more readable. Not that such a code is difficult to understand, but I know from experience that these codes get messy and hard to understand over time..

You will not make anything faster though - such a change is only good for readability.

Nils Pipenbrinck
Thanks, Nils. That was exactly it. I had indeed created the texture slammed to the lower left, cuz I thought the origin was there. I also discovered that the origin being in the top left required that I make use of a negative height in order to flip the image vertically.
bfalling