2009-11-28 7 views
37

Normalmente, tendrá que utilizar algo como:OpenGL ES iPhone - el trazado de líneas anti-aliasing

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); 

Se ve bien en el simulador de iPhone, pero en el iPhone las líneas de conseguir extremadamente delgada y w/o cualquier fármaco anti aliasing.

¿Cómo se obtiene AA en el iPhone?

+0

Se podría hacerlos como líneas alias luego aplicar una [filtro Bloom] (http://ofps.oreilly.com/titles/9780596804824/chadvanced.html#fig-BloomTriptych) – bobobobo

+0

@bobobobo el enlace está muerto . – TomSawyer

Respuesta

59

Uno puede lograr el efecto de anticuerpos anti aliasing muy barata usando vértices con la opacidad 0. He aquí un ejemplo de una imagen de explicar:

alt text

Comparación con AA:

alt text

usted puede leer un artículo sobre esto aquí:

http://research.microsoft.com/en-us/um/people/hoppe/overdraw.pdf

Usted podría hacer algo a lo largo de esta manera:

// 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); 
+2

¡Guau! método y descripción simple, clara y perfecta. ¡Bonito! – Eonil

+5

¿Hay algo comparable (pero más simple) para dibujar líneas antialias, del tipo que se podría usar para graficar ecuaciones, etc.? En otras palabras, para dibujar que use GL_LINE_STRIP en lugar de GL_TRIANGLE_STRIP. Todo lo que estoy dibujando parece estar tan pixelado. Estoy explorando el uso de GL_POINT_SPRITE_OES (según el código de muestra GLPaint de Apple) pero significa crear puntos para cada ubicación de píxel ... o eso parece. Y me gustaría que OpenGL-ES haga la interpolación por mí. – westsider

+0

Muchas gracias :) –

2

Recuerdo muy específicamente que he intentado esto y no hay forma sencilla de hacer esto usando OpenGL en el iPhone. Puede dibujar usando CGPaths y un CGContextRef, pero eso será significativamente más lento.

+0

Escuché que Quartz es una especie de envoltorio para OpenGL. Si Quartz puede hacerlo, también debería poder hacerlo en OpenGL. ¿Cómo logra CGPaths AA? Estoy usando un motor de juego basado en OpenGL llamado Cocos2D. Afaik, no puedes dibujar usando Quartz en una capa de Cocos2d. – quano

+0

Estoy familiarizado con Cocos2D. Siempre puede dibujar en una CGImage y crear una textura a partir de esa imagen para dibujar en un TextureNode. No estoy seguro, pero no creo que los métodos de CGContext estén confiando en OpenGL al dibujar. Después de dibujar algo, esa imagen bien puede ser manejada por Quartz y mostrada usando OpenGL. –

+0

Gracias Ed, probé este método. Es realmente lento en comparación con OpenGL. Podría funcionar si solo dibujas una vez por segundo, pero si necesitas dibujar con más frecuencia, estás jodido. Tenemos un hilo en el foro de cocos2d sobre esto aquí: http://www.cocos2d-iphone.org/forum/topic/2241 – quano

3

El problema es que en el iPhone OpenGL funciona a un objeto frame buffer en lugar de la memoria intermedia de trama principal y como yo lo entiendo oCs no son compatibles con muestreo múltiple.

Hay varios trucos que se pueden hacer, como renderizar en otro FBO al doble del tamaño de visualización y luego confiar en el filtrado de texturas para suavizar las cosas, algo que no he probado, así que no puedo comentar cómo bueno esto funciona

+0

Soy realmente novato en OpenGL. ¿Sabes dónde puedo encontrar más información sobre este método? – quano

4

Un enfoque esta limitación se tessellating sus líneas en tiras triángulo de textura (como se ve here).

+0

el enlace está ahora muerto – paulm

+0

ha arreglado el enlace, gracias. – prideout

6

Usando http://answers.oreilly.com/topic/1669-how-to-render-anti-aliased-lines-with-textures-in-ios-4/ como punto de partida, yo era capaz de obtener líneas suavizadas como éstas: alt text

Ellos no son perfectos ni son tan bonitos como los que había estado dibujando con Core Graphics, pero son bastante buenos. De hecho, estoy dibujando las mismas líneas (vértices) dos veces, una con mayor textura y color, luego con textura más pequeña y blanco translúcido.

hay artefactos cuando las líneas se superponen con demasiada fuerza y ​​alfas comienzan a acumularse.

+0

¿Quizás el alfa podría ser arreglado estableciendo una función de fusión personalizada? – jv42

25

A partir de iOS versión 4.0 tiene una solución fácil, ahora es posible usar Antialiasing para toda la escena de OpenGL ES con solo unas líneas de código agregado. (Y casi ninguna pérdida de rendimiento, al menos en la GPU SGX).

Para el código por favor lea la siguiente manzana Dev-Forum Thread. También hay algunas imágenes de muestra de cómo me parece en mi blog.

+2

Gracias por publicar esto: casi empiezo a escribir un código en serio arcaico basado en las respuestas anteriores a esta pregunta en SO. – benzado

+2

El enlace a la publicación del foro de desarrolladores de Apple ya no funciona: aparece una página de error. –

+0

Funciona para mí, recuerde que debe iniciar sesión en su cuenta de desarrollador para ver los foros. – Bersaelor

0

Pon esto en tu método de renderizado y setUpFrame buffer ... Obtendrás una apariencia anti-aliased.

/*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*/ 
+3

... y has declarado el msaaFramebuffer ¿exactamente? – BlueVoodoo

Cuestiones relacionadas