折腾Compositor有感

2024-03-26

折腾了一晚上Compositor,有感而发。

先前了解了戈多新实现了一个叫做Compositor的东西,似乎与自定义渲染管线有关。后面我了解了更多,学习了一点点图形学知识以后,对这玩意有了更深入的理解。

听群友描述说,Compositor的前身是RenderingEffects, 一开始出现在Bastian写的某个pr里。后期似乎是因为juan在proposal里要求了能修改渲染管线的功能,bastian发现自己的RenderingEffects刚好已经实现了上述功能,于是就拿过来用了。Juan把这个功能命名为CompositorEffects, 意思大概是“可以自行编排的渲染管线”吧。

我自己呢?起初只是为了写一个简单的像素化后处理器(其实论实现难度并不简单),后来接触到稍微深入一点的东西后,了解了一点图形学和渲染相关的知识,然后一路走到了这个鬼地方。

我起初只是编写一些简单的2D 片段着色器,然后开始尝试用顶点着色器来添加动画效果,再后来开始编写3D的基于quad的后处理着色器。我意识到这种后处理效果存在缺陷,于是一路问下来,我最后找到了Compositor:也就是直接对渲染管线动刀。

我开始学习计算着色器,以及如何在GD里调用能够它们。在编写计算着色器和调用计算着色器的过程中,我经常感觉我仿佛是在写C,而不是GDScript这门脚本语言。比起独立的语言,GDS更应该被算是C的一层wrapper。我得手动创建RenderingServer, 手动创建Shader对象、pipeline管线、uniform、uniform set、compute list, 而且和这些资源打交道都得通过RID(一个类似CPP指针的玩意)而不是简单的引用来处理,在析构时你还得手动释放它们的内存!这让我觉得在这种情况下,gds更有点像C了,而不是单纯的脚本语言了。毕竟,这玩意可是连GC都没有,全靠引用计数和手动释放来管理内存的啊。

在某位群友的指点下,结合bastian的那个示例,我总算写出了能用的后处理效果——尽管只是给屏幕上的颜色稍微加深了一点点。这整个过程相当麻烦,以至于我都开始怀念GDShader了(我曾经很讨厌这门着色器语言,后来我觉得它相比于标准GLSL实在是优雅太多了..)。

明天再继续做别的事情吧。

这篇文章只是有感而发,算是往自己的小站里灌垃圾吧。晚安。