2011-01-21 12 views
12

È possibile eseguire il rendering su texture con OpenGL ES 1.1 su iPhone (2G e versioni precedenti)? Se lego una texture come buffer di rendering, deve essere la dimensione del buffer di rendering, che non è di dimensioni POT. Ma OpenGL ES 1.1 richiede che le trame siano POT.Rendering su texture non power-of-two su iPhone

Forse non può essere eseguito su ES 1.1?

risposta

2

Può essere fatto, tutto ciò che devi fare è ottenere la potenza successiva di 2 più grande del non-POT.

quindi generare un framebuffer:

GLuint aFramebuffer; 
glGenFramebuffersOES(1, &aFramebuffer); 

e una consistenza:

GLuint aTexturebuffer; 
glGenTextures(1, &aTexturebuffer); 

poi si fa la stessa texture come le cose:

glBindTexture(GL_TEXTURE_2D, aTexturebuffer); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 
glColor4ub(0, 0, 0, 255); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, textureWidth, textureHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); 

int area[] = {0.0, 0.0, renderWidth, renderHeight}; 

glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_CROP_RECT_OES, area); 

glBindFramebufferOES(GL_FRAMEBUFFER_OES, aFramebuffer); 
glFramebufferTexture2DOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_TEXTURE_2D, aTexturebuffer, 0); 

Qui ho usato l'estensione draw_texture. textureWidth e textureHeight sono la potenza di 2 più grandi, e renderWidth e renderHeight sono la larghezza e l'altezza del trucco. Quindi, quando si esegue il binding a aFramebuffer, verrà disegnato su texture.

+0

Sfortunatamente, non funziona. glCheckFramebufferStatusOES restituisce GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS. – GhassanPL

+0

@Kronikarz: hai creato anche un renderbuffer? Come in 'glRenderbufferStorageOES (GL_RENDERBUFFER_OES, GL_RGBA8_OES, width, height);' per connettersi al framebuffer? –

+0

@Kronikarz: Nella mia esperienza, dovresti anche essere in grado di eseguire il rendering su una trama non POT senza dover arrotondare le dimensioni, credo. –

26

Mentre OpenGL ES 1.1 non supporta non-potere-di-due texture, nuovi modelli di dispositivi iOS hanno l'estensione GL_APPLE_texture_2D_limited_npot, in cui si afferma:

convenzionale OpenGL ES 1.x texturing è limitato alle immagini con potenza di due dimensioni (POT). L'estensione APPLE_texture_2D_limited_npot rilassa queste dimensioni restrizioni per trame 2D. Le restrizioni rimangono attive per la mappa del cubo e trame 3D, se supportate.

Non v'è alcuna API procedurale o enumerant supplementare introdotto dal presente estensione tranne che un attuazione che esporta la stringa estensione consentirà un'applicazione passare in 2D trama dimensioni che possono o non possono essere una potenza di due.

In assenza di OES_texture_npot, che solleva queste restrizioni, né modalità mipmapping né avvolgere diversi CLAMP_TO_EDGE sono supportati in combinazione con le strutture NPOT 2D. Una trama NPOT 2D con una modalità di avvolgimento che non è CLAMP_TO_EDGE o un miniflettore non più NEAREST o LINEAR è considerato incompleto. Se tale texture è associata a una trama , è come se la texture mapping fosse disabilitata per quell'unità di texture.

è possibile utilizzare il seguente codice per determinare se questa estensione è supportata sul tuo dispositivo (tratto dal eccellente iPhone 3D Programming libro di Philip Rideout):

const char* extensions = (char*) glGetString(GL_EXTENSIONS); 
bool npot = strstr(extensions, "GL_APPLE_texture_2D_limited_npot") != 0; 

In questi dispositivi, si dovrebbe quindi essere in grado di utilizzare non-potere-di-due texture fino a quando si imposta il corretto spostamento struttura:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 

Purtroppo, this example application che ho che rende ad un non-potere-di-due tessitura utilizza OpenGL ES 2.0, quindi non sono sicuro che ti aiuterà in questo caso.

+9

È necessario * non * usare * strstr * per verificare il nome dell'estensione nella stringa di estensione. Ciò non garantisce che un'altra estensione che inizia con lo stesso prefisso non venga interpretata erroneamente. Supponiamo che il controllo di * GL_ARB_shadow * con strstr ti morderà se hai * GL_ARB_shadow_ambient *. Sono stato morso molto tempo fa quando un aggiornamento software ha portato una nuova estensione GL nel driver e ha rotto il mio codice mesi dopo il suo rilascio. – rotoglup

+0

@rotoglup - Questo è un grande punto. Come ho detto, questo era il codice tratto dal libro di Philip Rideout. Forse potresti scrivergli qualcosa per l'errata sul libro. –

+0

fatto, inviato a Filippo un'e-mail per dirlo;) – rotoglup