OpenGL ES iPhone – 绘制反锯齿线

通常情况下,你会使用像这样的东西:

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?

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

替代文字

与AA比较:

替代文字

你可以在这里阅读关于这个的文章:

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

iOS版本4.0开始,您有一个简单的解决scheme,现在只需添加几行代码,就可以在整个OpenGL ES场景中使用抗锯齿function。 (几乎没有性能损失,至less在SGX GPU上)。

有关代码,请阅读以下Apple Dev-Forum主题 。 还有一些样本图片是如何在我的博客上find我的。

使用http://answers.oreilly.com/topic/1669-how-to-render-anti-aliased-lines-with-textures-in-ios-4/作为起点,我能够得到反锯齿这样的线条:; 替代文字

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

当线条重叠得太紧时,会出现文物,alpha会开始积累。

围绕此限制的一种方法是将线条镶嵌成纹理三angular形条(如此处所示)。

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

有各种各样的技巧可以完成,比如以两倍的显示大小呈现给另一个FBO,然后依靠纹理过滤来平滑事情,而不是我已经尝试过的东西,所以不能评论它的工作效果。

我记得非常具体,我尝试了这一点,没有简单的方法来使用iPhone上的OpenGL。 你可以使用CGPaths和CGContextRef进行绘制,但是速度会明显变慢。

把它放在你的渲染方法和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*/