Domanda

Ho avuto questo problema un paio di volte. Diciamo che voglio mostrare uno splash-screen o qualcosa in un contesto OpenGL (o DirectX del resto, è più una cosa concettuale), ora, potrei semplicemente caricare una trama 2048x2048 e sperare che la scheda grafica possa far fronte (la maggior parte lo sarà oggigiorno suppongo), ma crescendo con la scheda grafica della vecchia scuola ho questa cattiva coscienza appoggiata su di me e che mi dice che non dovrei usare trame così grandi.

Qual è il modo preferito al giorno d'oggi? È solo per riempire quella cosa nella memoria video, affiancarla o lasciare che la CPU faccia il lavoro e glDrawPixels? O qualcosa di più elaborato?

È stato utile?

Soluzione

Se si tratta di un'immagine splash a fotogramma singolo senza animazioni, non è possibile utilizzare glDrawPixels . Se le prestazioni sono cruciali e ti viene richiesto di utilizzare una trama, il modo corretto per farlo è determinare in fase di esecuzione la dimensione massima supportata della trama, usando una trama 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 volta che conosci le dimensioni massime della trama supportate dal driver OpenGL del sistema, hai almeno due opzioni se l'immagine non si adatta:

  • Piastrellatura di immagini : usa più quad dopo aver diviso l'immagine in blocchi più piccoli supportati. La piastrellatura delle immagini per qualcosa di simile a una schermata iniziale non dovrebbe essere troppo complicata. Puoi utilizzare glPixelStorei 's < codice> GL_PACK_ROW_LENGTH per caricare sezioni di un'immagine più grande in una trama.
  • Ridimensionamento dell'immagine : ridimensiona l'immagine per adattarla alle dimensioni massime della trama supportate. C'è anche una funzione di supporto GLU per farlo, gluScaleImage .

Altri suggerimenti

Non penso che ci sia una funzione opengl integrata, ma potresti trovare una libreria (o scrivere tu stesso la funzione) per suddividere l'immagine in blocchi più piccoli e quindi stampare per schermare i blocchi più piccoli (tessere 128x128 o simile).

Ho avuto problemi con questo usando Slick2D per un gioco Java. Puoi dare un'occhiata al loro " BigImage " lezione per idee qui .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top