OpenGL ES iPhone - 绘制抗锯齿线

时间:2009-11-28 16:57:16

标签: iphone opengl-es line antialiasing

通常情况下,您会使用以下内容:

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?

7 个答案:

答案 0 :(得分:59)

使用不透明度为0的顶点可以非常便宜地实现抗锯齿效果。 这是一个图片示例来解释:

alt text

与AA的比较:

alt text

你可以在这里阅读一篇论文:

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

答案 1 :(得分:25)

iOS版本4.0 开始,你有一个简单的解决方案,现在可以使用Antialiasing为整个OpenGL ES场景添加几行代码。 (而且几乎没有性能损失,至少在SGX GPU上)。

有关代码,请阅读以下Apple Dev-Forum Thread。 还有一些示例图片在我的博客上找我。

答案 2 :(得分:6)

使用http://answers.oreilly.com/topic/1669-how-to-render-anti-aliased-lines-with-textures-in-ios-4/作为起点,我能够得到像这样的抗锯齿线: alt text

它们并不完美,也不像我用Core Graphics绘制的那样漂亮,但它们非常好。我实际上绘制了两次相同的线条(顶点) - 一次是纹理和颜色较大,然后是较小的纹理和半透明的白色。

当线条重叠得过紧而且alphas开始累积时会出现伪影。

答案 3 :(得分:4)

围绕此限制的一种方法是将您的线条细分为纹理三角形条带(如here所示)。

答案 4 :(得分:3)

问题是在iPhone上OpenGl渲染到帧缓冲对象而不是主帧缓冲区,据我所知,FBO不支持多重采样。

可以做各种各样的技巧,例如以两倍的显示尺寸呈现给另一个FBO,然后依靠纹理过滤来平滑事物,不是我尝试过的东西,所以不能评论它有多好这很有效。

答案 5 :(得分:2)

我非常清楚地记得我试过这个并且在iPhone上使用OpenGL没有简单的方法可以做到这一点。你可以使用CGPaths和CGContextRef进行绘制,但这会慢得多。

答案 6 :(得分:0)

将它放在你的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*/