Pregunta

He tenido este problema un par de veces. Digamos que quiero mostrar una pantalla de bienvenida o algo en un contexto OpenGL (o DirectX para el caso, es más una cosa conceptual), ahora, podría cargar una textura de 2048x2048 y esperar que la tarjeta gráfica haga frente (supongo que la mayoría lo hará hoy en día), pero al crecer 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 hoy en día? ¿Es solo meter esa cosa en la memoria de video, colocarlo en mosaico o dejar que la CPU haga el trabajo y glDrawPixels? ¿O algo más elaborado?

¿Fue útil?

Solución

Si esta es una imagen de bienvenida de un solo cuadro sin animaciones, entonces no hay daño al usar glDrawPixels . Si el rendimiento es crucial y se requiere que use una textura, entonces la forma correcta de hacerlo es determinar en tiempo de ejecución, el tamaño máximo de textura admitido, usando una textura 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 conoce el tamaño máximo de textura admitido por el controlador OpenGL del sistema, tiene al menos dos opciones si su imagen no se ajusta:

  • Mosaico de imágenes : use múltiples quads después de dividir su imagen en fragmentos más pequeños compatibles. El mosaico de imágenes para algo así como una pantalla de presentación no debería ser demasiado complicado. Puede usar glPixelStorei 's < code> GL_PACK_ROW_LENGTH parámetro para cargar secciones de una imagen más grande en una textura.
  • Cambio de tamaño de la imagen : cambie el tamaño de su imagen para que se ajuste al tamaño máximo de textura admitido. Incluso hay una función auxiliar de GLU para hacer esto por usted, gluScaleImage .

Otros consejos

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 fragmentos más pequeños y luego imprimir para filtrar los fragmentos más pequeños (mosaicos de 128x128 o similar).

Tuve un problema con esto usando Slick2D para un juego Java. Puede consultar su " BigImage " clase para ideas aquí .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top