godot computer shader 的简单原理
emmm,我这辈子用过最麻烦的玩意儿就是opengl。只要有了它,简单的代码,也会变得恶心的要死要死的。当然自己封装就更麻烦了,如果可以不用它,那就最好不用。
如果要在opencl 和 cuda 中要传一头大象。那太简单了。
1、准备一头大象
2、告诉gpu我要给一头大象,有30吨。
3、把大象扔过去。
如果是global,那我想看就看。
如果是device,那就我看不到了,不过但是还可以device to device 复制。
甚至还可以device to local 复制回来。
要在opengl中,想起都恶心。
1、准备一头大象
2、准备一个名片装用来指向保存后的大象的位置
(常见的 uint VAO,VBO,EBO,FBO,不是我来设计的,而是opengl分配后会自动修改这里面的值,而且这个值在本地基本没用)
3、告诉gpu我要给一头大象,有30吨,并把准备好的名片让opengl填位置。
4、告知这个大象必须放在opengl编号3的仓库,我之后会专门访问。

这个单号还用set绑定一下,才能再使用

到时他的layout(set = 0,binding = 3) 就可以访问params_uniform的数据了,这里只是传入了一个time诶,就是要这样。
如果大家有幸使用过opengl,uniform都比他简单。
当然不要以为这样就是他的极限了

fmt:format,要生成一个格式信息,这个format要保存长宽,数据类型、已经这个数据可以怎么用,可以更新的、可以用来存储的、比特形式传入(copy_from_bity)
我不知道一般人会不会有疑问,随便一个int 难道不能保存?难道不能更新?这已经到了脱裤子放屁的最高境界了。
这就是opengl,如果是一般人,我不推荐用这东东,opencl的入门门槛比这个低一大截,可以说opencl没有门槛。
总结来说:
_on_GPU_ float* p = new float[30]();
p.copy_bity_from(base_data_form_CPU);
数组p就是指向float[30]的首地址,和他的unifrom存储的一个意思。
里面最重要的应该就是 uniform_type_image,说明这东东是image。(这里的image在godot中叫texture)
参考:https://github.com/nekotogd/Raytracing_Godot4/blob/master/BasicComputeShader/ray_tracer_simple.gd
总结:如果这东西难度为2,麻烦程度10;opencl的难度为3,麻烦程度为1;