OpenGL ES(四) GLKit+立方體貼圖+旋轉

上一篇文章我們實現了用GLIKit加載一張圖片一也,本篇文章,我們稍微深入點风纠,實現一個立方體貼圖+旋轉蚯斯。

效果

設置立方體的頂點坐標

static GLfloat vertexData[] = {
    -0.5f, -0.5f, -0.5f,      0.0f, 0.0f,
    0.5f, -0.5f, -0.5f,      1.0f, 0.0f,
    0.5f, 0.5f, -0.5f,      1.0f, 1.0f,
    0.5f, 0.5f, -0.5f,      1.0f, 1.0f,
    -0.5f, 0.5f, -0.5f,      0.0f, 1.0f,
    -0.5f, -0.5f, -0.5f,      0.0f, 0.0f,
    
    -0.5f, -0.5f, 0.5f,      0.0f, 0.0f,
    0.5f, -0.5f, 0.5f,      1.0f, 0.0f,
    0.5f, 0.5f, 0.5f,      1.0f, 1.0f,
    0.5f, 0.5f, 0.5f,      1.0f, 1.0f,
    -0.5f, 0.5f, 0.5f,      0.0f, 1.0f,
    -0.5f, -0.5f, 0.5f,      0.0f, 0.0f,
    
    -0.5f, 0.5f, 0.5f,      1.0f, 0.0f,
    -0.5f, 0.5f, -0.5f,      1.0f, 1.0f,
    -0.5f, -0.5f, -0.5f,      0.0f, 1.0f,
    -0.5f, -0.5f, -0.5f,      0.0f, 1.0f,
    -0.5f, -0.5f, 0.5f,      0.0f, 0.0f,
    -0.5f, 0.5f, 0.5f,      1.0f, 0.0f,
    
    0.5f, 0.5f, 0.5f,      1.0f, 0.0f,
    0.5f, 0.5f, -0.5f,      1.0f, 1.0f,
    0.5f, -0.5f, -0.5f,      0.0f, 1.0f,
    0.5f, -0.5f, -0.5f,      0.0f, 1.0f,
    0.5f, -0.5f, 0.5f,      0.0f, 0.0f,
    0.5f, 0.5f, 0.5f,      1.0f, 0.0f,
    
    -0.5f, -0.5f, -0.5f,      0.0f, 1.0f,
    0.5f, -0.5f, -0.5f,      1.0f, 1.0f,
    0.5f, -0.5f, 0.5f,      1.0f, 0.0f,
    0.5f, -0.5f, 0.5f,      1.0f, 0.0f,
    -0.5f, -0.5f, 0.5f,      0.0f, 0.0f,
    -0.5f, -0.5f, -0.5f,      0.0f, 1.0f,
    
    -0.5f, 0.5f, -0.5f,      0.0f, 1.0f,
    0.5f, 0.5f, -0.5f,      1.0f, 1.0f,
    0.5f, 0.5f, 0.5f,      1.0f, 0.0f,
    0.5f, 0.5f, 0.5f,      1.0f, 0.0f,
    -0.5f, 0.5f, 0.5f,      0.0f, 0.0f,
    -0.5f, 0.5f, -0.5f,      0.0f, 1.0f
};

屬性設置

image.png

配置基本信息

- (void)setupConfig{
    // 使用OpenGLES3
    // EAGLContext是蘋果iOS平臺下實現OpenGLES渲染層
    self.context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES3];
    
    // 判斷是否創(chuàng)建成功
    if (!self.context) {
        NSLog(@"Create ES context failed");
        return;
    }
    
    // 設置當前上下文
    [EAGLContext setCurrentContext:self.context];
    
    
    // 獲取GLKView
    GLKView *glkView = (GLKView *)self.view; // 因為當前VC是繼承自`GLKViewController`薄风,所有可以這樣直接獲取
    glkView.delegate = self;
    
    // 設置`GLKView`的`context`
    glkView.context = self.context;
    
    // 配置視圖渲染緩沖區(qū)
    glkView.drawableColorFormat = GLKViewDrawableColorFormatRGBA8888;
    glkView.drawableDepthFormat = GLKViewDrawableDepthFormat24;
    
    // 設置背景顏色
    glClearColor(0.5, 0.5, 0.5, 1);
}

配置頂點數據

- (void)setupVertexData{
    // 每一行的前面3個是頂點坐標,后面2個是紋理坐標
    // 紋理坐標系取值范圍[0,1];原點是左下角(0,0);
    // 故而(0,0)是紋理圖像的左下角, 點(1,1)是右上角.
    
    
    
    /*
     頂點數組: 開發(fā)者可以選擇設定函數指針拍嵌,在調用繪制方法的時候遭赂,直接由內存?zhèn)魅腠旤c數據,也就是說這部分數據之前是存儲在內存當中的撰茎,被稱為頂點數組
     頂點緩存區(qū): 性能更高的做法是嵌牺,提前分配一塊顯存,將頂點數據預先傳入到顯存當中龄糊。這部分的顯存逆粹,就被稱為頂點緩沖區(qū)
     */
    
    // 開辟頂點緩沖區(qū)
    // (1) 創(chuàng)建頂點緩沖區(qū)標識符ID
    GLuint bufferID;
    glGenBuffers(1, &bufferID); // 開辟1個頂點緩沖區(qū),所以傳入1
    NSLog(@"bufferID:%d", bufferID);
    // (2) 綁定頂點緩沖區(qū)
    glBindBuffer(GL_ARRAY_BUFFER, bufferID);
    // (3) 將頂點數組的數據copy到頂點緩沖區(qū)中(GPU顯存中)
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertexData), vertexData, GL_STATIC_DRAW);
    
    
    // 打開讀取通道
    glEnableVertexAttribArray(GLKVertexAttribPosition); // 頂點坐標數據
    glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 5, (GLfloat *)NULL + 0);
    
    
    glEnableVertexAttribArray(GLKVertexAttribTexCoord0); // 紋理坐標數據
    glVertexAttribPointer(GLKVertexAttribTexCoord0, 2, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 5, (GLfloat *)NULL + 3); // 第一個紋理坐標前面有3個值炫惩,是頂點坐標
    
}

