Cornell University ECE4760
Polygon Rendering
for 640x480 VGA 16-color
Pi Pico rp2350 (works slowly on 2040)

3D rendering
The code implements vector and matrix operations so that a full geometric transformation sequence produces a triangle list for rendering.  You can specify vertices and face-lists to define objects, and combine them. There are modeling tranforms to move, scale, and rotate objects. After objects are built and positioned, a camera transform converts to 3D camera coordinates, followed by a perspective projection. Back-face culling is implemented and depth ordering is done by painters algorithm, because there is not enough memory for a z-buffer. Clipping is not yet implemented, so scenes have to be conservatively designed to fit in the view volume. Two pixel intensive steps: frame clear, and draw triangle, were accelerated using low-level memset operations to draw horizontal lines.

The code uses s15x16 fixed point for all matrix operations. Since many of the matrices are sparse, a small optimizaiton lets the mulitply macro exit early if either input is zero. The usual vector opeations were implemented: add, subtract, scaler multiply, magnitude, norm, dot product, and cross product. 4x4 homogenous matrix operations implemented: matrix multiply, vector times matrix. Routines to rotate objects, scale, translate, view transform objects, build objects, and combine objects produces a triangle view list which is passed to a depth sorter and rasterizer.

The image below is a frame from animation sequence running at ~30 fps.
About half the draw-time is spent on vertex arithmetic and about half on triangle fill rasterization.

Some of the code (matrix multiply, triangle scan conversion) was copied from a student project:
https://ece4760.github.io/Projects/Fall2023/av522_dy245/index.html
by Alix Virgo and Demian Yutin.

Quicksort is from
https://stackoverflow.com/questions/55976487/get-the-sorted-indices-of-an-array-using-quicksort

SDK 2.0 version (see below for update)
The low level VGA graphics routines were modified to use memset for drawHLine
The changes made to the graphics routines were incorporated into vga_graphics_v2
in May 2025.
Code, Project ZIP

Updated SDK 2.1, protothreads 1.4, vga16 version2 graphics, rp2350
Code, Project Zip


Copyright Cornell University July 30, 2025