[352:14] static extends: object
Generated metadata helpers for GLShader class surfaces.
properties ()
Returns property metadata for
GLShader.
A list.[332:14] static extends: object
Alternate constructors for GLShader. Usage:
GLShaderCtors.<name>(...). The primary constructor lives
directly on GLShader.
newFromResource (string resource_path)
Creates a
GskGLShaderthat will render pixels using the specified code.
resource_path is path to a resource that contains the GLSL sourcecode for the shader.A new GLShader.[70:7] extends: object
Implements a fragment shader using GLSL. A fragment shader gets the
coordinates being rendered as input and produces the pixel values for that
particular pixel. Additionally, the shader can declare a set of other input
arguments, called uniforms (as they are uniform over all the calls to your
shader in each instance of use). A shader can also receive up to 4 textures
that it can use as input when producing the pixel data. GskGLShader is
usually used with gtk_snapshot_push_gl_shader() to produce a
[class@Gsk.GLShaderNode] in the rendering hierarchy, and then its input
textures are constructed by rendering the child nodes to textures before
rendering the shader node itself. (You can pass texture nodes as children if
you want to directly use a texture as input). The actual shader code is GLSL
code that gets combined with some other code into the fragment shader. Since
the exact capabilities of the GPU driver differs between different OpenGL
drivers and hardware, GTK adds some defines that you can use to ensure your
GLSL code runs on as many drivers as it can. If the OpenGL driver is GLES,
then the shader language version is set to 100, and GSK_GLES will be defined
in the shader. Otherwise, if the OpenGL driver does not support the 3.2 core
profile, then the shader will run with language version 110 for GL2 and 130
for GL3, and GSK_LEGACY will be defined in the shader. If the OpenGL driver
supports the 3.2 code profile, it will be used, the shader language version
is set to 150, and GSK_GL3 will be defined in the shader. The main function
the shader must implement is: glsl void mainImage(out vec4 fragColor, in vec2 fragCoord, in vec2 resolution, in vec2 uv) Where the input
@fragCoord is the coordinate of the pixel we're currently rendering, relative
to the boundary rectangle that was specified in the GskGLShaderNode, and
@resolution is the width and height of that rectangle. This is in the typical
GTK coordinate system with the origin in the top left. @uv contains the u and
v coordinates that can be used to index a texture at the corresponding point.
These coordinates are in the [0..1]x[0..1] region, with 0, 0 being in the
lower left corder (which is typical for OpenGL). The output @fragColor should
be a RGBA color (with premultiplied alpha) that will be used as the output
for the specified pixel location. Note that this output will be automatically
clipped to the clip region of the glshader node. In addition to the function
arguments the shader can define up to 4 uniforms for textures which must be
called u_textureN (i.e. u_texture1 to u_texture4) as well as any custom
uniforms you want of types int, uint, bool, float, vec2, vec3 or vec4. All
textures sources contain premultiplied alpha colors, but if some there are
outer sources of colors there is a gsk_premultiply() helper to compute
premultiplication when needed. Note that GTK parses the uniform declarations,
so each uniform has to be on a line by itself with no other code, like so:
u_texture1; uniform sampler2D u_texture2; ``` GTK uses the "gsk" namespace in
the symbols it uses in the shader, so your code should not use any symbols
with the prefix gsk or GSK. There are some helper functions declared that you
can use: ```glsl vec4 GskTexture(sampler2D sampler, vec2 texCoords); ``` This
samples a texture (e.g. u_texture1) at the specified coordinates, and
contains some helper ifdefs to ensure that it works on all OpenGL versions.
You can compile the shader yourself using [method@Gsk.GLShader.compile],
otherwise the GSK renderer will do it when it handling the glshader node. If
errors occurs, the returned @error will include the glsl sources, so you can
see what GSK was passing to the compiler. You can also set GSK_DEBUG=shaders
in the environment to see the sources and other relevant information about
all shaders that GSK is handling. # An example shader ```glsl 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; } ```
#### Members
- **handleObj**
- **lib**
- **retainedCallbacks**
- **signalHandlerNames**
- **signalSetterHandlers**
#### Methods
- **GLShader** (`sourcecode = null`)
> Creates a `GskGLShader` that will render pixels using the specified code.
- **@p** `sourcecode` is GLSL sourcecode for the shader, as a `GBytes`.
- **toNativeHandle** (`Source`)
> Normalizes a constructor argument into a raw pointer carrier. Accepts a raw NativeHandle, a raw NativeBuffer returned from `fn.call(...)`, another generated wrapper exposing `handle()`, or null. Returns null when the argument carries no pointer.
- **@p** `Source` is the raw handle, raw buffer, wrapper, or null.
- **@r** `A` raw pointer carrier or null when no pointer is present.
- **getLib** ()
> Returns the opened native library for this generated wrapper.
- **@r** `The` opened native library.
- **handle** ()
> Returns the wrapped NativeHandle.
- **@r** `The` wrapped NativeHandle.
- **isNull** ()
> Returns true when the wrapped handle is null.
- **@r** `A` bool.
- **describe** ()
> Returns a small string for debugging generated wrappers.
- **@r** `A` string.
- **asObject** ()
> Wraps this handle as `Object`.
- **@r** `A` `Object` object.
- **compile** (`object renderer`)
> Tries to compile the @shader for the given @renderer. If there is a problem, this function returns %FALSE and reports an error. You should use this function before relying on the shader for rendering and use a fallback with a simpler shader or without shaders if it fails. Note that this will modify the rendering state (for example change the current GL context) and requires the renderer to be set up. This means that the widget has to be realized. Commonly you want to call this from the realize signal of a widget, or during widget snapshot.
- **@p** `renderer` is a `GskRenderer`.
- **find\_uniform\_by\_name** (`string name`)
> Looks for a uniform by the name @name, and returns the index of the uniform, or -1 if it was not found.
- **@p** `name` is uniform name.
- **get\_arg\_bool** (`object args, int idx`)
> Gets the value of the uniform @idx in the @args block. The uniform must be of bool type.
- **@p** `args` is uniform arguments.
- **@p** `idx` is index of the uniform.
- **get\_arg\_float** (`object args, int idx`)
> Gets the value of the uniform @idx in the @args block. The uniform must be of float type.
- **@p** `args` is uniform arguments.
- **@p** `idx` is index of the uniform.
- **get\_arg\_vec2** (`object args, int idx, object out_value`)
> Gets the value of the uniform @idx in the @args block. The uniform must be of vec2 type.
- **@p** `args` is uniform arguments.
- **@p** `idx` is index of the uniform.
- **@p** `out_value` is location to store the uniform value in.
- **@r** `None.`
- **get\_arg\_vec3** (`object args, int idx, object out_value`)
> Gets the value of the uniform @idx in the @args block. The uniform must be of vec3 type.
- **@p** `args` is uniform arguments.
- **@p** `idx` is index of the uniform.
- **@p** `out_value` is location to store the uniform value in.
- **@r** `None.`
- **get\_arg\_vec4** (`object args, int idx, object out_value`)
> Gets the value of the uniform @idx in the @args block. The uniform must be of vec4 type.
- **@p** `args` is uniform arguments.
- **@p** `idx` is index of the uniform.
- **@p** `out_value` is location to store set the uniform value in.
- **@r** `None.`
- **get\_args\_size** ()
> Get the size of the data block used to specify arguments for this shader.
- **get\_n\_textures** ()
> Returns the number of textures that the shader requires. This can be used to check that the a passed shader works in your usecase. It is determined by looking at the highest u_textureN value that the shader defines.
- **get\_n\_uniforms** ()
> Get the number of declared uniforms for this shader.
- **get\_resource** ()
> Gets the resource path for the GLSL sourcecode being used to render this shader.
- **get\_source** ()
> Gets the GLSL sourcecode being used to render this shader.
- **get\_uniform\_name** (`int idx`)
> Get the name of the declared uniform for this shader at index @idx.
- **@p** `idx` is index of the uniform.
- **get\_uniform\_offset** (`int idx`)
> Get the offset into the data block where data for this uniforms is stored.
- **@p** `idx` is index of the uniform.
- **get\_uniform\_type** (`int idx`)
> Get the type of the declared uniform for this shader at index @idx.
- **@p** `idx` is index of the uniform.