OpenGL中的Uniform block size 的大小限制
我們繪制了1000個隕石,如果我們將數量提升到 2000 個,會怎么樣?
在編譯 shader 的時候就會報錯:
那要怎么樣才能知道 UBO 最大的大小限制呢?
獲取 單個UBO大小 的最大限制
使用 glGetIntegerv 接口即可,傳入:GL_MAX_UNIFORM_BLOCK_SIZE
// GL_MAX_UNIFORM_BLOCK_SIZEGLint maxUniformBlockSize;glGetIntegerv(GL_MAX_UNIFORM_BLOCK_SIZE, &maxUniformBlockSize);std::cout<< "Maximun number of Uniform Block Size : "<< maxUniformBlockSize<< std::endl;輸出:Maximun number of Uniform Block Size : 65536
注意不同的硬件中,這個限制大小是不同的,這里是我的筆記本上的測試結果
這個:65536?大小的單位是:字節
uniform Instancing_UBO {mat4 instancingMat[1000]; // instancing 矩陣 };從上面 shader 代碼可以看到 UBO 中有一個 mat4 的數組成員,數組大小為1000,一個 mat4 就是相當于 4個 vec4
每個 vec4 也就是 4個 float
所以一個 mat4 相當于 float4x4(DX的 shader : HLSL 數據類型),也就是 4x4=16 個 float
一個 float = 4 bytes,所以 mat4 = 16 * 4 個 bytes = 64 個 bytes
那么 1000 個 mat4 就是 1000 * 64 = 64000 bytes ,已經相當接近 65536 了,
那么我們可以通過 MaxUBOSize : 65536 除以單個 mat4 需要的字節(64字節),就可以知道我們的硬件最大可以給單個 UBO 分配多大的大小:
65536 / 64 = 1024,所以我的硬件是只支持單個 UBO 最多 1024個 mat4 的大小,也就是 64 KB 的大小
OK,我測試后,1024 個實例化是沒有 shader 編譯錯誤問題的
那么為了測試,我改為 1025 個后,也出現了上面的大小限制的問題了
上面的示例中,只是在 UBO 中使用了一個 mat4 的屬性,如果還有其他的顏色,或是其他的屬性,那么 UBO 的大小限制很快就成為最大的問題的
那么 UBO 的方式限制這么大,我們在一些場景中的繪制實例數量會大大超過這個數量,有些甚至到達 10萬個,或以上
除了 UBO 大小之外,不知道大家沒有發現,這種方式,還需要對 glsl Shader 層的 UBO指定固定大小
使用起來很不方便,這個數量很大時候取決于應用層的實例數量而動態變化大小的,雖然可以將 UBO 設置大些,但 UBO 大小本身有限制,而且不同硬件限制大小還不一樣,如,我這個筆記本,1024 個 mat4 的大小(64KB)就到頂了
所以使用 UBO 的方式限制問題還是很大的。
總結
以上是生活随笔為你收集整理的OpenGL中的Uniform block size 的大小限制的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 新加坡a50指数
- 下一篇: 银行卡给别人走账后果 可能涉嫌违法