Ich habe mal wieder etwas rumgehackt und dabei ist eine kleine Software-Rendering-Library rausgefallen: Basic3D
An Features habe ich schon implementiert:
Irwin3D
Ein Raycaster, der im Moment einfache Line Lists rendert und keine Höhenunterscheidung kann (sieht also aus wie Wolfenstein3D):
Violent3D
Ein Rasterizer, der vortransformierte Polygone auf den Bildschirm malt und dabei einen Tiefenbuffer verwendet, ganz klassisch langweilig also:
Das Ziel des ganzen ist es, mir ein Framework zu bauen, mit dem ich (in einem noch "geheimen" Projekt) dann angemessene 3D-Grafik habe.
Worauf ich bei der Entwicklung geachtet habe, ist die Austauschbarkeit einiger Datentypen sowie die Vermeidung von dynamischer Speicherverwaltung. Das hat den Nachteil, dass alle Klassen schon zu Compilezeit wissen müssen, wie groß ihr späterer Framebuffer sein muss, dafür habe ich kein einziges malloc oder new in meinem Code.
Den Code gibts wie üblich bei GitHub: https://github.com/MasterQ32/Basic3D
Freue mich über Anmerkungen und Kommentare, noch geiler wärs natürlich, wenn jemand was damit bastelt ;)
Updates kommen hoffentlich auch noch welche, vorallem für den Rasterizer, der ist grade noch etwas langsam.
Liebe Grüße
Felix
PS.: Ach ja, Codebeispiele!
Code: Alles auswählen
Image<320, 240> image;
image.clear(0x00, 0x00, 0x80);
Renderer<320, 240> renderer(image);
// setup a material for rendering with color
Material mtlWhite = { pixel_t(0xFF, 0xFF, 0xFF), nullptr };
renderer.Material = &mtlWhite;
// rasterize the quad
std::array<Vertex<fixed>, 4> vertices
{
Vertex<fixed> { Vector3<fixed>(16, 16, 0.5), Vector2<fixed>(0, 0) },
Vertex<fixed> { Vector3<fixed>(16, 48, 0.5), Vector2<fixed>(0, 1) },
Vertex<fixed> { Vector3<fixed>(48, 16, 0.5), Vector2<fixed>(1, 0) },
Vertex<fixed> { Vector3<fixed>(48, 48, 0.5), Vector2<fixed>(1, 1) },
};
renderer.drawTriangle(vertices[0], vertices[1], vertices[2]);
renderer.drawTriangle(vertices[2], vertices[1], vertices[3]);