1
0
Fork 0
mirror of https://git.coom.tech/drummyfish/small3dlib.git synced 2024-11-21 20:39:57 +01:00
small3dlib/README.md

51 lines
3.1 KiB
Markdown
Raw Normal View History

2019-06-22 00:06:40 +02:00
# WIP, NOT WORKABLE YET!
# small3dlib
3D software rasterizer for (not only) resource-limited computers.
2019-06-22 00:24:52 +02:00
If you like this, you may also like my similar project: [raycastlib](https://gitlab.com/drummyfish/raycastlib).
## eye-candy previews
TODO
## features
- Very fast, small and efficient.
- Uses only integer math (32bit).
- No dependencies (uses only stdint standard library), extremely portable.
- Single header, KISS.
- Pure C99, tested to run as C++ as well.
2019-06-22 04:00:14 +02:00
- Still flexible -- pixels are left for you to draw in any way you want with a custom fragment-shader like function.
- Perspective correction, 3 modes: none (linear only), full (per-pixel), approximation (per-N-pixels).
- Different drawing strategies to choose from: none, z-buffer (none, full, reduced), triangle sorting (back-to-front, fron-to-back with stencil buffer).
2019-06-22 22:04:14 +02:00
- Triangles provide barycentric coordinates, thanks to which practically anything that can be achieved with OpenGL can be achieved (texturing, shading, normal-mapping, texture fitering, transparency, PBR, shadow mapping, MIP mapping, ...).
2019-06-22 15:45:59 +02:00
- Tested on multiple platforms (TODO).
2019-06-22 00:24:52 +02:00
- Many compile-time options to tune the performance vs quality.
2019-06-24 02:20:58 +02:00
- Similar to OpenGL in principle, but simpler, easier to use, with higher-level features.
2019-06-22 00:24:52 +02:00
- Well commented and formatted code.
2019-06-22 15:45:59 +02:00
- Completely free of legal restrictions, do literally anything you want.
**NOTE**: Backwards compatibility isn't a goal of this libraray. It is meant to
be an as-is set of tools that the users is welcome to adjust for their
specific project. So new features will be preferred to keeping the same
interface.
2019-06-22 00:24:52 +02:00
## limitations
2019-06-22 14:27:06 +02:00
- Some values, like screen resolution, are a compile-time option due to performance and simplicity, and can't change during runtime.
2019-06-22 15:39:00 +02:00
- No scenegraph (object parenting), just a scene list. Parenting can still be achieved by using cutom transform matrices.
2019-06-22 00:24:52 +02:00
- Though performance is high, due to multiplatformness it can't match platform-specific rasterizers written in assembly.
- Proper near-plane culling (subdividing triangles) is missing. You can either cull whole triangles completely or "push" them by the near plane. These options are okay when drawing a models not very close to the camera, but e.g. 3D environments may suffer from artifacts.
2019-06-22 15:43:33 +02:00
- Due to the limitations of 32bit integer arithmetics, some types of movement (particularly camera) may look jerky, and artifact may appear in specific situations.
2019-06-22 00:24:52 +02:00
## how to use
TODO
2019-06-22 04:00:14 +02:00
## tips/troubleshooting
2019-06-22 00:24:52 +02:00
2019-06-22 15:39:00 +02:00
- Seeing buggy triangles flashing in front of the camera? With the limited 32bit arithmetic far-away things may be overflowing. Try to scale down the scene. If you also don't mind it, set `S3L_STRICT_NEAR_CULLING` to `1` -- this should probably solve it.
2019-06-22 15:48:22 +02:00
- Seeing triangles disappear randomly in sorted modes? This is because the size of the memory for triangle sorting is limited by default -- increase `S3L_MAX_TRIANGLES_DRAWN`.
2019-06-22 15:39:00 +02:00
- Sorted mode sorts triangles before drawing, but sometimes you need to control the drawing order more precisely. This can be done by reordering the objects in the scene list or rendering the scene multiple times without clearing the screen.