Domanda

Sto scrivendo un'app per Mac OS> = 10.6 che crea trame OpenGL da immagini caricate dal disco.

Innanzitutto, carico l'immagine in un nsimage. Quindi ottengo NSBitmapimagERep dall'immagine e carico i dati dei pixel in una trama usando GLTEXIMAGE2D.

Per le immagini RGB o RGBA, funziona perfettamente. Posso passare in 3 byte/pixel di RGB o 4 byte di RGBA e creare una trama RGBA a 4 byte/pixel.

Tuttavia, ho appena avuto un tester che mi ha inviato un'immagine JPEG (girato su un Canon EOS 50D, non sono sicuro di come sia stato importato) che sembra avere un ordinamento di byte Argb.

Ho trovato un post su questo thread: (http://www.cocoabuilder.com/archive/cocoa/12782-coregraphics-over-opengl.html) che suggerisce di specificare un parametro di formato di gl_bgra a glteximage2d e un tipo di tipo Gl_unsigned_int_8_8_8_8_rev.

Sembra logico e sembra che dovrebbe funzionare, ma non lo fa. Divento valori di colore diverso, ma ancora sbagliato.

Ho scritto il codice "Swizzling" (manuale di byte-swapping) che mescola i dati dell'immagine Argb in un nuovo buffer RGBA, ma questo byte per byte swizzling sarà lento per immagini di grandi dimensioni.

Vorrei anche capire come fare questo lavoro "nel modo giusto".

Qual è il trucco per caricare i dati Argb in una trama OpenGL RGBA?

La mia attuale chiamata a XXX sembra così:

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, newWidth, newHeight, 0, format, GL_UNSIGNED_BYTE, pixelBuffer);

dov'è RGB o RGBA.

Ho provato a usare:

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, newWidth, newHeight, 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, pixelBuffer);

Quando il mio rappresentante di immagine riporta che è in ordine "Alpha First".

Come seconda domanda, ho anche letto che il formato "nativo" della maggior parte della scheda grafica è GL_BGRA, quindi la creazione di una trama in quel formato si traduce in un disegno di trama più veloce. La velocità del disegno della trama è più importante della velocità di caricamento della trama, quindi "Svizzing" i dati al formato bgra in anticipo ne varrebbe la pena. Ho provato a chiedere a OpenGL di creare una trama BGRA specificando una "format interna" di GL_RGBA, ma ciò si traduce in un'immagine completamente nera. La mia interpretazione sui documenti mi fa aspettare che GLTEXIMAGE2D avrebbe superato i dati in quanto li legge se i formati di origine e interni sono diversi, ma invece ottengo un errore OpenGL 0x500 (gl_invalid_enum) quando provo a specificare una "formatta interna" di Gl_rgba. Cosa mi manca?

Nessuna soluzione corretta

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