Program¶
-
class
moderngl.Program¶ A Program object represents fully processed executable code in the OpenGL Shading Language, for one or more Shader stages.
In ModernGL, a Program object can be assigned to
VertexArrayobjects. The VertexArray object is capable of binding the Program object once theVertexArray.render()orVertexArray.transform()is called.Program objects has no method called
use(), VertexArrays encapsulate this mechanism.A Program object cannot be instantiated directly, it requires a context. Use
Context.program()to create one.Uniform buffers can be bound using
Buffer.bind_to_uniform_block()or can be set individually. For more complex binding yielding higher performance consider usingmoderngl.Scope.
Create¶
-
Context.program(vertex_shader, fragment_shader=None, geometry_shader=None, tess_control_shader=None, tess_evaluation_shader=None, varyings=()) → Program Create a
Programobject.Only linked programs will be returned.
A single shader in the shaders parameter is also accepted. The varyings are only used when a transform program is created.
Parameters: - shaders (list) – A list of
Shaderobjects. - varyings (list) – A list of varying names.
Returns: Programobject- shaders (list) – A list of
Methods¶
-
Program.get(key, default) → Union[Uniform, UniformBlock, Subroutine, Attribute, Varying]¶ Returns a Uniform, UniformBlock, Subroutine, Attribute or Varying.
Parameters: default – This is the value to be returned in case key does not exist. Returns: Uniform,UniformBlock,Subroutine,AttributeorVarying
-
Program.__getitem__(key) → Union[Uniform, UniformBlock, Subroutine, Attribute, Varying]¶ Get a member such as uniforms, uniform blocks, subroutines, attributes and varyings by name.
# Get a uniform uniform = program['color'] # Uniform values can be set on the returned object # or the `__setitem__` shortcut can be used. program['color'].value = 1.0, 1.0, 1.0, 1.0 # Still when writing byte data we need to use the `write()` method program['color'].write(buffer)
-
Program.__setitem__(key, value)¶ Set a value of uniform or uniform block
# Set a vec4 uniform uniform['color'] = 1.0, 1.0, 1.0, 1.0 # Optionally we can store references to a member and set the value directly uniform = program['color'] uniform.value = 1.0, 0.0, 0.0, 0.0 uniform = program['cameraMatrix'] uniform.write(camera_matrix)
-
Program.__iter__() → Generator[str, NoneType, NoneType]¶ Yields the internal members names as strings. This includes all members such as uniforms, attributes etc.
Example:
# Print member information for name in program: member = program[name] print(name, type(member), member)
Output:
vert <class 'moderngl.program_members.attribute.Attribute'> <Attribute: 0> vert_color <class 'moderngl.program_members.attribute.Attribute'> <Attribute: 1> gl_InstanceID <class 'moderngl.program_members.attribute.Attribute'> <Attribute: -1> rotation <class 'moderngl.program_members.uniform.Uniform'> <Uniform: 0> scale <class 'moderngl.program_members.uniform.Uniform'> <Uniform: 1>
We can filter on member type if needed:
for name in prog: member = prog[name] if isinstance(member, moderngl.Uniform): print("Uniform", name, member)
or a less verbose version using dict comprehensions:
uniforms = {name: self.prog[name] for name in self.prog if isinstance(self.prog[name], moderngl.Uniform)} print(uniforms)
Output:
{'rotation': <Uniform: 0>, 'scale': <Uniform: 1>}
-
Program.__eq__(other) → bool¶ Compares two programs opengl names (mglo).
Returns: If the programs have the same opengl name Return type: bool Example:
# True if the internal opengl name is the same program_1 == program_2
-
Program.release()¶ Release the ModernGL object.
Attributes¶
-
Program.geometry_input¶ The geometry input primitive.
The GeometryShader’s input primitive if the GeometryShader exists. The geometry input primitive will be used for validation. (from
layout(input_primitive) in;)This can only be
POINTS,LINES,LINES_ADJACENCY,TRIANGLES,TRIANGLE_ADJACENCY.Type: int
-
Program.geometry_output¶ The geometry output primitive.
The GeometryShader’s output primitive if the GeometryShader exists. This can only be
POINTS,LINE_STRIPandTRIANGLE_STRIP(fromlayout(output_primitive, max_vertices = vert_count) out;)Type: int
-
Program.geometry_vertices¶ The maximum number of vertices that
the geometry shader will output. (from
layout(output_primitive, max_vertices = vert_count) out;)Type: int
-
Program.subroutines¶ The subroutine uniforms.
Type: tuple
-
Program.glo¶ The internal OpenGL object. This values is provided for debug purposes only.
Type: int
-
Program.mglo¶ Internal representation for debug purposes only.
-
Program.extra¶ Any - Attribute for storing user defined objects
-
Program.ctx¶ The context this object belongs to
Examples¶
A simple program designed for rendering
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | my_render_program = ctx.program(
vertex_shader='''
#version 330
in vec2 vert;
void main() {
gl_Position = vec4(vert, 0.0, 1.0);
}
''',
fragment_shader='''
#version 330
out vec4 color;
void main() {
color = vec4(0.3, 0.5, 1.0, 1.0);
}
''',
)
|
A simple program designed for transforming
1 2 3 4 5 6 7 8 9 10 11 12 13 | my_transform_program = ctx.program(
vertex_shader='''
#version 330
in vec4 vert;
out float vert_length;
void main() {
vert_length = length(vert);
}
''',
varyings=['vert_length']
)
|