2011-08-24 40 views
3

我正在iPhone 4上的OpenGL ES中嘗試簡單的線條繪製。我創建了一個GLfloats的數組中的一個棍子,並且首先測試了在正常的UIView中繪製棍子的人(覆蓋繪製方法)。這裏顯示的輸出是相當不錯的...在iPhone上的OpenGL ES中的平滑線

Example of drawing into UIView

的問題是,我需要做的這張圖紙的OpenGL下的最高速度(除其他原因),所以,如果我有上百個對象中,中繪畫仍然很快。當我測試一個簡單的線下的OpenGL ES 1.1繪圖版本,我得到了以下(忽略丟失的頭!)...

enter image description here

我使用GL_LINES一個數組來繪製人物和有GL_LINE_SMOOTH已啓用(與GL_NICEST一起),但該圖看起來不太平滑。有沒有一種方法可以在OpenGL中使用初級線獲得更平滑的抗鋸齒線?

回答

4

使用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應用程序中也很簡單,因爲您只需更改一些函數和常量後綴即可。

+0

謝謝「與畫外的FBO抗鋸齒竅門」 - 我給一個去,看看我的身體情況如何。如果一切順利的話,稍後再回來查看! :) – Simon

+0

多重取樣抗鋸齒確實使它看起來更好一點,當然,如果你畫粗線。感謝你讓我跟蹤Brad。 – Simon