ARB_uniform_buffer_object擴展要點總結

1.Uniform buffer object(ubo)是一種buffer object,所以也可以支持dma方式的數據傳輸,從而可以提高cpu端執行命令的效率

2.Uniform buffer object擴展提供了一種機制,一次可以綁定多個uniform param到program,並且可以在多個program或者shader stage之間共享數據

3.Uniform buffer object不是像uniform param一樣直接綁定到program,而是類似傳統紋理單元管理紋理的方式一樣,先將ubo綁定到所謂的binding point,然後program指定某個uniform block使用某個binding point

4.在shader源碼中可以定義一個uniform block,方式類似struct定義,實例如下

layout([packed, shared(default),std140,std430]) uniform

{

[uniform] mat4 WorldMatrix;

[uniform] mat4 ViewMatrix;

};

也可以給一個uniform block增加一個名字,相當於定義了一個struct作爲一個uniform block

5.packed適用於不在多個program或者shader stage之間共享數據的情況,編譯器會把用不到的uniform param去掉,把數據儘量對齊,去掉空隙,從而提高內存利用率

6.shared方式適用於在多個program或者shader stage之間共享數據的情況,編譯器不會去掉無用的uniform param,從而保證在所有program中使用的內存佈局完全一致

7.std140和std430使用預先定義的對齊和排列方式,從而可以在C語言端定義一個struct對應uniform block

8.ubo使用GL_UNIFORM_BUFFER綁定點,所有的創建和更新操作與vbo完全一樣

9.一個ubo可以包含多個uniform block的數據,但是每個uniform block必須對齊到GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT,這個值可能很大,比如256、512。沒有對齊到GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT的uniform block無法綁定到binding point

10.ubo提供了glBindBufferRange函數將ubo的一部分綁定到某個binding point,對應一個uniform block,要注意9條中說明的對齊問題

11.對於不是std140和std430佈局的uniform block,只能從program中獲得佈局,大致是一下流程:

1.使用glGetProgramiv,GL_ACTIVE_UNIFORM_BLOCKS獲得uniform block數量;

2.使用glGetProgramiv,GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH獲得uniform block名稱長度

3.依次處理索引爲[0, GL_ACTIVE_UNIFORM_BLOCKS)的uniform block

4.使用glGetActiveUniformBlockName獲得名稱

5.使用glGetActiveUniformBlockiv,GL_UNIFORM_BLOCK_DATA_SIZE獲得uniform block的大小

6.使用glGetActiveUniformBlockiv,GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS獲得uniform block中的uniform數量

7.使用glGetActiveUniformBlockiv,GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES,獲取一個uniform block中的所有uniform在program中的索引,uniform的其他屬性都需要用這個索引獲取

8.使用glGetActiveUniformName獲得uniform名稱

9.使用glGetActiveUniformsiv,GL_UNIFORM_OFFSET獲得全部uniform偏移

10.使用glGetActiveUniformsiv,GL_UNIFORM_SIZE獲得全部uniform的元素數量,不是數組類型的應當是1

11.使用glGetActiveUniformsiv,GL_UNIFORM_TYPE獲得全部uniform類型

12.應該還需要獲得元素數組類型uniform對齊方式

12.切記,binding point是針對整個context的,而不是針對program的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章