2012-09-13 82 views
3

有沒有落實使用OpenGL ES 2.0的的iOS 4抗鋸齒一個比較簡單的方法是什麼?OpenGL ES 2.0線比核心動畫顯得更加鋸齒。 iOS 4中可以使用抗鋸齒功能嗎?

要是地方,我需要放棄贊成的OpenGL ES的核心動畫 2.0得到真正3D圖形的情況。

東西的工作,但我注意到,簡單3D立方體使用核心動畫渲染比那些的OpenGL其中有更多的鋸齒線生產多保鮮盒。

,我讀了的iOS 4.0支持反鋸齒GL_TRIANGLE_STRIP,我發現了一個online tutorial(見下文從鏈接的代碼),看起來很有希望,但我一直沒能得到它加工。

我注意到的第一件事是所有這一切似乎是的Open GL ES 1.0殘餘的OES後綴。

因爲我所做的一切是的OpenGL ES 2.0,我試着刪除每個OES只是爲了看看發生了什麼。沒有錯誤或警告編譯和構建的東西,但我的圖形不再渲染。

如果我把OES後綴我得到以下類型的多個錯誤和警告:

Error - Use of undeclared identifier '' 
Warning - Implicit declaration of function '' is invalid in C99 

包括ES1頭文件產生了一個乾淨的構建,但仍然沒有得到呈現。似乎並不喜歡我需要包括ES 1.0頭文件反正實現此功能。

所以我的問題是我怎麼得到這個工作,它實際上解決我的問題?

是否在網上教程中,我鏈接的方法有正確的想法,我只是搞砸的實施,或是否有更好的方法?

任何指導或細節將不勝感激。


從鏈接以上代碼:

GLint backingWidth, backingHeight; 

//Buffer definitions for the view. 
GLuint viewRenderbuffer, viewFramebuffer; 

//Buffer definitions for the MSAA 
GLuint msaaFramebuffer, msaaRenderBuffer, msaaDepthBuffer; 



//Create our viewFrame and render Buffers. 
glGenFramebuffersOES(1, &viewFramebuffer); 
glGenRenderbuffersOES(1, &viewRenderbuffer); 

//Bind the buffers. 
glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer); 
glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer); 
[context renderbufferStorage:GL_RENDERBUFFER_OES fromDrawable:(CAEAGLLayer*)self.layer]; 
glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, viewRenderbuffer); 
glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_WIDTH_OES, &backingWidth); 
glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_HEIGHT_OES, &backingHeight); 



//Generate our MSAA Frame and Render buffers 
glGenFramebuffersOES(1, &msaaFramebuffer); 
glGenRenderbuffersOES(1, &msaaRenderBuffer); 

//Bind our MSAA buffers 
glBindFramebufferOES(GL_FRAMEBUFFER_OES, msaaFramebuffer); 
glBindRenderbufferOES(GL_RENDERBUFFER_OES, msaaRenderBuffer); 

// Generate the msaaDepthBuffer. 
// 4 will be the number of pixels that the MSAA buffer will use in order to make one pixel on the render buffer. 
glRenderbufferStorageMultisampleAPPLE(GL_RENDERBUFFER_OES, 4, GL_RGB5_A1_OES, backingWidth, backingHeight); 
glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, msaaRenderBuffer); 
glGenRenderbuffersOES(1, &msaaDepthBuffer); 

//Bind the msaa depth buffer. 
glBindRenderbufferOES(GL_RENDERBUFFER_OES, msaaDepthBuffer); 
glRenderbufferStorageMultisampleAPPLE(GL_RENDERBUFFER_OES, 4, GL_DEPTH_COMPONENT16_OES, backingWidth , backingHeight); 
glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_RENDERBUFFER_OES, msaaDepthBuffer); 



- (void) draw 
{ 
    [EAGLContext setCurrentContext:context]; 
    // 
    // Do your drawing here 
    // 
    // Apple (and the khronos group) encourages you to discard depth 
    // render buffer contents whenever is possible 
    GLenum attachments[] = {GL_DEPTH_ATTACHMENT_OES}; 
    glDiscardFramebufferEXT(GL_READ_FRAMEBUFFER_APPLE, 1, attachments); 

    //Bind both MSAA and View FrameBuffers. 
    glBindFramebufferOES(GL_READ_FRAMEBUFFER_APPLE, msaaFramebuffer); 
    glBindFramebufferOES(GL_DRAW_FRAMEBUFFER_APPLE, viewFramebuffer); 

    // Call a resolve to combine both buffers 
    glResolveMultisampleFramebufferAPPLE(); 

    // Present final image to screen 
    glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer); 
    [context presentRenderbuffer:GL_RENDERBUFFER_OES]; 
} 
+0

如果您正在使用的OpenGL ES 2。0和GLKViewController這是'GLKView * view =(GLKView *)self.view; view.drawableMultisample = GLKViewDrawableMultisample4X; ' –

回答

4

https://developer.apple.com/library/ios/documentation/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/WorkingwithEAGLContexts/WorkingwithEAGLContexts.html#//apple_ref/doc/uid/TP40008793-CH103-SW12可能是什麼教程描述的現代版。建議您使用多次採樣,其中畫4個像素,然後在屏幕上採樣到1個像素。

+0

優秀的建議!該鏈接完全爲我提供了我所需要的。花了一些努力學習足夠的知道發生了什麼,但該網站給瞭解決方案的直接路徑。幾乎完全按照他們的步驟,只需要一些知識來克服幾個不足之處。非常感謝。 – GRW

+0

當然。 NP。真高興你做到了。 :) – Dad