Giter VIP home page Giter VIP logo

copengl's Introduction

cOpenGL

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

Binaries

See Releases.

Also uploaded on Google Drive.

Features

Implemented

  • 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.

Not implemented

  • 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.

YouTube Demo

Demo YouTube

Benchmark

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

Known hardware issues

  • 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 any n>0. For some reason, stmpe811_ReadID() returns 0 instead of 0x0811.

Similar projects

  • 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).

copengl's People

Contributors

dizcza avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

Forkers

masterlivens

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.