使用Quartz繪製的線條通常是反鋸齒的,但默認情況下,在OpenGL ES中不是這樣。從iOS 4.0開始,Apple爲他們的OpenGL ES實現添加了多重採樣抗鋸齒(MSAA),因此您應該能夠啓用此功能以平滑您的線條(以及場景中的其他邊緣)。
Apple介紹瞭如何在「Using Multisampling to Improve Image Quality」部分的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);
我創建了一個例子一類,顯示此MSAA在OpenGL ES 2.0應用程序here工作。查看ES2Renderer類,並啓用MSAA
定義,以查看實際情況。同樣,將它放在OpenGL ES 1.1應用程序中也很簡單,因爲您只需更改一些函數和常量後綴即可。
謝謝「與畫外的FBO抗鋸齒竅門」 - 我給一個去,看看我的身體情況如何。如果一切順利的話,稍後再回來查看! :) – Simon
多重取樣抗鋸齒確實使它看起來更好一點,當然,如果你畫粗線。感謝你讓我跟蹤Brad。 – Simon