1.繪制一個簡單的三角形

默認情況下,OpenGL ES使用正交的笛卡爾坐標系,其中x軸水平向右,y軸垂直向上,而z軸指向屏幕外面,因此每個點用(x, y, z)三個值表示。這個坐標系的原點默認在屏幕中央,并且屏幕的四個角的坐標從左上角順時針分別為:(-1.0, 1.0, 0)、(1.0, 1.0, 0.0)、(1.0, -1.0, 0.0)、(-1.0, -1.0, 0.0)。

#import "GameViewController.h"
#import <OpenGLES/ES2/glext.h>

//三角形頂點數(shù)據(jù)
static const GLKVector3 vertices[] = {
    {-0.5f, -0.5f, 0.0f},
    {0.5f, -0.5f, 0.0f},
    {-0.5f, 0.5f, 0.0f}
};

@interface GameViewController () {
    GLuint vertexBufferID;
}
//用于設置通用的OpenGL ES環(huán)境
@property (strong, nonatomic) GLKBaseEffect *baseEffect;
//OpenGL ES上下文
@property (strong, nonatomic) EAGLContext *context;
@end

@implementation GameViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    //使用支持OpenGL ES2的上下文
    self.context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];

    if (!self.context) {
        NSLog(@"Failed to create ES context");
    }
    
    GLKView *view = (GLKView *)self.view;
    view.context = self.context;
    view.drawableDepthFormat = GLKViewDrawableDepthFormat24;

    [EAGLContext setCurrentContext:self.context];
    
    self.baseEffect = [[GLKBaseEffect alloc] init];
    //啟用元素的默認顏色
    self.baseEffect.useConstantColor = GL_TRUE;
    //設置默認顏色
    self.baseEffect.constantColor = GLKVector4Make(0.0f, 1.0f, 1.0f, 1.0f);
    //設置背景色
    glClearColor(0.0f, 1.0f, 0.0f, 1.0f);
    
    //1. 生成緩存ID
    glGenBuffers(1, &vertexBufferID);
    //2. 綁定緩存ID對應的緩存類型
    glBindBuffer(GL_ARRAY_BUFFER, vertexBufferID);
    //3. 分配緩存空間
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
}

- (BOOL)prefersStatusBarHidden {
    return YES;
}

#pragma mark - GLKView and GLKViewController delegate methods

- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect
{
    [self.baseEffect prepareToDraw];
    //使用背景色清屏
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    //4. 啟用頂點位置數(shù)組
    glEnableVertexAttribArray(GLKVertexAttribPosition);
    //5. 設置頂點位置指針
    glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, sizeof(GLKVector3), NULL);
    //6. 繪制三角形
    glDrawArrays(GL_TRIANGLES, 0, 3);
}

- (void)dealloc
{
    if ([EAGLContext currentContext] == self.context) {
        [EAGLContext setCurrentContext:nil];
    }
    
    glDeleteBuffers(1, &vertexBufferID);
    vertexBufferID = 0;
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    
    if ([self isViewLoaded] && ([[self view] window] == nil)) {
        self.view = nil;
        
        if ([EAGLContext currentContext] == self.context) {
            [EAGLContext setCurrentContext:nil];
        }
        self.context = nil;
        //釋放緩存
        glDeleteBuffers(1, &vertexBufferID);
        vertexBufferID = 0;
    }
}

@end

上面的代碼是基于Xcode的iOS應用中OpenGL模板創(chuàng)建的項目。直接替換GameViewController.m中的內(nèi)容就行。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • 1 前言 一直想沿著圖像處理這條線建立一套完整的理論知識體系,同時積累實際應用經(jīng)驗。因此有了從使用AVFounda...
    RichardJieChen閱讀 5,946評論 5 12
  • 目錄 一、分析拉伸的原因 二、準備知識,三維變換 三、OpenGL 下的三維變換 四、修復拉伸問題 一、分析拉伸的...
    半紙淵閱讀 2,431評論 3 0
  • 1 前言 OpenGL渲染3D模型離不開空間幾何的數(shù)學理論知識,而本篇文章的目的就是對空間幾何進行簡單的介紹,并對...
    RichardJieChen閱讀 7,558評論 1 11
  • 你好,三角形 圖形渲染管線(Pipeline) 3D坐標轉為2D坐標的處理過程是由OpenGL的圖形渲染管線(Pi...
    IceMJ閱讀 7,646評論 2 13
  • 生的氣息 白的品質 花花填滿了眼 開吧 開吧 朵朵都是佛陀 酒向人間的六字真經(jīng)
    綻放唐朝閱讀 341評論 0 0

友情鏈接更多精彩內(nèi)容