版本記錄
版本號 | 時間 |
---|---|
V1.0 | 2018.01.07 |
前言
OpenGL ES圖形庫項目中一直也沒用過,最近也想學著使用這個圖形庫,感覺還是很有意思,也就自然想著好好的總結一下,希望對大家能有所幫助。下面就開始進行實踐,寫一些小程序。感興趣的可以看上面幾篇文章。
1. OpenGL ES實踐(一)—— 一個簡單的小程序
2. OpenGL ES實踐(二)—— 一個簡單的三角形
功能需求
畫一個三色三角形
功能實現
下面我們就看一下代碼。
1. JJOpenglesVC.h
#import <UIKit/UIKit.h>
#import <GLKit/GLKit.h>
@interface JJOpenglesVC : GLKViewController
@end
2. JJOpenglesVC.m
#import "JJOpenglesVC.h"
//頂點屬性
const GLfloat Vertices2[] = {
0.5, -0.5, 0.0f, 1.0f, 0.0f, 0.0f, //右下(x,y,z坐標 + rgb顏色)
-0.5, 0.5, 0.0f, 0.0f, 1.0f, 0.0f, //左上
-0.5, -0.5, 0.0f, 0.0f, 0.0f, 1.0f, //左下
};
@interface JJOpenglesVC()
@property (nonatomic, strong) EAGLContext *context; //上下文環境
@property (nonatomic, strong) GLKBaseEffect *baseEffect; //著色器效果
@end
@implementation JJOpenglesVC
#pragma mark - Override Base Function
- (void)viewDidLoad
{
[super viewDidLoad];
[self setupContext];
[self setupVertexBufferObject];
[self setupBaseEffect];
}
#pragma mark - Object Private Function
/**
設置OpenGL ES上下文
*/
- (void)setupContext
{
self.context = [[EAGLContext alloc]initWithAPI:kEAGLRenderingAPIOpenGLES3];
if (!self.context) {
NSLog(@"Failed to initialize OpenGLES 2.0 context");
exit(1);
}
GLKView *view = (GLKView *)self.view;
view.context = self.context;
//顏色緩沖區格式
view.drawableColorFormat = GLKViewDrawableColorFormatRGBA8888;
//self.context為OpenGL的"當前激活的Context"。之后所有"GL"指令均作用在這個Context上。
if (![EAGLContext setCurrentContext:self.context]) {
NSLog(@"Failed to set current OpenGL context");
exit(1);
}
}
/**
創建Vertex Buffer 對象
*/
- (void)setupVertexBufferObject
{
GLuint verticesBuffer;
glGenBuffers(1, &verticesBuffer);
glBindBuffer(GL_ARRAY_BUFFER, verticesBuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(Vertices2), Vertices2, GL_STATIC_DRAW);
//開啟對應的頂點屬性
glEnableVertexAttribArray(GLKVertexAttribPosition); //頂點數組緩存
glEnableVertexAttribArray(GLKVertexAttribColor); //顏色
//為vertex shader的Position和GLKVertexAttribColor配置合適的值
glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 6, (GLfloat *)NULL + 0);
glVertexAttribPointer(GLKVertexAttribColor, 3, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 6, (GLfloat *)NULL + 3);
}
//創建著色器效果
- (void)setupBaseEffect
{
self.baseEffect = [[GLKBaseEffect alloc] init];
}
#pragma mark - GLKViewDelegate
- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect
{
//啟動著色器
[self.baseEffect prepareToDraw];
glClearColor(0.1f, 0.2f, 0.3f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
//繪制
glDrawArrays(GL_TRIANGLES, 0, 3);
}
@end
功能效果
下面我們看一下功能效果。
后記
未完,待續~~~