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
VertexArray
objects. 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
Program
object.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
Shader
objects. - varyings (list) – A list of varying names.
Returns: Program
object- 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
,Attribute
orVarying
-
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.
Type: int
-
Program.
geometry_output
¶ The geometry output primitive. The GeometryShader’s output primitive if the GeometryShader exists.
Type: int
-
Program.
geometry_vertices
¶ The maximum number of vertices that the geometry shader will output.
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']
)
|