GTK 3.99.2

GTK 3.99.2 版本延续了 3.99.1 的主题:API 清理、新的和改进的演示、更好的文档。您可以在这里查看详细信息。

关于文档的一个小提示是,我们依赖于一些未发布的 gtk-doc 功能。因此,我们现在将 gtk-doc 作为子项目包含在 gtk 发布 tarball 中。如果您是发行商,请不要惊讶于构建 GTK 现在会安装 gtk-doc 工具。

此快照中的重大新闻是我们更多地展示了新的基于 GL 的渲染堆栈的强大功能。

预热:Shadertoy

gtk4-demo 现在包含一个 Shadertoy 演示。

该演示使用 GtkGLArea 小部件运行与 shadertoy.com 上找到的兼容的 GLSL 代码片段。如果您将示例粘贴到此演示的编辑器中,那里的许多示例都将起作用。

这很有趣,但有些受限。GLSL 被限制在其“沙箱”,即 GtkGLArea 小部件中,该小部件使用 GL API 来编译和使用着色器。

着色器作为一等对象

这不是我们第一次尝试制作一个类似 Shadertoy 的东西。当我们第一次研究它时,我们认为我们将制作一个应用程序可以使用的着色器抽象。当发现要使其跨不同的渲染器和后端工作需要我们编写自己的着色器编译器时,我们将其搁置了——工作量太大。

但在我们 Shadertoy 成功之后,我们重新审视了将着色器作为一等对象的想法,目标更加适度:我们使用 GLSL,并且不尝试使着色器与 OpenGL 渲染器之外的任何东西一起工作。

在 3.99.2 中,我们现在有了

有了这些组件,我们制作了一个演示,展示了着色器的各种用途。它可能有点超载,有些效果有点过分,但它说明了重点:您可以在小部件中使用着色器。

 

我们尚未做的是添加内置着色器支持的小部件。该演示展示了一些可能的候选者

一个着色器可绘制对象。正如您可能回忆的那样,GdkPaintable 是一个非常灵活的接口,适用于任何可以“绘制”的东西。着色器当然符合条件。gtk-demo 中的 GskShaderPaintable 使用一个没有输入纹理的着色器来仅生成像素,我们将其添加到 GtkPicture 小部件以使其显示在小部件树中。

一个着色器容器。这是一个非常简单的容器,可以使用着色器在子小部件之上绘制效果。它适用于采用单个输入纹理(用于子小部件)的着色器。

一个着色器堆栈。这是一个类似堆栈的容器,显示许多子小部件中的一个,并在可见子小部件更改时使用着色器进行过渡。它适用于需要两个输入纹理(用于旧的和新的活动子项)的着色器。

值得庆幸的是,在 GTK 4 中制作自定义小部件比以前容易得多,因此渲染节点 API 应该足以让您开始一些有趣的实验。您当然可以以 gtk4-demo 代码为起点。

您可以调试它

除了小部件之外,着色器支持是完全集成的。GTK 检查器可以像处理任何其他渲染节点一样处理着色器节点,您可以序列化它们,例如,在 gtk4-node-editor 中加载结果文件

如果您需要查看 GTK 发送到着色器编译器的输入,设置环境变量

GDK_DEBUG=shaders

可能会有所帮助。

下一步是什么?

在这次 GL 冒险之后,我们现在将专注于实现更多新的辅助功能基础设施。