Sto lavorando a un gioco e tutti i miei elementi grafici utilizzano il magenta come colore trasparente/magico. Sono tutti a 32 bit e il magenta è solo per comodità. Ad ogni modo, sarei grato se qualcuno potesse consigliarmi quale libreria dovrei usare per caricare le mie immagini (ho bisogno di caricarle in formato GL_RGBA, sia interne che texture specifiche).Caricamento di textures PNG su OpenGL
risposta
A parte le altre risposte che citano SDL e diavolo, ci sono altre due opzioni da considerare:
- Usa libpng direttamente. Questo probabilmente avrà il più piccolo impatto sulla dimensione del codice se questo è importante, dal momento che non si aumenta per altri formati che non si utilizzano, nessuna DLL, ecc.
- Utilizzare il caricamento della trama del sistema operativo. Questo può essere un buon modo per ridurre le dipendenze se preferisci usare le funzionalità del sistema operativo su librerie esterne. GDI + in Windows XP e versioni successive ha un caricamento delle texture integrato per alcuni formati come PNG e JPEG, e non lo so per certo, ma altri sistemi operativi potrebbero avere caratteristiche simili. È abbastanza semplice agganciare GDI + a OpenGL e il sistema operativo si sta occupando del caricamento della trama!
DevIL può caricare praticamente tutti i formati di file e può creare direttamente trame OpenGL. È il modo più semplice per andare.
È inoltre consigliabile utilizzare un formato file che supporti un canale alfa (PNG, TGA, ...). L'uso di un "colore magico" nelle immagini a 32 bit è davvero obsoleto!
L'utilizzo di DevIL e OpenGL insieme per il caricamento delle immagini è estremamente semplice, quasi tutti i numeri magici sono uguali (in base alla progettazione). Ho del codice (non promette che sia il migliore ;-)) per fare questo qui (funzione loadShaderTexture): http://nwshader.svn.sourceforge.net/viewvc/nwshader/nwshader/init.cpp?revision=18&view=markup – ssube
Se è necessario solo il supporto PNG, utilizzare libpng. DevIL dovrebbe essere facile, ma è un po 'gonfio (fa molto di più che caricare le immagini) e internamente effettivamente chiama le funzioni OpenGL che possono rovinare la tua logica OpenGL.
Personalmente preferisco SDL_image, dal momento che sto utilizzando SDL nei miei progetti comunque. Sebbene non sia immediatamente evidente, la funzione SDL_BlitSurface() può eseguire la conversione da qualunque IMG_Load() restituisce il formato pixel necessario.
DevIL può essere utilizzato per caricare solo immagini (senza chiamate OpenGL) o per caricare immagini direttamente nelle trame OpenGL (che necessariamente chiama le funzioni OpenGL). – Danvil
C'è un esempio molto minimalista un file di caricamento di un png in openGL qui:
Un'altra opzione è OpenCV.
Fa molto più del semplice caricamento della trama, ma le probabilità sono buone, troverete anche l'uso delle sue altre caratteristiche.
OpenCV fornisce funzioni per fornire dati di immagine in un formato pronto per essere inserito in una trama OpenGL? – thecoshman
Qualsiasi esempio di codice per il caricamento GDI +? – Macke
Vedere GLTexture :: LoadFromFile() dalla riga 510 qui: http://construct2.svn.sourceforge.net/viewvc/construct2/source/common/cr/glrenderer/glrenderer_windows.cpp?revision=102&view=markup Potrebbe essere un po 'più complicato del necessario - utilizza trame premoltiplicate e ha il codice per copiare la trama su una superficie di potenza di due con grondaie trasparenti. – AshleysBrain
Perché preoccuparsi di come caricare le immagini, quando ci sono librerie in giro che lo fanno per te. – Danvil