Pergunta

Normalmente, você usaria algo como:

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

Parece bom no simulador iPhone, mas no iPhone as linhas ficar extremamente fina e w / o qualquer anti aliasing.

Como você recebe AA no iPhone?

Foi útil?

Solução

Pode-se obter o efeito de anti aliasing muito barata usando vértices com opacidade 0. Aqui está um exemplo para explicar:

text alt

A comparação com AA:

text alt

Você pode ler um artigo sobre isso aqui:

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

Você poderia fazer algo por este caminho:

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

Outras dicas

A partir de iOS versão 4.0 você tem uma solução fácil, é agora possível usar Suavização de toda a cena OpenGL ES com apenas algumas linhas de código adicionado. (E quase nenhuma perda de desempenho, pelo menos na SGX GPU).

Para o código leia o seguinte a Apple Dev-Forum Tópico . Há também algumas imagens de exemplo como ele olha para mim no meu blog.

Usando http://answers.oreilly.com/topic/1669-how-to-render-anti-aliased-lines-with-textures-in-ios-4/ como ponto de partida, eu era capaz para obter linhas de anti-aliasing como estes: text alt

Eles não são perfeitos nem são tão agradável como os que eu tinha sido desenho com Core Graphics, mas eles são muito bons. Estou realmente desenho mesmas linhas (vértices) duas vezes -. Uma vez com maior textura e cor, em seguida, com menor textura e branco translúcido

Existem artefactos quando as linhas se sobrepõem com muita força e alfas começar a acumular-se.

Uma abordagem em torno desta limitação é tessellating suas linhas em tiras triângulo texturizados (como visto aqui ).

O problema é que no iPhone OpenGL processa a um objeto frame buffer ao invés do frame buffer principal e como eu o entendo do FBO não suportam multisampling.

Existem vários truques que podem ser feitas, como a renderização para outro FBO em duas vezes o tamanho da tela e, em seguida, contando com textura filtragem para suavizar as coisas, não é algo que eu tentei embora assim não pode comentar sobre o quão bem isso funciona.

Lembro-me muito especificamente que eu tentei isso e não há nenhuma maneira simples de fazer isso usando OpenGL no iPhone. Você pode desenhar usando CGPaths e uma CGContextRef, mas que será significativamente mais lento.

Coloque isso no seu método e setUpFrame tampão tornar ... Você vai ter a aparência anti-aliasing.

/*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*/
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top