OpenGL ES實踐(三)—— 一個三色三角形的繪制

版本記錄

版本號 時間
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

功能效果

下面我們看一下功能效果。

后記

未完,待續~~~

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容