1. 程式人生 > >OpenGL學習筆記(0)

OpenGL學習筆記(0)

分享 渲染 att 對象 關聯 cte 也會 buffers isa

Mac下配置OpenGL

  1. 安裝homebrew

    ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

  2. 安裝GLEW與GLFW

    brew install glew

    brew install glfw

  3. 新建Xcode的Command Line C++項目,在build settings中設置Header Search PathLibrary Search Path,在其中添加對應的glewglfw的頭文件(include)與庫文件(lib)路徑。

  4. build Phases中添加庫文件技術分享圖片

(在對應的文件夾中將兩個/.dylib的文件直接拖拽進來)

  1. 配置GLAD:
    1. 打開在線服務,API選擇3.3及以上,Profile選擇Core,勾選Options中的Generate a loader,點擊GENERATE,會生成一個壓縮包,下載。
    2. 將子目錄中的/include/glad與/include/KHR復制到/usr/Local/include文件夾下。(如果/usr文件夾隱藏,可用快捷鍵command+shift+G輸入訪問)
    3. 將/src中的glad.c復制到Xcode工程文件夾下。
    4. build settings中添加路徑/usr/local/include
  2. 此時如果不出意外的話,你的第一個測試程序已經可以運行了,點擊測試代碼,復制到自己的.cpp文件中執行,會出現一個黑色窗口。

圖形渲染管線(Graphics PipeLines)

? 圖形渲染管線接受一組3D坐標,然後轉換成屏幕上的2D像素。

  1. 頂點著色器:以數組的形式傳遞3個3D坐標作為圖形渲染管線的輸入,用來表示一個三角形,這個數組稱為頂點數據(Vertex Data)。頂點數據是一系列頂點的集合,一個頂點是一個3D坐標的數據的集合。頂點數據由頂點屬性表示。頂點著色器將一種3D坐標轉換成另一種3D坐標,同時對頂點屬性做出一些處理。
  2. 圖元裝配:將頂點著色器輸出的所有頂點作為輸入,將所有頂點裝配成制定形狀的圖元。
  3. 幾何著色器:把圖元形式的一系列頂點集合作為輸入,通過產生新的頂點構造出新的圖元來產生其他形狀。
  4. 光柵化階段:把圖元映射為最終屏幕上的像素,生成供片段著色器使用的片段,在片段著色器使用之前進行裁剪,丟棄視圖之外的所有像素,以提升執行效率。
  5. 片段著色器:計算一個像素的最終顏色。
  6. Alpha 測試與混合階段。

對象:

頂點緩沖對象(Vertex Buffer Objects,VBO):

? 普通的頂點數組的傳輸,需要在繪制的時候頻繁的從CPU向GPU傳送數據,這種做法效率低下,為了加快顯示速度,顯卡增加了一個擴展,用於管理內存,在GPU內存中存儲大量頂點數據,這樣大大減少了從CPU到GPU的數據拷貝開銷,從而提升了程序運行的效率。

void glGenBuffers(GLsizei n,GLuint* buffers);   // 返回n個當前未使用的緩存對象名稱,並保存到buffers數組中

void glBindBuffer(GLenum target,GLuint buffer); // 指定當前激活的緩存對象,target表示指定綁定的目標類型,buffer為要綁定的緩存對象的名稱

void glBufferData (GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage);   // 把用戶定義的數據復制到當前綁定緩沖:target目標緩沖的類型,size指定傳輸數據的大小,data希望發送的實際數據,usage表示希望顯卡如何使用該數據
  • usage的可選內容及意義:
    • GL_STATIC_DRAW :數據不會或幾乎不會改變。
    • GL_DYNAMIC_DRAW:數據會被改變很多。
    • GL_STREAM_DRAW :數據每次繪制時都會改變。

頂點數組對象(Vertex Array Object,VAO):

? 每當我們繪制一個幾何體時,我們需要重復同樣的工作(首先綁定緩沖區、然後設置頂點屬性)。當需要繪制的物體很多時,這個過程就顯得有些耗時。VAO將所有頂點繪制過程中的這些設置與綁定過程集中存儲在一起,當配置頂點屬性指針時,只需要將那些調用執行一次,之後再繪制物體的時候只需要綁定相應的VAO就行了。這使在不同頂點數據和屬性配置之間切換變得非常簡單,只需要綁定不同的VAO就行了。剛剛設置的所有狀態都將存儲在VAO中。VAO可以看作一個容器,包含了多個VBO。

一個頂點數組對象會儲存以下這些內容:

  • glEnableVertexAttribArray和glDisableVertexAttribArray的調用。
  • 通過glVertexAttribPointer設置的頂點屬性配置。
  • 通過glVertexAttribPointer調用與頂點屬性關聯的頂點緩沖對象。

技術分享圖片

索引緩沖對象(Element Buffer Object,EBO):

? 和頂點緩沖對象一樣,EBO也是一個緩沖,它專門儲存索引,OpenGL調用這些頂點的索引來決定該繪制哪個頂點。

? glDrawElements函數從當前綁定到GL_ELEMENT_ARRAY_BUFFER目標的EBO中獲取索引。這意味著我們必須在每次要用索引渲染一個物體時綁定相應的EBO,這還是有點麻煩。不過頂點數組對象同樣可以保存索引緩沖對象的綁定狀態。VAO綁定時正在綁定的索引緩沖對象會被保存為VAO的元素緩沖對象。綁定VAO的同時也會自動綁定EBO。

技術分享圖片

? 當目標是GL_ELEMENT_ARRAY_BUFFER的時候,VAO會儲存glBindBuffer的函數調用。這也意味著它也會儲存解綁調用,所以確保你沒有在解綁VAO之前解綁索引數組緩沖,否則它就沒有這個EBO配置了。

OpenGL學習筆記(0)