Sixth 3D - 3D engine
1 General
- This program is free software: released under Creative Commons Zero (CC0) license
- Program author:
- Svjatoslav Agejenko
- Homepage: https://svjatoslav.eu
- Email: mailto://svjatoslav@svjatoslav.eu
- Other software projects hosted at svjatoslav.eu
1.1 Source code
- Download latest snapshot in TAR GZ format
- Browse Git repository online
- Clone Git repository using command:
git clone https://www2.svjatoslav.eu/git/sixth-3d.git
- See JavaDoc.
2 Project description
In software, pure Java realtime 3D rendering engine. With the final goal of becoming a platform for buildng 3D user interfaces and interactive data visualization for project Sixth.
Sixth 3D can be also used as standalone 3D engine in your project.
2.1 Justification for software rendering
3D rendering is done in software, 100% pure Java on CPU. At least for now. Modern CPU cores count keeps growing and therefore rendering by CPU is not as expensive as it used to be for the old single core systems.
CPU rendering performance is already good enough to implement usable 3D UI at sufficient detail level, resolution and frame rate.
Also CPU rendering allows to freely test different rendering and optimization algorithms and retains complete control of every rendered pixel.
2.2 Justification for Java
- It is easy to refactor and experiment with.
- Easy portability and installation. No need to deal with platform specific dependencies.
- It scales well to handle great complexity.
- Allows to implement clever performance optimizations (instead of going for GPU offered brute-force rendering approach).
- No limitations imposed by:
- requirement for decent GPU
- GPU missing features
- GPU missing/incomplete/buggy drivers
- OpenGL specification
- It is fast enough thanks to:
- Java virtual machine just-in-time compiler.
- Growing CPU cores count.
- As a result it is easy to run on various hardware platforms and operating systems.
3 API documentation
- See JavaDoc.
Note: due to a lack of time, there is still big room for improvement on documentation.
So far best resource is to download and explore source code for:
- 3D engine (generated code graphs (generated using JavaInspect))
- For API usage examples, see demos
4 Instructions to embed Sixth-3D in your project
Maven *pom.xml* file snippet:
<dependencies> ... <dependency> <groupId>eu.svjatoslav</groupId> <artifactId>sixth-3d</artifactId> <version>1.1</version> </dependency> ... </dependencies> <repositories> ... <repository> <id>svjatoslav.eu</id> <name>Svjatoslav repository</name> <url>http://www2.svjatoslav.eu/maven/</url> </repository> ... </repositories>
For API usage examples, see demos.
5 TODO features to add
- read this as example, and apply improvements/fixes where applicable: http://blog.rogach.org/2015/08/how-to-create-your-own-simple-3d-render.html
- Partial region/frame repaint: when only one small object changed on the scene, it would be faster to re-render that specific area.
- Once partial rendering works, in would be easy to add multi-core rendering support. So that each core renders it's own region of the screen.
- Antialiazing. Would improve text readability. If antialiazing is too expensive for every frame, it could be used only for last frame before animations become still and waiting for user input starts.
5.1 Render only visible polygons
- This would significantly reduce RAM <-> CPU traffic.
- General algorithm description:
- For each horizontal scanline:
- sort polygon edges from left to right
- while iterating and drawing pixels over screen X axis (left to
right) track next appearing/disappearing polygons.
- For each polygon edge update Z sorted active polygons list.
- Only draw pixel from the top-most polygon.
- Only if polygon area is transparent/half-transparent add colors from the polygons below.
- For each horizontal scanline:
- As a bonus, this would allow to track which polygons are really
visible in the final scene for each frame.
- Such information allows further optimizations:
- Dynamic geometry simplification:
- Dynamically detect and replace invisible objects from the scene with simplified bounding box.
- Dynamically replace boudnig box with actual object once it becomes visible.
- Dynamically unload unused textures from RAM.
- Dynamic geometry simplification:
- Such information allows further optimizations: