godot opengl的一些特性,方便封裝
就看這個(gè)

這里的本質(zhì)就是,在devicer上面按照f(shuō)ormat標(biāo)注的格式,在texture_view里面創(chuàng)建一個(gè)texturebuffer,把write_data的數(shù)據(jù)拷貝進(jìn)去。
拷貝進(jìn)去返回的結(jié)果,一個(gè)ID。

一個(gè)在管理內(nèi)存指針的的ID,就算返回device的指針,cpu也去讀不到,只是opencl和cuda把這些功能封裝了。
這時(shí)候數(shù)據(jù)已經(jīng)上傳過(guò)去了。
在device中可以訪問(wèn),不然我穿過(guò)去干嘛。
我拿到這個(gè)ID,如果想要local訪問(wèn),當(dāng)然要標(biāo)注一下。 usage_copy_from this
在device 和 local 互通的時(shí)候需要走PCIE,這時(shí)候創(chuàng)建uniform不僅僅會(huì)在會(huì)在PCIE上面分配一條路,這條路肯定會(huì)告知數(shù)據(jù)大小。
當(dāng)然我們不需要那么多操作,只需要說(shuō)明:

申請(qǐng)uniform的時(shí)候就在硬件完成很多基礎(chǔ)指令了。
接下來(lái)要告訴device,這是一個(gè)IMAGE類型的,他是rbga32還是rg8也不知道。
然后綁定到set.binding = 1 ,unifrom.set = 1
這時(shí)候就知道數(shù)據(jù)的大小和分割方式以及傳遞的類型了

我們得到這個(gè)消息會(huì)怎么樣。
1、uniform 初始化后再local就可以釋放掉了
2、texture view 只要沒(méi)有需要繼續(xù)綁定的texture buffer 也可以在local釋放。
那么我怎么給uniform 傳遞數(shù)據(jù)呢。
傳遞數(shù)據(jù)先傳遞 data過(guò)去,再綁定uniform,uniform再綁定到set里面。
也就是先把數(shù)據(jù)放過(guò)去,再說(shuō)這個(gè)是在哪個(gè)uniform,哪個(gè)set里面。
這樣的話,uniform?每次都要重新申請(qǐng)一次。gl會(huì)自動(dòng)幫我們覆蓋福偶去的指針,釋放掉指針被拋棄的內(nèi)容。
如下圖來(lái)自 光追https://github.com/nekotogd/Raytracing_Godot4/blob/master/BasicComputeShader/ray_tracer_simple.gd


外加上 godot 需要用 Packed float Array保存數(shù)據(jù),再用to_byte_array()轉(zhuǎn)換數(shù)據(jù),在傳遞。我們就可以寫到一起。
以后也方便復(fù)制。
我們精簡(jiǎn) 把lifegame的代碼重新整合一下。

這樣在外面之需要1行就好了。
1、關(guān)于img的操作,read_data,這個(gè)數(shù)組,我推薦放在外面,可以進(jìn)行其他操作。c++中,malloc保存就就是byte,如果不重置的話,讀取就要指針選擇范圍。所以不存在這里get_data,而且這里的img.get_data本身就是byte類型的vector。
如果是其他類型就要
var params : PackedByteArray = PackedFloat32Array([global_time]).to_byte_array()
轉(zhuǎn)化一下
2、format用完就丟,其中只需要修改usage_bites
3、上傳數(shù)據(jù),這里texture_read,一定要改成全局的。
4、uniform,用完就丟,一幀用一次,如果不更新,可以永久用,也得丟。他返回后給set注冊(cè)一下,也就丟了。
5、set也全局變量。
同理,read_texture也是一樣的操作。

再把其他的也套殼

這樣的話就簡(jiǎn)單多了

我們?cè)侔裞ompute和update分開

這樣就方便未來(lái)魔改了。

鏈接:https://pan.baidu.com/s/1wP0yTXflxiKp0SiIDRf2_A?pwd=9897?
提取碼:9897
我在國(guó)內(nèi)用github
有一些我是人的 id 。減少開盒的可能性。