使用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应用程序中放置它相当简单,因为您只需要更改一些函数和常量后缀即可。