天天看點

【OpenGL】建立視窗筆記拾遺

主要是自己遇到的坑的筆記,參考教程還是:http://learnopengl-cn.readthedocs.io/zh/latest/ 的

你好,視窗

你好,三角形

章節。

1. glew庫的初始化

在程式的最前面添加了glew初始化相關的如下代碼段之後:

// Set this to true so GLEW knows to use a modern approach to retrieving function pointers and extensions
    glewExperimental = GL_TRUE;
    // Initialize GLEW to setup the OpenGL Function pointers
    if (glewInit() != GLEW_OK)
    {
        std::cout << "Failed to initialize GLEW" << std::endl;
        return -;
    }
           

發現沒法跑了,debug了一下發現是初始化失敗了。在看了官方的源代碼之後發現glew的初始化必須在所有相關的GLFW操作完成之後進行。

2. 渲染管線(Pipeline)

渲染管線是深入了解圖形學避不過的坎,我們需要清楚地知道,程式裡面的一大堆亂七八糟的資料是怎麼通過一系列的處理轉化成我們想要的2D圖像。一開始我的了解就像我們拍照一樣,自然界如此繁雜,我們需要一個公式才能将這個場景轉化為照片。

好,那麼先看一下上面教程連結裡的圖,用心感受 (‘_>’):

【OpenGL】建立視窗筆記拾遺

先結合教程與自己的經驗總結一下這裡的整個渲染管線:

  • 頂點着色器:“把3D坐标轉為另一種3D坐标”,網上的GLSL會有詳細地一些小伎倆,比如把原本是平面的圖形通過疊加一個三角函數然後變成波浪形狀。而實際應用中的話,之前自己做過的應用是計算光線方向、反射方向還有法線方向(可能還有更好的方法,這裡比較low,但是的确頂點着色器目前的認知僅限于此,後面有機會會回頭補充)。
  • 圖元裝配: 暫時了解為組裝成一個三角形,或四邊形。
  • 細分着色器: Tessellation這個詞在很多講座型課程中看到過,相關的優化之類的算法有很大的前景。曾看過相關的應該是根據距離的遠近來決定使用不同層次的細分。目的就是建立平滑的視覺效果。
  • 光栅化: 離散成像素點,然後喂狗(嗯)。
  • 片段着色器: 在此前進行裁切,然後片段着色器的重點是:
    包含用來計算像素最終顔色的3D場景的一些資料(比如光照、陰影、光的顔色等等
  • 測試與混合: 這裡直接引用做個筆記吧:
    在所有相應顔色值确定以後,最終它會傳到另一個階段,我們叫做alpha測試和混合(Blending)階段。這個階段檢測像素的相應的深度(和Stencil)值(後面會講),使用這些,來檢查這個像素是否在另一個物體的前面或後面,如此做到相應取舍。這個階段也會檢查alpha值(alpha值是一個物體的透明度值)和物體之間的混合(Blend)。是以,即使在片段着色器中計算出來了一個像素所輸出的顔色,最後的像素顔色在渲染多個三角形的時候也可能完全不同。

3. 頂點緩沖

第一次接觸這個概念,了解起來需要記一下:

(1) 目的

一次性發送大批資料到顯示卡上;

(2) 綁定與解綁

每次我們使用的時候都是全局先會有一個總的緩沖ID對象,然後在代碼段的初始化階段,進行資料的輸入以及連結頂點屬性。最後是在沒幀的渲染中調用一次繪制函數。

按個人了解由于你的不同圖元的屬性不一樣,是以和shader一樣有對應的自己的頂點緩沖區,是以開始要分别對每種緩沖區設定其屬性,然後才能在渲染時保持正确。

繼續閱讀