Menu toggle
latest: v0.5.0 GitHub

After you know what to draw through drawables, Egloo needs a GlProgram implementation to control how to draw them. In Android terms, you can think of this as the Paint object that’s used to draw on canvas.

In GLES terms, a GlProgram is exactly an OpenGL program. It accepts input shaders in the constructor and manages the program itself.

A GlProgram can be used to draw one or more drawables using the draw method:

program.draw(glDrawable2, mvpMatrix) // Optional

If not present, the model-view-projection matrix will be considered equal to the drawable’s model matrix. As with most other components, after usage, all programs should be released:


Egloo offers two base program implementations.

Flat program

The simplest program is one that draws the GlDrawable with a flat color. This program is called GlFlatProgram:

val program = GlFlatProgram()

Texture program

The GlTextureProgram program can be used to render textures. To use it, you will need to create a GlTexture first and call program.texture = texture: this will make sure that texture is correctly bound before rendering. See textures to learn about this object.

The texture program has built-in support for:

  • Adapting the texture to the GlDrawable it is being drawn into. This means that the drawable and the texture should have the same aspect ratio to avoid distortion.
  • Apply a matrix transformation to the texture by modifying GlTextureProgram.textureTransform

See the sample below:

val texture = GlTexture()
val program = GlTextureProgram()
program.texture = texture
val surfaceTexture = SurfaceTexture(

// Pass this surfaceTexture to Camera, for example
val camera: android.hardware.Camera = openCamera()

// Now the program texture receives the camera frames
// And we can render them using the program
val rect = GlRect() // Draw the full frame

If, for some reason, you do not want to call program.texture = texture (which gives the program the ownership of the texture), you can still call texture.bind() and texture.unbind() manually:

// Option 1

// Option 2
texture.use {

// Option 3
program.texture = texture

These options are equivalent. Note, however, that when passing the texture to GlTextureProgram, the texture will automatically be released when you call program.release().