C implementation of OpenGL basics for ARM CPU devices with an example for STM32F429 Discovery board.
The library relies on linmath.h that provides a simple implementation of matrix manipulations in 3D graphics. In order to install linmath, run
git clone https://github.com/dizcza/cOpenGL.git --recursive
See Releases.
Also uploaded on Google Drive.
- The depth buffer is used to solve the visibility problem (hidden 3D objects are not drawn).
- Can draw any object as long as its polygon mesh is provided (vertices positions and colors are required).
- Fast framebuffer clear (both color and depth) using DMA, which is called on each redraw of a 3D scene.
- Barycentric coordinates for smooth color interpolation between vertices.
- Ray tracing.
- Lighting and shadows.
- Textures.
- Antialiasing.
The basis function is
void FrameBuffer_ProjectTrian4(FrameBuffer* frame, trian4 trian, vec3uint32 vcolors, mat4x4 mvp);
that projects an arbitrary 3D triangle onto the screen.
Note. This project is educational: the aim is to show how to implement OpenGL basics from scratch. Be aware of the performance issues (see benchamrk below) before using the library.
Benhmark is measured by FPS (frames per second) on the scene with 3 cubes for different optimization flags with asserts turned off.
Checkpoint | -O0 | -Os | -O1 | -O2 | -O3 |
---|---|---|---|---|---|
Apr 18, 2017 | 1.25 | 5.38 | 6.10 | 7.81 | 8.48 |
- Touchscreen is not working in interruption mode (
BSP_TS_IT*
). - Touchscreen refuses to initialize after a few hardware resets, if compiled with optimization flag
-On
for anyn>0
. For some reason,stmpe811_ReadID()
returns0
instead of0x0811
.
- ST7735 is another port of OpenGL on STM32, using Q1.15 fixed precision float format.
- FGL port on STM32 Discovery board (video).
- arduinogl OpenGL port on Arduino that neglects depth and can draw lines only.
- Doom ports:
- stm32doom: not OpenGL, and not even 3D (it's 2.5D), but highly optimized;
- esp32-doom and video (don't know the details).