GLKit ー ハローOpenGL 三角形を書いてみる


GLKitを使って三角を表示する方法のメモ。



Framework

・GLKit

・OpenGLES

※ Build Phases の Link Binary … に追加。


ポイント

・EAGLContext

・GLKBaseEffect

・GLKVector

・GLKView

・GLKViewController



注意

こんなログが出る場合、

reason: '-[GLKViewController loadView] loaded the "ViewController_iPhone" nib but didn't get a GLKView

nibとかのviewのclassをGLKViewに変更する。





三角形を表示するサンプルコード


-------------------------

ViewController.h

-------------------------

#import <GLKit/GLKit.h>


@interface ViewController : GLKViewController{

    GLuint vertexBufferID;

}

@property (strong, nonatomic) GLKBaseEffect *baseEffect;


@end





-------------------------

ViewController.m

-------------------------

#import "ViewController.h"


@implementation ViewController

@synthesize baseEffect;


typedef struct {

    GLKVector3 position;

} Vertex;


// 三角の座標

static const Vertex vertices[] =

{

    {{-0.5f, -0.5f,  0.0}},

    {{ 0.5f, -0.5f,  0.0}},

    {{-0.5f,  0.5f,  0.0}}

};



- (void)viewDidLoad

{

    [super viewDidLoad];

    GLKView *view = (GLKView*)self.view;

    

    

    // OpenGL ES2を指定

    view.context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];

    

    // set context

    [EAGLContext setCurrentContext:view.context];

    

    // 三角形に白を設定

    self.baseEffect = [[GLKBaseEffect alloc] init];

    self.baseEffect.useConstantColor = GL_TRUE;

    self.baseEffect.constantColor = GLKVector4Make(1.0f, 1.0f, 1.0f, 1.0f);

    

    // 透明部分(背景)を黒に

    glClearColor(0.0f, 0.0f, 0.0f, 1.0f);

    

    // GPUに点の情報を

    glGenBuffers(1, &vertexBufferID);

    glBindBuffer(GL_ARRAY_BUFFER, vertexBufferID);

    

    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);

}




#pragma mark - GLKView delegate

- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect

{

    [self.baseEffect prepareToDraw];

    

    glClear(GL_COLOR_BUFFER_BIT);

    

    glEnableVertexAttribArray(GLKVertexAttribPosition);

    

    glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), NULL);

    

    glDrawArrays(GL_TRIANGLES, 0, 3);

}



- (void)viewDidUnload

{

    [super viewDidUnload];

    

    // current contextbufferを消す

    GLKView *view = (GLKView *)self.view;

    [EAGLContext setCurrentContext:view.context];

    if (0 != vertexBufferID) {

        glDeleteBuffers(1, &vertexBufferID);

    }


    // contextを消す

    view.context = nil;

    [EAGLContext setCurrentContext:nil];

}



@end