Interactive real time rasterizer written from scratch in C or in C++ which run on the CPU:

Mesh Shaders and Pixel Shaders are written in C or in C++

Whole object frustum culling is provided through a mesh shader using axis aligned bounding boxes

Vertices and triangle are culled against the view frustum and there is optional back-face culling

Vertex attribute are interpolated automatically in both triangle rasterization and view frustum clipping

Texture coordinates are interpolated using perspective corrected barycentric coordinates

Texture filtering and sampling is done in software using tangent-space derivatives for adaptive mip-level selection

Normal map are supported in pixel shaders

A 64bit depth buffer is used for properly ordered drawing per-pixel

Mesh wireframe can optionally be drawn in the viewport

Scene objects can be transformed using a unified manipulator that uses ray-casting against the selected object's bounding box.

Keyboard and mouse navigation supports both FPS-style navigation and DCC-style for panning zooming and orbiting the camera

Flat surfaces, including individual triangles in a mesh, can have normal vectors at their vertices. SlimRaster interpolates these vectors along the surface of the triangle between the vertices to get a smoother transition of normal directions between and within the triangles.

Normal maps can be used in shading to further add more fine details to flat surfaces by emulating surface perturbation:

Per-pixel interpolated normal directions represent the original orientation of the surface at that pixel. Another normal direction is sampled from a normal map and used to rotate the original normal. The resulting rotated direction is then used in shading as-if it represented the original surface orientation at that pixel.

Normal Maps:

Interpolation / Clipping:

Triangles vertices have extra attributes in addition to just position, such as texture coordinates and normal directions. SlimRaster interpolates these attributes between the vertices along the surface of the triangles to produce per-pixel values for them for use in shading.

But it also need to clip triangles when they get too close to the camera, and in so doing it may generate additional new triangles and vertices in new places. It may also need to "slide" existing vertices along their edge, further away from the camera back to the closest distance.

To preserve the integrity of vertex attributes, this clipping process interpolates new vertex attribute values for the new vertices and for vertices that have had to be moved.