godot opengl的一些特性,方便封装
就看这个

这里的本质就是,在devicer上面按照format标注的格式,在texture_view里面创建一个texturebuffer,把write_data的数据拷贝进去。
拷贝进去返回的结果,一个ID。

一个在管理内存指针的的ID,就算返回device的指针,cpu也去读不到,只是opencl和cuda把这些功能封装了。
这时候数据已经上传过去了。
在device中可以访问,不然我穿过去干嘛。
我拿到这个ID,如果想要local访问,当然要标注一下。 usage_copy_from this
在device 和 local 互通的时候需要走PCIE,这时候创建uniform不仅仅会在会在PCIE上面分配一条路,这条路肯定会告知数据大小。
当然我们不需要那么多操作,只需要说明:

申请uniform的时候就在硬件完成很多基础指令了。
接下来要告诉device,这是一个IMAGE类型的,他是rbga32还是rg8也不知道。
然后绑定到set.binding = 1 ,unifrom.set = 1
这时候就知道数据的大小和分割方式以及传递的类型了

我们得到这个消息会怎么样。
1、uniform 初始化后再local就可以释放掉了
2、texture view 只要没有需要继续绑定的texture buffer 也可以在local释放。
那么我怎么给uniform 传递数据呢。
传递数据先传递 data过去,再绑定uniform,uniform再绑定到set里面。
也就是先把数据放过去,再说这个是在哪个uniform,哪个set里面。
这样的话,uniform 每次都要重新申请一次。gl会自动帮我们覆盖福偶去的指针,释放掉指针被抛弃的内容。
如下图来自 光追https://github.com/nekotogd/Raytracing_Godot4/blob/master/BasicComputeShader/ray_tracer_simple.gd


外加上 godot 需要用 Packed float Array保存数据,再用to_byte_array()转换数据,在传递。我们就可以写到一起。
以后也方便复制。
我们精简 把lifegame的代码重新整合一下。

这样在外面之需要1行就好了。
1、关于img的操作,read_data,这个数组,我推荐放在外面,可以进行其他操作。c++中,malloc保存就就是byte,如果不重置的话,读取就要指针选择范围。所以不存在这里get_data,而且这里的img.get_data本身就是byte类型的vector。
如果是其他类型就要
var params : PackedByteArray = PackedFloat32Array([global_time]).to_byte_array()
转化一下
2、format用完就丢,其中只需要修改usage_bites
3、上传数据,这里texture_read,一定要改成全局的。
4、uniform,用完就丢,一帧用一次,如果不更新,可以永久用,也得丢。他返回后给set注册一下,也就丢了。
5、set也全局变量。
同理,read_texture也是一样的操作。

再把其他的也套壳

这样的话就简单多了

我们再把compute和update分开

这样就方便未来魔改了。

链接:https://pan.baidu.com/s/1wP0yTXflxiKp0SiIDRf2_A?pwd=9897
提取码:9897
我在国内用github
有一些我是人的 id 。减少开盒的可能性。