OpenGL中的Uniform block size 的大小限制
我們繪制了1000個隕石,如果我們將數(shù)量提升到 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
注意不同的硬件中,這個限制大小是不同的,這里是我的筆記本上的測試結(jié)果
這個:65536?大小的單位是:字節(jié)
uniform Instancing_UBO {mat4 instancingMat[1000]; // instancing 矩陣 };從上面 shader 代碼可以看到 UBO 中有一個 mat4 的數(shù)組成員,數(shù)組大小為1000,一個 mat4 就是相當(dāng)于 4個 vec4
每個 vec4 也就是 4個 float
所以一個 mat4 相當(dāng)于 float4x4(DX的 shader : HLSL 數(shù)據(jù)類型),也就是 4x4=16 個 float
一個 float = 4 bytes,所以 mat4 = 16 * 4 個 bytes = 64 個 bytes
那么 1000 個 mat4 就是 1000 * 64 = 64000 bytes ,已經(jīng)相當(dāng)接近 65536 了,
那么我們可以通過 MaxUBOSize : 65536 除以單個 mat4 需要的字節(jié)(64字節(jié)),就可以知道我們的硬件最大可以給單個 UBO 分配多大的大小:
65536 / 64 = 1024,所以我的硬件是只支持單個 UBO 最多 1024個 mat4 的大小,也就是 64 KB 的大小
OK,我測試后,1024 個實例化是沒有 shader 編譯錯誤問題的
那么為了測試,我改為 1025 個后,也出現(xiàn)了上面的大小限制的問題了
上面的示例中,只是在 UBO 中使用了一個 mat4 的屬性,如果還有其他的顏色,或是其他的屬性,那么 UBO 的大小限制很快就成為最大的問題的
那么 UBO 的方式限制這么大,我們在一些場景中的繪制實例數(shù)量會大大超過這個數(shù)量,有些甚至到達(dá) 10萬個,或以上
除了 UBO 大小之外,不知道大家沒有發(fā)現(xiàn),這種方式,還需要對 glsl Shader 層的 UBO指定固定大小
使用起來很不方便,這個數(shù)量很大時候取決于應(yīng)用層的實例數(shù)量而動態(tài)變化大小的,雖然可以將 UBO 設(shè)置大些,但 UBO 大小本身有限制,而且不同硬件限制大小還不一樣,如,我這個筆記本,1024 個 mat4 的大小(64KB)就到頂了
所以使用 UBO 的方式限制問題還是很大的。
總結(jié)
以上是生活随笔為你收集整理的OpenGL中的Uniform block size 的大小限制的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 新加坡a50指数
- 下一篇: OPenGL实例化绘制、普通绘制说明