在iPhone上使用OpenGL ES平滑线条

3
我正在iPhone 4上尝试使用OpenGL ES进行简单的线条绘制。我用GLfloat数组创建了一个小人,并首先在普通UIView中(覆盖draw方法)测试了绘制小人。如下图所示,输出结果相当好...

Example of drawing into UIView

问题是,出于速度和其他原因,我需要在OpenGL下进行绘制,以便在有数百个对象时,绘制仍然很快。当我在OpenGL ES 1.1下测试了一个简单的线条绘制版本时,我得到了以下结果(忽略缺失的头部!)...

enter image description here

我正在使用GL_LINES和一个数组来绘制这个小人,启用了GL_LINE_SMOOTH(以及GL_NICEST),但图形看起来并不太平滑。是否有一种方法可以在OpenGL下使用基本线实现更平滑的抗锯齿线条?
2个回答

4
使用Quartz绘制的线条通常是抗锯齿的,但在OpenGL ES中默认情况下不是这样。从iOS 4.0开始,苹果在其OpenGL ES实现中添加了多采样抗锯齿(MSAA),因此您应该能够启用此功能以平滑您的线条(以及场景中的其他边缘)。
苹果在iOS的OpenGL ES编程指南中描述了如何设置多采样以改善图像质量的部分"使用多采样来提高图像质量"。您可以使用以下代码设置多采样帧缓冲区、渲染缓冲区和深度缓冲区(如果需要):
glGenFramebuffers(1, &msaaFramebuffer); 
glGenRenderbuffers(1, &msaaRenderbuffer);

glBindFramebuffer(GL_FRAMEBUFFER, msaaFramebuffer); 
glBindRenderbuffer(GL_RENDERBUFFER, msaaRenderbuffer);   

glRenderbufferStorageMultisampleAPPLE(GL_RENDERBUFFER, 4, GL_RGBA8_OES, backingWidth, backingHeight); 
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, msaaRenderbuffer); 

glGenRenderbuffers(1, &msaaDepthbuffer);   
glBindRenderbuffer(GL_RENDERBUFFER, msaaDepthbuffer); 
glRenderbufferStorageMultisampleAPPLE(GL_RENDERBUFFER, 4, GL_DEPTH_COMPONENT16, backingWidth, backingHeight); 
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, msaaDepthbuffer);

请注意,此代码来自OpenGL ES 2.0应用程序,因此您可能需要更改上述内容以添加适用于1.1的适当的OES后缀。
一旦您要呈现帧,您将执行以下操作:
glBindFramebuffer(GL_READ_FRAMEBUFFER_APPLE, msaaFramebuffer); 
glBindFramebuffer(GL_DRAW_FRAMEBUFFER_APPLE, viewFramebuffer);

glResolveMultisampleFramebufferAPPLE();

glBindRenderbuffer(GL_RENDERBUFFER, viewRenderbuffer);

success = [context presentRenderbuffer:GL_RENDERBUFFER];

glBindFramebuffer(GL_FRAMEBUFFER, msaaFramebuffer); 

为了优化,您可能需要在将内容呈现到屏幕之前或之后立即丢弃颜色和深度缓冲区,您可以使用以下代码:

const GLenum discards[]  = {GL_COLOR_ATTACHMENT0,GL_DEPTH_ATTACHMENT};
glDiscardFramebufferEXT(GL_READ_FRAMEBUFFER_APPLE,2,discards);

我为一个类创建了一个示例,展示了在OpenGL ES 2.0应用程序中使用MSAA 这里的工作原理。请查看ES2Renderer类,并启用MSAA定义以查看其运行情况。再次强调,在OpenGL ES 1.1应用程序中放置它相当简单,因为您只需要更改一些函数和常量后缀即可。

谢谢 - 我会尝试一下,看看进展如何。如果一切顺利,稍后会回来检查! :) - Simon
多重采样抗锯齿确实让它看起来更好一些,特别是当你画较粗的线条时。感谢Brad让我找到正确的方向。 - Simon

1

链接现已过时。 - digitalHound

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接