类型

GskGLShader

说明 [源代码]

final class Gsk.GLShader : GObject.Object
{
  /* No available fields */
}

GskGLShaderGLSL 代码段,该代码段旨在在渲染管线的片段着色器中运行。

片段着色器获取作为输入的要渲染的坐标,为特定像素生成像素值。此外,着色器可以声明一组其他输入参数,称为统一值(因为它们在每次使用实例的所有对您着色器的调用中都是统一的)。着色器还可以接收最多 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,它使用不同的方法并且仍然得到很好的支持。

层次结构

hierarchy this GskGLShader ancestor_0 GObject ancestor_0--this

祖先

构造函数

gsk_gl_shader_new_from_bytes

创建 GskGLShader,它将使用指定代码渲染像素。

已废弃:4.16 

gsk_gl_shader_new_from_resource

创建 GskGLShader,它将使用指定代码渲染像素。

已废弃:4.16 

实例方法

gsk_gl_shader_compile

尝试为给定的 renderer 编译 shader

已废弃:4.16 

gsk_gl_shader_find_uniform_by_name

按名称 name 查找纹理,并返回纹理的索引,如果未找到,则返回 -1。

已废弃:4.16 

gsk_gl_shader_format_args

根据需要格式化统一数据,以将命名的统一值输入到着色器中。

已废弃:4.16 

gsk_gl_shader_format_args_va

根据需要格式化统一数据,以将命名的统一值输入到着色器中。

已废弃:4.16 

gsk_gl_shader_get_arg_bool

获取 args 块中统一 idx 的值。

已废弃:4.16 

gsk_gl_shader_get_arg_float

获取 args 块中统一 idx 的值。

已废弃:4.16 

gsk_gl_shader_get_arg_int

获取 args 块中统一 idx 的值。

已废弃:4.16 

gsk_gl_shader_get_arg_uint

获取 args 块中统一 idx 的值。

已废弃:4.16 

gsk_gl_shader_get_arg_vec2

获取 args 块中统一 idx 的值。

已废弃:4.16 

gsk_gl_shader_get_arg_vec3

获取 args 块中统一 idx 的值。

已废弃:4.16 

gsk_gl_shader_get_arg_vec4

获取 args 块中统一 idx 的值。

已废弃:4.16 

gsk_gl_shader_get_args_size

获取用于为该着色器指定参数的数据块的大小。

已废弃:4.16 

gsk_gl_shader_get_n_textures

返回着色器所需的纹理数。

已废弃:4.16 

gsk_gl_shader_get_n_uniforms

获取该着色器的声明统一变量数。

已废弃:4.16 

gsk_gl_shader_get_resource

获取用于呈现该着色器的 GLSL 源代码的资源路径。

已废弃:4.16 

gsk_gl_shader_get_source

获取用于呈现该着色器的 GLSL 源代码。

已废弃:4.16 

gsk_gl_shader_get_uniform_name

获取索引 idx 处该着色器的声明统一变量的名称。

已废弃:4.16 

gsk_gl_shader_get_uniform_offset

获取数据块中的偏移,其中存储该统一变量的数据。

已废弃:4.16 

gsk_gl_shader_get_uniform_type

获取索引 idx 处该着色器的声明统一变量的类型。

已废弃:4.16 

GObject (43) 继承的方法

请参阅 GObject 以获取方法的完整列表。

属性

Gsk.GLShader:resource

包含着色器源代码的资源。

Gsk.GLShader:source

作为 GBytes 的着色器的源代码。

信号

GObject (1) 继承的信号
GObject::notify

当一个对象的一个属性通过 g_object_set_property()、g_object_set() 等设置其值时,对象上发出 notify 信号。

类结构

struct GskGLShaderClass {
  GObjectClass parent_class;
  
}

无可用描述。

类成员
parent_class: GObjectClass

无可用描述。