2011-10-18 24 views
5

Supongamos que cargo una matriz de bytes como RGB de un archivo determinado.¿Se deben voltear las texturas OpenGL?

He leído que a OpenGL le gusta almacenar sus texturas "invertidas", y he visto programas de demostración que almacenan sus imágenes al revés.

Entonces, en mi programa, ¿debo invertir la matriz RGB cargada byte o línea por línea?

Respuesta

6

Esto se debe a que el formato Bitmap (.bmp) almacena sus líneas al revés. No estoy seguro de a quién se le ocurrió eso, pero es una cuestión de formato de archivo. Muy bien, sí, debes hacerlo si usas tu propio cargador .bmp. Sin embargo, puede utilizar uno que ya se haya escrito "upside-downs" la imagen para usted. De nuevo, es solo una cosa .bmp. OpenGL funciona por defecto en imágenes no volteadas.

Aquí hay un pequeño truco: Si no desea cambiar su cargador .bmp, se puede decir OpenGL para voltear la imagen para usted:

glMatrixMode(GL_TEXTURE); 
glLoadIdentity(); 
glScalef(1.0f, -1.0f, 1.0f); 
glMatrixMode(GL_MODELVIEW); 

Eso es lo que quería decir con "por defecto". Puede poner OpenGL al revés si lo desea. Sin embargo, esto solo funciona si solo carga archivos .bmp. Otros formatos de archivo almacenan sus líneas correctamente. Por lo tanto, prefiero el primer enfoque: use un cargador real .bmp.

Para que quede claro: si carga archivos .bmp, que MUST voltear la imagen, ya sea con la mano antes de enviarlo a OpenGL (que la mayoría de los cargadores hacen .bmp), O enviar la imagen a no invertidos OpenGL y agregue el código anterior antes de su código de representación.

+0

Correcto, de hecho todas las imágenes volteadas eran BMP. ¿Pero qué tal cómo OpenGL toma las coordenadas de textura? (0,0) está en el primer píxel en la última línea, ¿estoy bien, y (1,1) es el último píxel en la primera línea? ¿No necesito voltear la matriz para que esto sea correcto? –

+0

¡Bueno, depende! Si solo toma los datos de BMP sin procesar y los envía a OpenGL, entonces sí, (0,0) se convierte de repente en el primer píxel de la primera línea. Si desea que (0,0) se convierta en el último píxel de la primera línea nuevamente, debe voltear la matriz antes de enviarlo a OpenGL. Una alternativa es el código Texture-matrix-scaling anterior. –

+0

@catfish_deluxe_call_me_cd ¡No! (0,0) es el primer píxel en la primera línea. Es solo que en OpenGL las líneas de la imagen se ordenan de abajo hacia arriba, pero el origen todavía está en el primer píxel de la primera línea de los datos de imagen ** que ** envía a OpenGL. –

Cuestiones relacionadas