【问题标题】:OpenGL ES 2.0 lines appear more jagged than Core Animation. Is anti-aliasing possible in iOS 4?OpenGL ES 2.0 的线条看起来比 Core Animation 更加锯齿。 iOS 4 中可以抗锯齿吗?
【发布时间】:2012-09-15 01:15:33
【问题描述】:

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

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

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

我读到 iOS 4.0 支持 GL_TRIANGLE_STRIP抗锯齿,我找到了一个 online tutorial (请参阅下面的链接中的代码)看起来很有希望,但我无法让它工作。

我首先注意到的是所有 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];
}

【问题讨论】:

  • 如果你使用的是 OpenGL ES 2.0 和 GLKViewController 这就是GLKView *view = (GLKView *)self.view; view.drawableMultisample = GLKViewDrawableMultisample4X;

标签: ios opengl-es ios4 opengl-es-2.0


【解决方案1】:

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

【讨论】:

  • 很好的建议!该链接为我提供了我所需要的。花了一些精力来学习足以真正理解正在发生的事情,但该站点提供了一个非常直接的解决方案路径。几乎完全按照他们的步骤进行,只是需要一些知识来克服一些粗糙的地方。非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多