Domanda

Devo visualizzare immagini 2D in modalità aperta usando le trame.
Le dimensioni dell'immagine non sono necessariamente potenze di 2.
Ho pensato di creare una trama più grande e di limitare la visualizzazione alla parte che stavo usando, ma i dati dell'immagine saranno condivisi con openCV, quindi non voglio copiare i dati un pixel alla volta in una trama più grande.

EDIT: si scopre che anche la più semplice grafica Intel integrata su Windows supporta trame nessuna potenza di 2.

EDIT2 - e anche se non hai le dimensioni della trama arb, quindi ridimensionando l'immagine e ridimensionando alla dimensione della finestra è molto veloce anche su hardware di fascia bassa

È stato utile?

Soluzione

Mi vengono in mente un paio di estensioni GL. Dai un'occhiata a GL_ARB_texture_rectangle (se non hai bisogno del mipmapping) o GL_ARB_texture_non_power_of_two (se lo fai).

Altri suggerimenti

Una trappola da evitare è che per qualche motivo alcune schede video richiedono che GL_UNPACK_ALIGNMENT sia impostato su 1 (glPixelStorei (GL_UNPACK_ALIGNMENT, 1);) per caricare correttamente una trama non-power-of-two.

Se solo potessi aggiungere qualcuno che si imbattesse in questo in futuro, la maggior parte della documentazione e dei tutorial / esempi che trovi sul Web su OpenGL è obsoleta da molti anni, incluso il materiale nehe.gamedev, e ti guiderà credere che cose come una dimensione di trama diversa da due siano un problema quando non lo sono realisticamente, o ti incoraggiano a usare funzioni opengl obsolete da tempo o librerie che non sono state aggiornate da un decennio.

Prima di tutto, la maggior parte dei videocards moderni in realtà supporta dimensioni di trama che sono sia non quadrate che non di potenza di due dimensioni. Ma per la massima compatibilità, si consiglia probabilmente di utilizzare solo la potenza di due trame.

Inizia determinando la potenza più vicina di due più grande per ciascuna delle dimensioni dell'immagine (larghezza e altezza) e creando una trama di quella dimensione. Quindi hai due opzioni. Il primo è fare un ridimensionamento del software dei dati pixel per adattarlo all'immagine, quindi ridimensionare il quad secondo la razione originale quando è necessario visualizzarlo. In alternativa, puoi semplicemente riempire parte della trama con i tuoi dati immagine e mettere pixel trasparenti nel resto.

Se vuoi usare la potenza di 2 trame, crea la più piccola che può riprendere l'immagine e calcola le coordinate della trama appropriate per visualizzare solo la parte della trama che contiene l'immagine. Per esempio. se la tua immagine è 400x300, useresti una texture 512x512, copi la tua immagine riga per riga e la tua coordinata texture corretta sarebbe 400.0 / 512.0, quella inferiore 300.0 / 512.0. Sembrerà migliore del ridimensionamento del software.

Faccio esattamente come descrivi, copio in una trama power-of-2 e regola di conseguenza i miei uv. Le estensioni sarebbero belle, ma non è garantito che siano supportate su un computer arbitrario.

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