iphone - OpenGL ES iPhone - 繪製抗鋸齒線條




4 Answers

使用不透明度為0的頂點可以非常便宜地實現抗鋸齒效果。這是一個圖像示例來解釋:

與AA比較:

你可以在這裡閱讀一篇關於此的論文:

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

你可以這樣做:

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

通常情況下,您會使用以下內容:

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

它在iPhone模擬器中看起來不錯,但在iPhone上,線條變得非常薄,沒有任何抗鋸齒。

你如何在iPhone上獲得AA?




使用http://answers.oreilly.com/topic/1669-how-to-render-anti-aliased-lines-with-textures-in-ios-4/作為起點,我得到了抗鋸齒像這樣的行:

它們並不完美,也不像我用Core Graphics繪製的那樣漂亮,但它們非常好。 我實際上繪製了兩次相同的線(頂點) - 一次具有更大的紋理和顏色,然後具有更小的紋理和半透明的白色。

當線條重疊太緊並且alphas開始累積時會有偽影。




問題是在iPhone上OpenGl渲染到幀緩衝對象而不是主幀緩衝區,據我所知,FBO不支持多重採樣。

有各種各樣的技巧可以做,比如以兩倍的顯示尺寸呈現給另一個FBO,然後依靠紋理過濾來平滑事物,而不是我嘗試過的東西,所以不能評論它的工作原理。




把它放在你的render方法和setUpFrame緩衝區......你會得到消除鋸齒的外觀。

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



Related