配置紋理

- (void)setupTexture{
    // 獲取紋理圖片
    NSString *filePath = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"png"];
    
    // 初始化紋理
    NSDictionary *options = @{GLKTextureLoaderOriginBottomLeft: @(1)}; // 紋理坐標原點是左下角,但是圖片顯示原點應該是左上角
    GLKTextureInfo *textureInfo = [GLKTextureLoader textureWithContentsOfFile:filePath options:options error:nil];
    
    NSLog(@"textureInfo.name: %d", textureInfo.name);
    
    // 使用蘋果`GLKit`提供的`GLKBaseEffect`完成著色器工作(頂點/片元)
    self.baseEffect = [[GLKBaseEffect alloc] init];
    self.baseEffect.texture2d0.enabled = GL_TRUE;
    self.baseEffect.texture2d0.name = textureInfo.name;
    
    // 設置透視投影矩陣
    CGFloat aspect = fabs(self.view.bounds.size.width / self.view.bounds.size.height);
    GLKMatrix4 projectionMatrix = GLKMatrix4MakePerspective(GLKMathDegreesToRadians(65.0), aspect, 0.1, 100.0);
    self.baseEffect.transform.projectionMatrix = projectionMatrix;
}

更新場景

會多次調用該方法

- (void)updateScene{
    _angle = (_angle + 2);
    GLKMatrix4 modelViewMatrix = GLKMatrix4Translate(GLKMatrix4Identity, 0, 0, -4.0);
    modelViewMatrix = GLKMatrix4Rotate(modelViewMatrix, GLKMathDegreesToRadians(_angle), 0.3, 0.5, 0.7);
    self.baseEffect.transform.modelviewMatrix = modelViewMatrix;
}

實現GLKViewDelegate代理

正方體有6個面僻弹,需要12個三角形,每個三角形由三個頂點組成他嚷,所以這兒是12x3=36個點

- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect{
    // 清除顏色緩沖區(qū)蹋绽、深度緩沖區(qū)
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    
    // 開啟深度測試
    glEnable(GL_DEPTH_TEST);
    
    [self updateScene];
    
    // 準備繪制
    [self.baseEffect prepareToDraw];
    
    // 開始繪制
    // 從第一個開始,所以是0
    glDrawArrays(GL_TRIANGLES, 0, 48); // 正方體有6個面筋蓖,需要12個三角形卸耘,每個三角形由三個頂點組成,所以這兒是12x3=36個點
}

Demo

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末粘咖,一起剝皮案震驚了整個濱河市蚣抗,隨后出現的幾起案子,更是在濱河造成了極大的恐慌瓮下,老刑警劉巖翰铡,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異讽坏,居然都是意外死亡锭魔,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進店門路呜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來迷捧,“玉大人织咧,你說我怎么就攤上這事∧铮” “怎么了烦感?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長膛堤。 經常有香客問我,道長晌该,這世上最難降的妖魔是什么肥荔? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮朝群,結果婚禮上燕耿,老公的妹妹穿的比我還像新娘。我一直安慰自己姜胖,他們只是感情好誉帅,可當我...
    茶點故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著右莱,像睡著了一般蚜锨。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上慢蜓,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天亚再,我揣著相機與錄音,去河邊找鬼晨抡。 笑死氛悬,一個胖子當著我的面吹牛,可吹牛的內容都是我干的耘柱。 我是一名探鬼主播如捅,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼调煎!你這毒婦竟也來了镜遣?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤汛蝙,失蹤者是張志新(化名)和其女友劉穎烈涮,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體窖剑,經...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡坚洽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年西土,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片般甲。...
    茶點故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡敷存,死狀恐怖锚烦,靈堂內的尸體忽然破棺而出涮俄,到底是詐尸還是另有隱情尸闸,我是刑警寧澤吮廉,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布茧痕,位于F島的核電站,受9級特大地震影響曼氛,放射性物質發(fā)生泄漏舀患。R本人自食惡果不足惜气破,卻給世界環(huán)境...
    茶點故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一低匙、第九天 我趴在偏房一處隱蔽的房頂上張望顽冶。 院中可真熱鬧售碳,春花似錦、人聲如沸佃声。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽哮缺。三九已至尝苇,卻和暖如春埠胖,著一層夾襖步出監(jiān)牢的瞬間直撤,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蓖乘,地道東北人。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像隶症,于是被迫代替她去往敵國和親蚂会。 傳聞我的和親對象是個殘疾皇子狈定,可洞房花燭夜當晚...
    茶點故事閱讀 45,044評論 2 355