【发布时间】: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