OpenGLES入门笔记二

#import <UIKit/UIKit.h>
#import <QuartzCore/QuartzCore.h>
#import <OpenGLES/ES2/gl.h>
#import <OpenGLES/ES2/glext.h>

@interface OpenGLView : UIView
{
    CAEAGLLayer * _eaglLayer;
    EAGLContext * _context;
    GLuint _colorRenderBuffer;
    GLuint _frameBuffer;
}

@end
// https://developer.apple.com/library/ios/documentation/OpenGLES/Reference/EAGLContext_ClassRef/index.html
#import "OpenGLView.h"

@implementation OpenGLView

//!> 1.设置layer class 为 CAEAGLayer
+ (Class)layerClass
{
    return [CAEAGLLayer class];
}

//!> 2.设置layer为Opaque
- (void)setupLayer
{
    _eaglLayer = (CAEAGLLayer *)self.layer;
    _eaglLayer.opaque = YES;
}

//!> 3.创建OpenGL context
- (void)setupContext
{
    //!> 渲染上下文提供的 OpenGL ES 的版本
    EAGLRenderingAPI api = kEAGLRenderingAPIOpenGLES2;
    _context = [[EAGLContext alloc] initWithAPI:api];
    if (!_context)
    {
        NSLog(@"Failed to initialize OpenGLES 2.0 context");
        exit(1);
    }
    if (![EAGLContext setCurrentContext:_context])
    {
        NSLog(@"Failed to set current OpenGL context");
        exit(1);
    }
}

//!> 4.创建render buffer(渲染缓冲区)
- (void)setupRenderBuffer
{
    // generate renderbuffer object names
    glGenRenderbuffers(1, &_colorRenderBuffer);
    // bind a renderbuffer to a renderbuffer target
    glBindRenderbuffer(GL_RENDERBUFFER, _colorRenderBuffer);
    [_context renderbufferStorage:GL_RENDERBUFFER fromDrawable:_eaglLayer];
}

//!> 5.创建一个frame buffer(帧缓冲区)
- (void)setupFrameBuffer
{
    glGenFramebuffers(1, &_frameBuffer);
    glBindFramebuffer(GL_FRAMEBUFFER, _frameBuffer);
    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, _colorRenderBuffer);
}

//!> 6.清理屏幕
- (void)render
{
    glClearColor(0, 104.0/255.0, 55.0/255.0, 1.0);
    glClear(GL_COLOR_BUFFER_BIT);//ClearBufferMask
    [_context presentRenderbuffer:GL_RENDERBUFFER];
}

//!> 实际操作
- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self)
    {
        [self setupLayer];
        [self setupContext];
        [self setupRenderBuffer];
        [self setupFrameBuffer];
        [self render];
    }
    return self;
}

- (void)dealloc
{
    _context = nil;
    
}

@end
原文地址:https://www.cnblogs.com/R0SS/p/5091619.html