#import <UIKit/UIKit.h>
#import <OpenGLES/ES2/gl.h>
#import <OpenGLES/ES2/glext.h>
@interface HZTriangularView : UIView{
EAGLContext *_context;
CAEAGLLayer *_eaglLayer;
GLuint _renderbuffers;
GLuint _framebuffers ;
}
// 所有的OpenGL渲染都是在这个 CAEAGLLayer类型图层进行渲染的。所以这一个必须设置。否则运行不起来。
+(Class)layerClass{
return [CAEAGLLayerclass];
}
第二步:
// 创建上下文。
- (void)initContext{
_context = [[EAGLContextalloc]initWithAPI:kEAGLRenderingAPIOpenGLES2];
if (!_context) {
NSLog(@"Failed to initialize OpenGLES 2.0 context");
exit(1);
}
if (![EAGLContextsetCurrentContext:_context]) {
NSLog(@"Failed to set current OpenGL context");
exit(1);
}
}
// 转化图层。
- (void)initLayer{
_eaglLayer = (CAEAGLLayer *)self.layer;
_eaglLayer.opaque =YES;
}
// 创建渲染缓冲区。并为其绑定缓冲对象。
- (void)initRenderBuffer{
glGenRenderbuffers(1, &_renderbuffers);
glBindRenderbuffer(GL_RENDERBUFFER,_renderbuffers);
[_context renderbufferStorage:GL_RENDERBUFFERfromDrawable:_eaglLayer];
}
// 创建帧缓冲区,并为其绑定缓冲对象。
- (void)initFrameBuffer{
glGenFramebuffers(1, &_framebuffers);
glBindFramebuffer(GL_FRAMEBUFFER,_framebuffers);
// 把渲染缓冲区绑定到帧缓冲区上。并用颜色进行渲染。
glFramebufferRenderbuffer(GL_FRAMEBUFFER,GL_COLOR_ATTACHMENT0,GL_RENDERBUFFER,_renderbuffers);
}
// 渲染
-(void)render{
glClearColor(162.0/255.0,72.0/255.0,52.0/255.0,1.0);
glClear(GL_COLOR_BUFFER_BIT);
[_context presentRenderbuffer:GL_RENDERBUFFER];
}
-(instancetype)initWithFrame:(CGRect)frame{
if (self = [superinitWithFrame:frame]) {
[self initLayer];
[self initContext];
[self initRenderBuffer];
[self initFrameBuffer];
[self render];
}
return self;
}
// 这是一个代表顶点的结构体 Position:(x,y,z) Color:(R,G,B,A)
typedef struct{
float Position[3];
float Color[4];
}Vertex;
// 这就是顶点结构体的 3个顶点和颜色。
const Vertex vertices[]={
{{0.5,-0.5},{1.0,0.0,0.0,1.0}},
{{0.5,0.5},{0.0,1.0,0.0,1.0}},
{{-0.5,0.5},{0.0,0.0,1.0,1.0}}
};
// 这就是三角型相连的三个点。
const GLubyte Indices[] = {
0,1,2
};