欢迎光临散文网 会员登陆 & 注册

godot opengl的一些特性,方便封装

2023-06-02 14:35 作者:damedown  | 我要投稿

就看这个


这里的本质就是,在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

这时候就知道数据的大小和分割方式以及传递的类型了

在glsl里面的layout标注了


我们得到这个消息会怎么样。

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分开

这样就方便未来魔改了。

我们的ready 和 process 就很清晰了

链接:https://pan.baidu.com/s/1wP0yTXflxiKp0SiIDRf2_A?pwd=9897 

提取码:9897


我在国内用github

有一些我是人的 id 。减少开盒的可能性。

godot opengl的一些特性,方便封装的评论 (共 条)

分享到微博请遵守国家法律