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
指令併發送它們在渲染主循環期間一次只需綁定一個,着色器則可以在屏幕上繪製場景的過程中給予更多控制權。
所有這一切聽起來可能聽起來壓倒一切,但通過練習,你會習慣它。
https://www.opengl.org/wiki/Vertex_Specification_Best_Practices, –
http://learnopengl.com/#!Getting-started/Shaders本網站其實非常有用! –