//
// OpenGLView.h
// HelloOpenGL
//
// Created by yanwu wei on 2017/5/2.
// Copyright ? 2017年 Ivan. All rights reserved.
//
//引入OpenGL的Header殉挽,創(chuàng)建一些后面會用到的實例變量胁住。
#import <UIKit/UIKit.h>
#import <QuartzCore/QuartzCore.h>
#include <OpenGLES/ES2/gl.h>
#include <OpenGLES/ES2/glext.h>
@interface OpenGLView : UIView
{
CAEAGLLayer* _eaglLayer;
EAGLContext* _context;
GLuint _colorRenderBuffer;
}
@end
//
// OpenGLView.m
// HelloOpenGL
//
// Created by yanwu wei on 2017/5/2.
// Copyright ? 2017年 Ivan. All rights reserved.
//
#import "OpenGLView.h"
@implementation OpenGLView
//設(shè)置layer class 為 CAEAGLLayer
//想要顯示OpenGL的內(nèi)容蚌卤,你需要把它缺省的layer設(shè)置為一個特殊的layer瘾杭。
//(CAEAGLLayer)得糜。這里通過直接復(fù)寫layerClass的方法肛跌。
+ (Class)layerClass
{
return [CAEAGLLayer class];
}
//4) 設(shè)置layer為不透明(Opaque)
//因為缺省的話教寂,CALayer是透明的籍滴。而透明的層對性能負(fù)荷很大,特別是OpenGL的層贰镣。
//(如果可能呜象,盡量都把層設(shè)置為不透明膳凝。
//另一個比較明顯的例子是自定義tableview cell)
- (void)setupLayer
{
_eaglLayer = (CAEAGLLayer*) self.layer;
_eaglLayer.opaque = YES;
}
//5)創(chuàng)建OpenGL context
//無論你要OpenGL幫你實現(xiàn)什么,總需要這個 EAGLContext恭陡。
//EAGLContext管理所有通過OpenGL進(jìn)行draw的信息蹬音。
//這個與Core Graphics context類似。
//當(dāng)你創(chuàng)建一個context休玩,你要聲明你要用哪個version的API著淆。
//這里,我們選擇OpenGL ES 2.0.
//(容錯處理拴疤,如果創(chuàng)建失敗了永部,我們的程序會退出)
- (void)setupContext
{
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);
}
}
//6)創(chuàng)建render buffer (渲染緩沖區(qū))
//Render buffer 是OpenGL的一個對象,用于存放渲染過的圖像呐矾。
//有時候你會發(fā)現(xiàn)render buffer會作為一個color buffer被引用苔埋,
//因為本質(zhì)上它就是存放用于顯示的顏色。
//創(chuàng)建render buffer的三步:
//1. 調(diào)用glGenRenderbuffers來創(chuàng)建一個新的render buffer object蜒犯。
//這里返回一個唯一的integer來標(biāo)記render buffer
//(這里把這個唯一值賦值到_colorRenderBuffer)组橄。
//有時候你會發(fā)現(xiàn)這個唯一值被用來作為程序內(nèi)的一個OpenGL 的名稱。
//(反正它唯一嘛)
//2. 調(diào)用glBindRenderbuffer 罚随,告訴這個OpenGL:
//我在后面引用GL_RENDERBUFFER的地方玉工,
//其實是想用_colorRenderBuffer。其實就是告訴OpenGL淘菩,
//我們定義的buffer對象是屬于哪一種OpenGL對象
//3. 最后遵班,為render buffer分配空間。renderbufferStorage
- (void)setupRenderBuffer
{
glGenRenderbuffers(1, &_colorRenderBuffer);
glBindRenderbuffer(GL_RENDERBUFFER, _colorRenderBuffer);
[_context renderbufferStorage:GL_RENDERBUFFER fromDrawable:_eaglLayer];
}
//7)創(chuàng)建一個 frame buffer (幀緩沖區(qū))
//Frame buffer也是OpenGL的對象瞄勾,它包含了前面提到的render buffer费奸,
//以及其它后面會講到的諸如:
//depth buffer、stencil buffer 和 accumulation buffer进陡。
//前兩步創(chuàng)建frame buffer的動作跟創(chuàng)建render buffer的動作很類似愿阐。
//(反正也是用一個glBind什么的)
//而最后一步 glFramebufferRenderbuffer 這個才有點新意。
//它讓你把前面創(chuàng)建的buffer render依附在frame buffer的GL_COLOR_ATTACHMENT0位置上趾疚。
- (void)setupFrameBuffer
{
GLuint framebuffer;
glGenFramebuffers(1, &framebuffer);
glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
GL_RENDERBUFFER, _colorRenderBuffer);
}
//8)清理屏幕
//為了盡快在屏幕上顯示一些什么缨历,在我們和那些 vertexes、shaders打交道之前糙麦,
//把屏幕清理一下辛孵,顯示另一個顏色吧。(RGB 0, 104, 55赡磅,綠色吧)
//這里每個RGB色的范圍是0~1魄缚,所以每個要除一下255.
//下面解析一下每一步動作:
//1. 調(diào)用glClearColor ,設(shè)置一個RGB顏色和透明度,
//接下來會用這個顏色涂滿全屏冶匹。
//2. 調(diào)用glClear來進(jìn)行這個“填色”的動作(大概就是photoshop那個油桶嘛)习劫。
//還記得前面說過有很多buffer的話,這里我們要用到GL_COLOR_BUFFER_BIT來聲明要清理哪一個緩沖區(qū)嚼隘。
//3. 調(diào)用OpenGL context的presentRenderbuffer方法诽里,
//把緩沖區(qū)(render buffer和color buffer)的顏色呈現(xiàn)到UIView上。
- (void)render
{
glClearColor(0, 104.0/255.0, 55.0/255.0, 1.0);
glClear(GL_COLOR_BUFFER_BIT);
[_context presentRenderbuffer:GL_RENDERBUFFER];
}
//9)把前面的動作串起來修改一下OpenGLView.m
// Replace initWithFrame with this
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self)
{
[self setupLayer];
[self setupContext];
[self setupRenderBuffer];
[self setupFrameBuffer];
[self render];
}
return self;
}
@end
//
// ViewController.m
// HelloOpenGL
//
// Created by yanwu wei on 2017/5/2.
// Copyright ? 2017年 Ivan. All rights reserved.
//
#import "ViewController.h"
#import "OpenGLView.h"
@interface ViewController ()
{
OpenGLView* _glView;
}
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
_glView = [[OpenGLView alloc] initWithFrame:self.view.bounds];
[self.view addSubview:_glView];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
最后編輯于 :2017.12.07 02:13:26
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者