Domanda

Normalmente, useresti qualcosa del tipo:

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_BLEND);
glEnable(GL_LINE_SMOOTH);

glLineWidth(2.0f);

glVertexPointer(2, GL_FLOAT, 0, points);
glEnableClientState(GL_VERTEX_ARRAY);

glDrawArrays(GL_LINE_STRIP, 0, num_points);

glDisableClientState(GL_VERTEX_ARRAY);

Sembra buono nel simulatore di iPhone, ma su iPhone le linee diventano estremamente sottili e senza alcun aliasing.

Come si ottiene AA su iPhone?

È stato utile?

Soluzione

Si può ottenere l'effetto dell'antialiasing in modo molto economico usando vertici con opacità 0. Ecco un esempio di immagine per spiegare:

alt text

Confronto con AA:

alt text

Puoi leggere un articolo su questo qui:

http://research.microsoft.com/en- noi / um / persone / Hoppe / overdraw.pdf

Puoi fare qualcosa in questo modo:

// Colors is a pointer to unsigned bytes (4 per color).
// Should alternate in opacity.
glColorPointer(4, GL_UNSIGNED_BYTE, 0, colors);
glEnableClientState(GL_COLOR_ARRAY);

// points is a pointer to floats (2 per vertex)
glVertexPointer(2, GL_FLOAT, 0, points);
glEnableClientState(GL_VERTEX_ARRAY);

glDrawArrays(GL_TRIANGLE_STRIP, 0, points_count);

glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_COLOR_ARRAY);

Altri suggerimenti

A partire da iOS Versione 4.0 hai una soluzione semplice, ora è possibile utilizzare l'antialiasing per l'intera scena OpenGL ES con solo poche righe di codice aggiunto. (E quasi nessuna perdita di prestazioni, almeno sulla GPU SGX).

Per il codice, leggi la seguente Dev-Forum Thread di Apple . Ci sono anche alcune immagini di esempio su come mi appare sul mio blog.

Utilizzo di http://answers.oreilly.com/topic/1669-how-to-render-anti-aliased-lines-with-textures-in-ios-4/ come punto di partenza, sono stato in grado per ottenere linee anti-alias come queste: alt text

Non sono perfetti né belli come quelli che avevo disegnato con Core Graphics, ma sono abbastanza buoni. In realtà sto disegnando due volte le stesse linee (vertici), una volta con trama e colore più grandi, quindi con trama più piccola e bianco traslucido.

Ci sono artefatti quando le linee si sovrappongono troppo strettamente e gli alfa iniziano ad accumularsi.

Un approccio intorno a questa limitazione è tassellare le tue linee in strisce triangolari strutturate (come visto qui ).

Il problema è che su iPhone OpenGl esegue il rendering su un oggetto frame buffer anziché sul frame buffer principale e, a quanto ho capito, gli FBO non supportano il multicampionamento.

Ci sono vari trucchi che possono essere fatti, come il rendering su un altro FBO con dimensioni doppie del display e quindi fare affidamento sul filtro delle trame per appianare le cose, non qualcosa che ho provato, quindi non posso commentare quanto bene funziona.

Ricordo molto specificamente che ho provato questo e non esiste un modo semplice per farlo usando OpenGL su iPhone. Puoi disegnare usando CGPaths e un CGContextRef, ma sarà significativamente più lento.

Inseriscilo nel tuo metodo di rendering e setUpFrame buffer ... Otterrai un aspetto anti-alias.

/*added*/
//[_context presentRenderbuffer:GL_RENDERBUFFER];

//Bind both MSAA and View FrameBuffers.
glBindFramebuffer(GL_READ_FRAMEBUFFER_APPLE, msaaFramebuffer); 
glBindFramebuffer(GL_DRAW_FRAMEBUFFER_APPLE, framebuffer );  
// Call a resolve to combine both buffers 
glResolveMultisampleFramebufferAPPLE();   
// Present final image to screen 
glBindRenderbuffer(GL_RENDERBUFFER, _colorRenderBuffer);
[_context presentRenderbuffer:GL_RENDERBUFFER];
/*added*/
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top