Arcade’s Graphics Layer
The arcade.gl
module is a “graphics layer” around platform-specific backends.
This module is meant to provide advanced users with:
a pluggable backend API for porting to new platforms
consistent abstractions of low-level graphics primitives
avoiding common pitfalls graphics programming
Using This Module
This module does not aim to be a perfect copy of any other graphics API.
Warning
This module assumes you are familiar with low-level graphics programming!
Instead, it takes inspiration from ModernGL to build on pyglet.gl
with more ctypes
bindings.
The low-level API primitives and their reference implementation include:
Primitive |
Base ( |
OpenGL Reference Subclass ( |
---|---|---|
GPU programs (shaders) |
|
|
low-level texture objects [2] |
|
|
framebuffers |
|
|
queries |
|
|
buffers |
|
|
vertex arrays/geometry |
|
|
Compute shaders [1] |
|
|
Usage Reference
Reference Backend |
|
Abstraction examples |
See the experimental examples folder in the GitHub repo |
Graphics API Gotchas
No Computer Shaders On Mac
This limitation is due to how macOS handles OpenGL.
Compute shaders became a core OpenGL feature in 4.3. However, Apple froze OpenGL for macOS as a maintenance-only API at OpenGL 4.1 on both Intel and M-series Macs. As a result, there are no compute shaders on Mac.
Alternatives
Clever use of fragments shaders and framebuffer objects (FBOs) can sometimes provide equivalent results for specific cases. Since WebGL also lacks compute shaders, older WebGL code can be a useful reference for implementing Mac-compatible compute functionality within OpenGL.
Two Texture Types?
This module includes low-level and platform-specific classes.
Most users will want to use the high-lever arcade.Texture
class. If you are still unsure, consult the table below:
Module |
Target Audience |
Contents |
|
Everyday users |
Friendly texture object suitable for implementing gameplay |
|
Platform-specific internals |
Low-level abstractions which handle platform-specific behavior for:
|
Supported Backends
Current Backends
OpenGL Backend
The current implemented backend is the OpenGL/GLES wrapper in arcade.gl.backends.opengl
.
To maximize hardware support, it requires at least one of the following:
OpenGL 3.3+
GLES with certain extensions
It avoids binary dependencies by using Python’s built-in ctypes
module via both pyglet
and Arcade’s added OpenGL bindings.
This ensures Arcade can run on most desktop and laptop hardware from the past
decade, just like pyglet
. This portability trades away a bit of speed
and context-handling flexibility compared to ModernGL.
Future Backends
Web
Web browser support is an ongoing effort.
The current plan is to implement a WebGPU backend running locally in-browser via pyodide. This will ensure better performance and feature parity with desktop environments compared to the archived arcade-web protoype.
Adding Backends
A new backend requires adding a submodule in arcade.gl.backends
which handles any initialization tasks to implement the following:
concreted versions of the classes in Using This Module
exposes a concrete implementation of
BaseProvider
Note that all resources are created through the
arcade.gl.Context
/ arcade.ArcadeContext
.
An instance of this type should be accessible the window
(arcade.Window.ctx
).
This API can also be used with pyglet by creating an instance
of arcade.gl.Context
after the window creation.
The arcade.ArcadeContext
on the other hand
extends the default Context with Arcade-specific helper methods
and should only be used by arcade.