日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

OpenGL中的Uniform block size 的大小限制

發(fā)布時間:2023/12/15 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 OpenGL中的Uniform block size 的大小限制 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

我們繪制了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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。