2009-01-08 12 views
6

? He tenido este problema un par de veces. Digamos que quiero mostrar una pantalla de bienvenida o algo en un contexto de OpenGL (o DirectX para el caso, es más una cuestión conceptual), ahora, podría cargar una textura de 2048x2048 y esperar que la tarjeta gráfica resuelva el problema. (la mayoría supondrá hoy en día), pero creciendo con la tarjeta gráfica de la vieja escuela, tengo esta mala conciencia inclinada sobre mí y diciéndome que no debería usar texturas tan grandes.¿Cuál es la forma preferida de mostrar imágenes grandes en OpenGL

¿Cuál es la forma preferida hoy en día? ¿Es simplemente meter esa cosa en la memoria de video, colocarla en mosaico o dejar que la CPU haga el trabajo y glDrawPixels? ¿O algo más elaborado?

+1

'glDrawPixels' es realmente lento, ciertamente no lo usará. – d0k

+0

De hecho arrojé glDrawPixels allí más por color ... :) – falstro

Respuesta

10

Si se trata de una imagen splash de un solo cuadro sin animaciones, entonces no hay ningún daño al usar glDrawPixels. Si el rendimiento es crucial y se le requiere usar una textura, entonces la forma correcta de hacerlo es determinar, en tiempo de ejecución, el tamaño de textura máximo soportado, utilizando una textura de proxy.

GLint width = 0; 
while (0 == width) { /* use a better condition to prevent possible endless loop */ 
    glTexImage2D(GL_PROXY_TEXTURE_2D, 
         0,    /* mip map level */ 
         GL_RGBA,   /* internal format */ 
         desiredWidth,  /* width of image */ 
         desiredHeight, /* height of image */ 
         0,    /* texture border */ 
         GL_RGBA   /* pixel data format, */ 
         GL_UNSIGNED_BYTE, /* pixel data type */ 
         NULL    /* null pointer because this a proxy texture */ 
    ); 

    /* the queried width will NOT be 0, if the texture format is supported */ 
    glGetTexLevelParameteriv(GL_PROXY_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &width); 

    desiredWidth /= 2; desiredHeight /= 2; 
} 

Una vez que se conoce el tamaño máximo de la textura con el apoyo de controlador OpenGL del sistema, que tienen al menos dos opciones si su imagen no encaja:

  • mosaicos con la imagen: utilizar múltiples quads después dividiendo su imagen en trozos más pequeños soportados. El mosaico de imágenes para algo así como una pantalla de bienvenida no debería ser demasiado complicado. Puede usar el parámetro glPixelStorei de GL_PACK_ROW_LENGTH para cargar secciones de una imagen más grande en una textura.
  • Cambio de tamaño de la imagen: cambie el tamaño de la imagen para que se ajuste al tamaño de la textura máxima admitida. Incluso hay una función auxiliar de GLU para hacer esto por usted, gluScaleImage.
+0

GLint ancho = 0; // ;-) – Will

+0

oops ;-) (también me acabo de dar cuenta de que mi comentario tiene un error de sintaxis) – codelogic

+0

Es 'GL_UNPACK_ROW_LENGTH', y se usa de la siguiente manera: http://stackoverflow.com/a/205569/362515 – user362515

0

No creo que haya una función OpenGL incorporada, pero puede encontrar una biblioteca (o escribir la función usted mismo) para dividir la imagen en trozos más pequeños y luego imprimir para seleccionar los trozos más pequeños (128x128 teselas o similar).

Tuve un problema con esto usando Slick2D para un juego de Java. Puede consultar su clase de "BigImage" para obtener ideas here.

Cuestiones relacionadas