5.整理后的三角形繪制代碼

通過簡單封裝理順了一下思路的簡單三角形繪制代碼。

#import "ViewController.h"

static const GLKVector3 triangleVertices[3] = {
    {0.0f, 0.25f, 0.0f},
    {-0.5f, -0.25f, 0.0f},
    {0.5f, -0.25f, 0.0f}
};

static const GLKVector4 triangleColors[3] = {
    {1.0f, 0.0f, 0.0f, 1.0f},
    {0.0f, 1.0f, 0.0f, 1.0f},
    {0.0f, 0.0f, 1.0f, 1.0f}
};

@interface ViewController () <GLKViewDelegate>
{
    GLuint _triangle;
    GLuint _color;
}
@property (strong, nonatomic) GLKBaseEffect *baseEffect;
@end

@implementation ViewController
//創(chuàng)建VBO對象
- (GLuint)createVertexBuffer:(GLsizeiptr)stride         //頂點數據大小
            numberOfVertices:(GLsizei)count             //頂點數
                       bytes:(const GLvoid *)dataPtr    //數組地址
                       usage:(GLenum)usage {            //用途
    
    GLuint name = 0;
    glGenBuffers(1, &name);
    glBindBuffer(GL_ARRAY_BUFFER, name);
    glBufferData(GL_ARRAY_BUFFER, stride * count, dataPtr, usage);
    
    NSAssert(name != 0, @"沒有正確產生緩存名稱");
    
    return name;
}

//設置繪制對象的屬性
- (void)prepareToDrawTarget:(GLuint)name
                     attrib:(GLuint)index
            numberOfCoordinates:(GLint)count
                         stride:(GLsizei)stride
                   attribOffset:(GLsizeiptr)offset
                         enable:(GLboolean)enable {
    glBindBuffer(GL_ARRAY_BUFFER, name);
    
    if (enable) {
        glEnableVertexAttribArray(index);
    }
    glVertexAttribPointer(index,            //屬性類型
                          count,            //頂點數
                          GL_FLOAT,         //數據類型
                          GL_FALSE,         //是否歸一化
                          stride,           //頂點數據大小
                          NULL + offset);   //數據偏移量
}

- (void)drawArrayWithMode:(GLenum)mode
               startIndex:(GLuint)index 
         numberOfVertices:(GLsizei)count {
    glDrawArrays(mode, index, count);
}

- (void)configOpenGL {
    //1. 配置OpenGL上下文
    GLKView *glkView = (GLKView *)self.view;
    glkView.context = [[EAGLContext alloc] initWithAPI: kEAGLRenderingAPIOpenGLES2];
    glkView.drawableDepthFormat = GLKViewDrawableDepthFormat24;
    glkView.delegate = self;
    
    [EAGLContext setCurrentContext:glkView.context];
    
    //2. 設置基本的環(huán)境參數
    self.baseEffect = [[GLKBaseEffect alloc] init];
    self.baseEffect.useConstantColor = GL_TRUE;
    self.baseEffect.constantColor = GLKVector4Make(1.0f, 0.0f, 0.0f, 1.0f);
}

- (void)testBgColor {
    glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
}

- (void)viewDidLoad {
    [super viewDidLoad];
    
    [self configOpenGL];
    
    [self testBgColor];
    //分配緩存區(qū)
    _triangle = [self createVertexBuffer:sizeof(GLKVector3) 
                        numberOfVertices:3 
                                   bytes:triangleVertices 
                                   usage:GL_STATIC_DRAW];
    _color = [self createVertexBuffer:sizeof(GLKVector4) 
                     numberOfVertices:3 
                                bytes:triangleColors 
                                usage:GL_STATIC_DRAW];
}

- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect {
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    
    [self.baseEffect prepareToDraw];
    
    //準備頂點數組
    [self prepareToDrawTarget:_triangle 
                       attrib:GLKVertexAttribPosition 
          numberOfCoordinates:3 
                       stride:sizeof(GLKVector3) 
                 attribOffset:0 
                       enable:GL_TRUE];
    //準備顏色數組
    [self prepareToDrawTarget:_color
                       attrib:GLKVertexAttribColor
          numberOfCoordinates:4 
                       stride:sizeof(GLKVector4) 
                 attribOffset:0
                       enable:GL_TRUE];
    //繪制形狀
    [self drawArrayWithMode:GL_TRIANGLES 
                 startIndex:0 
           numberOfVertices:3];
}
@end
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,057評論 25 709
  • 發(fā)現 關注 消息 iOS 第三方庫、插件、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 15,358評論 4 61
  • 父母的世界里,沒有“容易”二字 孩子在不斷索取中成長 父母在不斷付出中老去 當一個人獨自走過一些路 才逐漸體會到父...
    十3閱讀 206評論 0 0
  • 鮮魚入姜、生粉、炸熟備用 起油鍋入蒜丁、姜丁、青辣椒、紅辣椒翻炒,入魚塊、醬油、料酒、堿水、耗油、鹽、雞精翻炒出鍋
    渡把閱讀 317評論 0 0
  • 上一章節(jié)回顧 http://www.itdecent.cn/p/1122597b3cca 別人不待見的友情,在她看...
    薔薇下的陽光閱讀 623評論 2 3

友情鏈接更多精彩內容