2015-11-15 36 views
2

所以我一直在學習OpenGL 3.3的https://open.gl/,我對某些東西感到非常困惑。OpenGL大項目,VAO-s和更多

  1. VAO-s。根據我的理解,他們用於存儲glVertexAttribPointer調用。
  2. VBO-s。他們存儲vertecies。所以,如果我正在做多個對象的東西,我需要每個對象的VBO嗎?
  3. 着色程序 - 爲什麼我們需要多個程序,他們到底做了什麼?
  4. 這行代碼到底是什麼:glBindFragDataLocation(shaderProgram,0,「outColor」);

最重要的是所有這些如何融入一個大項目?爲什麼使用VAO-s?大多數教程僅僅是用硬編碼頂點來繪製一個立方體或2的東西,那麼如何去管理有很多對象的場景呢?我讀過this線程,並對場景管理如何發生以及所有方面有了一些瞭解,但我仍然無法弄清楚如何將OpenGL的東西連接到它。

+1

https://www.opengl.org/wiki/Vertex_Specification_Best_Practices, –

+1

http://learnopengl.com/#!Getting-started/Shaders本網站其實非常有用! –

回答

6

1 - 是的。 VAOs通常存儲頂點數組綁定。當你看到你正在做很多調用GPU的狀態的啓用,禁用和更改時,你可以在程序的某個早期階段做所有的事情,然後使用VAO來做一個「快照」什麼不是,在那個時候。稍後,在實際的繪製調用期間,您所需要做的就是再次綁定VAO以將所有頂點狀態設置爲當時的狀態。就像VBOs因爲立即發送所有頂點而使得立即模式更快,VAOs通過一次更改許多頂點狀態可以更快地工作。

2-VBOs是將您的glPosition,glColor ..等座標發送到GPU以在屏幕上呈現的另一種方式。與直接模式不同,您需要將所有頂點預先上傳到GPU,並將它們的位置作爲ID進行檢索,與立即模式不同,您可以通過gl*Attribute*調用逐個發送頂點數據。在渲染時,您只需指向GPU(您將VBO ID綁定到類似GL_ARRAY_BUFFER的東西,並使用glVertexAttribPointer指定存儲頂點數據的詳細信息)到該位置併發出您的渲染命令。這樣顯然可以節省大量時間,因此速度更快。

至於是否應該有一個VBO每個對象或者甚至一個VBO對於所有對象都取決於程序員和他們想要呈現的對象的結構。畢竟,VBOs本身就是您存儲在GPU中的一堆數據,並告訴計算機如何使用glVertexAttribPointer調用來安排它們。

3-Shaders用於定義一個管道 - 一個例程 - 它們在發送到GPU之後會發生什麼樣的頂點,顏色,法線等等,直到它們呈現爲屏幕。當您將頂點發送到GPU時,它們通常仍然是3D座標,但屏幕是二維的像素片。仍然存在根據ProjectionModelView矩陣(頂點着色器的作業)重新定位這些頂點的過程,然後將3D幾何(幾何着色器)「平化」或光柵化爲2D平面。然後着色平坦的2D場景(片段着色器),最後相應地在屏幕上點亮像素。在OpenGL版本1.5核心及以下版本中,您對這些階段沒有太多的控制權,因爲它全部是固定的(因此術語fixed pipeline)。考慮一下你在這些着色器階段可以做什麼,你會發現你可以用它們做很多很棒的事情。例如,在片段着色器中,就在將片段顏色發送到GPU之前,取消顏色的符號並加1以使該着色器渲染的對象的顏色反轉!

至於需要使用多少個着色器,需要由程序員決定是否需要多少個着色器。他們可以將所需的所有功能合併到一個巨大的着色器(uber着色器)中,並使用布爾值uniforms(通常被認爲是一種不好的做法)來打開和關閉這些功能,或者讓每個着色器執行某個操作並綁定正確的根據他們的需要。

這究竟行做: glBindFragDataLocation(shaderProgram, 0, "outColor");

這意味着,無論是存儲在out聲明的變量「outColor」的片段着色器執行結束時將被髮送到GPU作爲最終的主要碎片顏色。

最重要的是所有這些如何適合一個大的 程序?爲什麼使用VAO-s?大多數教程只是 覆蓋的東西只是繪製一個立方體或2與硬編碼的頂點, 所以如何將管理與許多對象的場景?我有 閱讀此主題,並瞭解如何 現場管理髮生,但我仍然不知道如何連接OpenGL的東西。

他們都一起工作,在屏幕上繪製你漂亮的彩色形狀。 VBO s是存儲場景頂點的結構(全部以醜陋的方式對齊),VertexAttribPointer調用以告知GPU如何排列VBO中的數據,VAO s提前存儲所有這些VertexAttribPointer指令併發送它們在渲染主循環期間一次只需綁定一個,着色器則可以在屏幕上繪製場景的過程中給予更多控制權。

所有這一切聽起來可能聽起來壓倒一切,但通過練習,你會習慣它。

+0

謝謝,這個驚人的答案很多!現在大部分都變得更清晰了。也許還有一個小問題。你知道一些有趣的小項目或任務嗎?所以我能更好地把握一切。 – Rokner

+1

我不知道,但如果這是你喜歡做的事情,也許是一個小遊戲項目。對於初學者來說,可以使用OpenGL的直接模式('glBegin()','glEnd()')來渲染圖形。然後當你進步的時候,嘗試將這些調用轉換爲現代的OpenGL VBO和東西,然後學習'glm'(GLmath;一個優秀的數學庫,它會讓你更容易),並嘗試着色器。 –

+0

再次感謝!我可能會做一些非常小的遊戲來理解這些事情。 – Rokner