2012-02-11 17 views
8

Non riesco a trovare la funzione glTexImage3D() da OpenGL in OpenGL ES 2.0. Quindi, come posso usare una texture 3D, ad es .: un file .tga?Come posso utilizzare una texture 3D in iOS?

Qualcuno sa come utilizzare una trama 3D in OpenGL ES 2.0?

risposta

2

Non posso trovato v'è la funzione glTexImage3D in OpenGL ES 2

Perché texture 3D non sono supportate da OpenGL-ES. Pensaci: una texture 3D richiede molta più memoria di una 2D. E la memoria è una risorsa molto scarsa sui dispositivi embedded/mobile, che è ciò a cui è destinato ES.

Penso che forse qualcuno conosce l'algoritmo dell'utilizzo della trama 3d?

Non è tanto un problema algoritmico, ma una delle risorse limitate. In teoria è possibile utilizzare più unità di trama/campionatori per caricare i livelli e interpolazione nello shader. Ma questo sarebbe privo di profondità di mipmaping.

trama 3D, ad es .: file .tag?

file TAG? Scusa, non sono a conoscenza di questo formato. Potresti darmi un link per leggerlo? Google non ha trovato informazioni utili su di esso. Forse intendevi TGA?

+0

Grazie per la tua risposta! Sì, intendo .tga ... – Ning

+0

Grazie per la tua risposta! In effetti non sono sicuro di cosa ho bisogno è 3d texture. È il mio primo lavoro da fare con opengl es. Accetto un progetto e ho bisogno di rendere una casa sullo schermo. Quando apro il file .obj, ho trovato che ogni vt ha tre componenti, non solo vt. Se ignoro il terzo componente di vt, la trama è molto strana. Forse non dovrò usare la texture 3d? Ho seguito l'immagine della trama. Forse voi esperti sapete di cosa ho bisogno. ww2.sinaimg.cn/large/991557bagw1dpytx071d5j.jpg E l'effetto finale http://ww4.sinaimg.cn/large/991557bagw1dpyu275vz4j.jpg – Ning

+0

@Ning: Il terzo componente 'w' si comporta come un parametro di ridimensionamento. Non ne hai bisogno. – datenwolf

12

OpenGL ES 1.xe 2.x non richiede il supporto per trame 3d - vedere ad es. la pagina man canonica per glBindTexture, che elenca solo GL_TEXTURE_2D e GL_TEXTURE_CUBE_MAP come target e l'hardware iOS non fornisce alcuna estensione adatta.

La soluzione migliore che sono riuscito a creare è una texture 3D come se fosse una texture 2d, quindi hai una texture 3d 128x128x128 e la disponi come 128 immagini 128x128 separate in una griglia 16x8 su una singola trama 2d. Quindi la trama 2d è 2048x1024 pixel, avvicinandosi al limite hardware per la generazione di dispositivi iPhone 4 e iPad 2 e dispositivi iOS compatibili con ES 2.0 che li hanno preceduti.

È quindi possibile alimentare una coordinata di texture 3D al proprio shader di frammenti esattamente come se esistesse un modo per indicizzare le trame 3D in modo nativo, ma eseguire un rapido calcolo matematico per collassarlo in 2D.

Così, nell'esempio 128x128x128, devi fare qualcosa di simile (codificato qui, mentre parlo, non testato,):

texPos.x = sourceVarying.x/16.0; // because we've packed 16 source images across, 
texPos.y = sourceVarying.y/8.0; // and 8 images down 

// we'll multiply z by 16 since then, logically, the integer part is 
// how many tiles across to index, and the decimal part is now many 
// tiles down to index 
texPos.z *= 16.0; 

// figure out how many tiles across to index, with each tile being 
// 1.0/16.0 in size 
texPos.x += floor(texPos.z)/16.0; 

// remove the integer part of z, then multiply by 8 to do much what 
// we just did to y 
texPos.z = fract(texPos.z) * 8.0; 
texPos.y += floor(texPos.z)/8.0; 

// now load the appropriate sample from texPos.xy 

che probabilmente non è il modo più efficace per raggiungere questo, è scritto per (relativa) chiarezza. Stai anche considerando lo svantaggio significativo delle prestazioni di ogni trama letto dipendente (cioè, la GPU non può predire gli accessi al di fuori dello shader del frammento, causando significative difficoltà nella pipeline). Ma questo è da soppesare rispetto ai costi che dovresti spendere per usare qualcosa di diverso dalle mappe tridimensionali.

Si noti inoltre che si sta eseguendo un accesso che è legato a una particolare sezione z. Quindi sei limitato al campionamento di tipo GL_NEAREST in almeno una dimensione, a meno che tu non voglia fare due campioni e mescolare il risultato tu stesso a un costo ancora maggiore. Inoltre, non ho fatto nulla sul serraggio, che probabilmente vorresti affrontare.

Datenwolf (+1, per inciso) è anche del tutto corretto sul fatto che mipmapping sia un problema; Ho finito per disattivarlo.


fine del 2013 addendum: al momento della scrittura, iOS 7, i 5s iPhone, la seconda generazione di iPad Mini e l'Air iPad supporta tutti ES 3.0. 3.0 introduce il target GL_TEXTURE_3D. Quindi puoi utilizzare 3d texturing direttamente su quei dispositivi e, probabilmente, su tutti i futuri dispositivi iOS. E, per la cronaca, sta riscontrando una disponibilità simile su Android, essendo stato supportato in tutti i recenti dispositivi Nexus, l'HTC One, alcuni recenti Samsung e altri.

+0

Grazie per la tua risposta! In effetti non sono sicuro di cosa ho bisogno è 3d texture. È il mio primo lavoro da fare con opengl es. Accetto un progetto e ho bisogno di rendere una casa sullo schermo. Quando apro il file .obj, ho trovato che ogni vt ha tre componenti, non solo vt. Se ignoro il terzo componente di vt, la trama è molto strana. Forse non dovrò usare la texture 3d? Ho seguito l'immagine della trama. Forse voi esperti sapete di cosa ho bisogno. ww2.sinaimg.cn/large/991557bagw1dpytx071d5j.jpg E l'effetto finale http://ww4.sinaimg.cn/large/991557bagw1dpyu275vz4j.jpg – Ning

+1

Sembra normale texturing 2d; hai ricordato che OBJ memorizza le coordinate della trama dall'altra parte da OpenGL, quindi devi fare un rapido 1-y da qualche parte nella tua pipeline? – Tommy

+0

ehm ... non l'ho fatto! Grazie! Ci proverò! – Ning

Problemi correlati