40

通常,你会使用类似的东西:

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?

4

7 回答 7

61

使用不透明度为 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);
于 2009-12-31T03:01:04.480 回答
26

iOS 4.0开始,您有了一个简单的解决方案,现在只需添加几行代码,就可以对整个 OpenGL ES 场景使用抗锯齿。(而且几乎没有性能损失,至少在 SGX GPU 上是这样)。

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

于 2010-09-27T16:58:32.817 回答
6

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

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

当线条重叠得太紧并且 alpha 开始累积时会出现伪影。

于 2010-09-26T15:34:28.767 回答
4

解决此限制的一种方法是将您的线条镶嵌成带纹理的三角形条带(如此处所示

于 2009-11-28T20:33:03.307 回答
3

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

可以使用各种技巧,例如以两倍的显示尺寸渲染到另一个 FBO,然后依靠纹理过滤来平滑处理,虽然我没有尝试过,但无法评论它的效果如何。

于 2009-11-28T20:10:01.557 回答
2

我特别记得我试过这个并且没有简单的方法可以在 iPhone 上使用 OpenGL 来做到这一点。您可以使用 CGPaths 和 CGContextRef 进行绘制,但这会慢很多。

于 2009-11-28T19:52:07.070 回答
0

将其放入您的渲染方法和 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*/
于 2011-08-24T05:32:25.670 回答