OpenGL ES3使用MSAA(多重采样抗锯齿)的方法

文章介绍了如何在OpenGLES3.0中实现MSAA全屏抗锯齿,由于GL_APPLE_framebuffer_multisample扩展不再有效,作者参考OpenGL官方wiki和Apple文档,调整了相关函数和常量,如使用glRenderbufferStorageMultisample、glBlitFramebuffer和glInvalidateFramebuffer等,提供了Objective-C代码示例来说明实现过程。

昨晚花费了我2个多小时的时间终于把OpenGL ES3.0中的MSAA给搞定了。在OpenGL ES2.0中,Khronos官方没有引入标准的MSAA全屏抗锯齿的方法,而Apple则采用了自己的 GL_APPLE_framebuffer_multisample 的扩展来实现MSAA。在iOS中,OpenGL ES3.0之前使用MSAA的方法可以参见Apple的官方OpenGL ES开发者指南,写得非常详细:Using Multisampling to Improve Image Quality

而对于OpenGL ES3.0,GL_APPLE_framebuffer_multisample 扩展已经失效,不能再使用了。于是我在网上搜了许多资料,不过有帮助的不多,比较有方向性的文章是OpenGL官方wiki上关于多重采样的介绍:Multisampling

不过这篇文章针对的是OpenGL,与OpenGL ES稍微有些差异。于是本人借助Apple的文档结合这篇官维,终于把它捣鼓出来了。

其实,大部分代码与Apple官方所描述的差不多,有几个需要改动的地方:

  1. 要包含头文件 <OpenGLES/ES3/gl.h>。如果是之前的OpenGL ES2.0,那么所包含的是 <OpenGLES/ES2/gl.h><OpenGLES/ES2/glext.h>

  2. ‘APPLE’‘EXT’ 以及 ‘OES’ 后缀的函数以及常量都没有了。改起来非常简单,直接把后缀给删了即可,比如原来的 glRenderbufferStorageMultisampleAPPLE 改为 glRenderbufferStorageMultisample;原来的 GL_RGBA8_OES 改为 GL_RGBA8

  3. 在绘制时,用 glBlitFramebuffer 来取代 glResolveMultisampleFramebufferAPPLE

  4. glInvalidateFramebuffer 来取代 glDiscardFramebufferEXT。这个接口非常有用!使用和没使用速度能相差1倍之多!这里得感谢Apple的Xcode以及OpenGL ES Analysis的profile工具,使得我能查到之前的glDiscardFramebufferEXT被啥取代了……否则,如果包含 <OpenGLES/ES2/glext.h> 然后调用 glDiscardFramebufferEXT 也没啥问题。不过直接用官方标准的接口会更可靠些,至少更有可移植性。

下面我提供比较完整的使用范例(带有部分的Objective-C代码):

先是头文件:

//  MyGLLayer.h
//  CADemo
//
//  Created by Zenny Chen on 14-8-19.
//  Copyright (c) 2014年 Adwo. All rights reserved.
//

@import QuartzCore;

#import <OpenGLES/ES3/gl.h>

@interface MyGLLayer : CAEAGLLayer
{
   
   
@private
    
    /* The pixel dimensions of the backbuffer */
    GLint mBackingWidth;
    GLint mBackingHeight;
    
    EAGLContext *mContext;
    
    /* OpenGL names for the renderbuffer and framebuffers used to render to this view */
    GLuint mFramebuffer, mRenderbuffer, mDepthRenderbuffer;
    
    GLuint mMSAAFramebuffer, mMSAARenderbuffer, mMSAADepthRenderbuffer;
    
    CADisplayLink *mDisplayLink;
}

我们看到以上代码定义了两组 FBORBO,一组是用于绘制到目标窗口的(不带MSAA的),另一组是用于图形渲染的,采用MSAA。在最后绘制时会把MSAA的FBO像素拷贝到单样本的FBO,用于显示。

以下是源文件的主要代码片段:

- (instancetype)init
{
   
   
    self = [super init];
    
    self.opaque =</
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值