3

是否有一种相对简单的方法可以使用OpenGL ES 2.0在iOS 4上实现抗锯齿?

有一种情况,我需要放弃Core Animation转而使用OpenGL ES 2.0来获得真正的3d图形。

一切正常,但我注意到使用Core Animation渲染的简单3d立方体比使用OpenGL生成的具有更多锯齿线的立方体要清晰得多。

我读到iOS 4.0支持GL_TRIANGLE_STRIP的抗锯齿,并且我发现了一个看起来很有希望的在线教程(请参阅下面的链接代码),但我无法让它工作。

我注意到的第一件事是所有OES后缀,它们似乎是Open GL ES 1.0的残余。

由于我所做的一切都是针对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];
}
4

1 回答 1

4

https://developer.apple.com/library/ios/documentation/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/WorkingwithEAGLContexts/WorkingwithEAGLContexts.html#//apple_ref/doc/uid/TP40008793-CH103-SW12可能是现代版本教程正在描述。建议的技术是多重采样,其中您绘制 4 个像素,然后在屏幕上采样到 1 个像素。

于 2012-09-14T17:15:33.273 回答