类型
GskGLShader
说明 [源代码]
final class Gsk.GLShader : GObject.Object
{
/* No available fields */
}
GskGLShader
是 GLSL 代码段,该代码段旨在在渲染管线的片段着色器中运行。
片段着色器获取作为输入的要渲染的坐标,为特定像素生成像素值。此外,着色器可以声明一组其他输入参数,称为统一值(因为它们在每次使用实例的所有对您着色器的调用中都是统一的)。着色器还可以接收最多 4 个纹理,这些纹理可在生成像素数据时用作输入。
GskGLShader
通常与 gtk_snapshot_push_gl_shader()
一起使用,在渲染层级中生成 GskGLShaderNode
,然后通过在渲染着色器节点本身之前将子节点渲染到纹理中来构建其输入纹理。(如果您想直接使用纹理作为输入,则可以传递纹理节点作为子节点)。
实际着色器代码是 GLSL 代码,该代码与一些其他代码合并到片段着色器中。由于 GPU 驱动程序的确切功能因不同的 OpenGL 驱动程序和硬件而异,GTK 添加了一些定义,您可以使用这些定义来确保您的 GLSL 代码在尽可能多的驱动程序上运行。
如果 OpenGL 驱动程序是 GLES,则着色器语言版本将设置为 100,并且 GSK_GLES 将在着色器中定义。
否则,如果 OpenGL 驱动程序不支持 3.2 核心配置文件,则对于 GL2,着色器将使用语言版本 110,对于 GL3,着色器将使用语言版本 130,并且 GSK_LEGACY 将在着色器中定义。
如果 OpenGL 驱动程序支持 3.2 代码配置文件,则该驱动程序将被使用,着色器语言版本设置为 150,并且 GSK_GL3 将在着色器中定义。
着色器必须实现的主要函数是
void mainImage(out vec4 fragColor,
in vec2 fragCoord,
in vec2 resolution,
in vec2 uv)
input fragCoord
是相对于在 GskGLShaderNode
中指定的边界矩形当前渲染的象素坐标,并且 resolution
是该矩形的宽度和高度。这是典型的 GTK 坐标系统,原点在左上角。uv
包含用于在对应点索引纹理的 u 和 v 坐标。这些坐标位于 [0..1]x[0..1] 区域,0, 0 位于左下角(这是 OpenGL 的典型值)。
输出 fragColor
应该是一个 RGBA 颜色(具有预乘 Alpha),它将用作指定像素位置的输出。请注意,此输出将自动裁剪为 glshader 节点的剪辑区域。
除了函数参数外,着色器最多可以为应称为 u_textureN(即 u_texture1 到 u_texture4)的纹理定义 4 个纹理,以及任何您希望拥有的类型为 int、uint、bool、float、vec2、vec3 或 vec4 的自定义纹理。
所有纹理源都包含预乘 Alpha 颜色,但如果存在颜色外部源,则使用 gsk_premultiply()
帮助器来在需要时计算预乘。
请注意,GTK 会解析纹理声明,因此每个纹理必须单独放置一行,且不带有其他代码,如同这样
uniform float u_time;
uniform vec3 u_color;
uniform sampler2D u_texture1;
uniform sampler2D u_texture2;
GTK 在着色器中使用的符号中使用“gsk”命名空间,因此您的代码不应该使用任何前缀为 gsk 或 GSK 的符号。这里声明了一些您可以使用的帮助器函数
vec4 GskTexture(sampler2D sampler, vec2 texCoords);
这会对指定坐标处的一个纹理(例如 u_texture1)进行采样,并且包含一些帮助器 ifdef,以确保这适用于所有 OpenGL 版本。
您可以使用 gsk_gl_shader_compile()
自行编译着色器,否则 GSK 渲染器将在处理 glshader 节点时执行此操作。如果发生错误,返回的 error
将包含 glsl 源代码,因此您可以查看 GSK 传递给编译器的内容。您还可以在环境中设置 GSK_DEBUG=shaders,以查看 GSK 正在处理的所有着色器的源代码和其他相关信息。
着色器示例
uniform float position;
uniform sampler2D u_texture1;
uniform sampler2D u_texture2;
void mainImage(out vec4 fragColor,
in vec2 fragCoord,
in vec2 resolution,
in vec2 uv) {
vec4 source1 = GskTexture(u_texture1, uv);
vec4 source2 = GskTexture(u_texture2, uv);
fragColor = position * source1 + (1.0 - position) * source2;
}
废弃声明
由于 4.14 中引入的新渲染基础架构不支持此功能,因此在 GTK 4.16 中废弃此功能。缺乏 Vulkan 集成会让此功能难以支持。
如果您想直接使用 OpenGL,您应该查看 GtkGLArea,它使用不同的方法并且仍然得到很好的支持。
信号
从 GObject (1) 继承的信号
GObject::notify
当一个对象的一个属性通过 g_object_set_property()、g_object_set() 等设置其值时,对象上发出 notify 信号。