git clone https://github.com/ssloy/tinyrenderer.git &&
cd tinyrenderer &&
mkdir build &&
cd build &&
cmake .. &&
cmake --build . -j &&
./tinyrenderer ../obj/diablo3_pose/diablo3_pose.obj ../obj/floor.obj
Das gerenderte Bild wird in framebuffer.tga
gespeichert.
Sie können das Projekt in Gitpod öffnen, einer kostenlosen Online-Entwicklungsumgebung für GitHub:
Beim Öffnen kompiliert der Editor das Programm, führt es aus und öffnet das resultierende Bild in der Vorschau des Editors. Ändern Sie einfach den Code im Editor und führen Sie das Skript erneut aus (verwenden Sie den Verlauf des Terminals), um aktualisierte Bilder anzuzeigen.
Mein Quellcode ist irrelevant. Lesen Sie das Wiki und implementieren Sie Ihren eigenen Renderer. Erst wenn Sie alle kleinen Details durchgehen, werden Sie erfahren, was vor sich geht.
In dieser Artikelserie möchte ich zeigen, wie OpenGL funktioniert, indem ich seinen Klon (einen stark vereinfachten) schreibe. Überraschenderweise treffe ich oft auf Leute, die die anfängliche Hürde, OpenGL / DirectX zu lernen, nicht überwinden können. Deshalb habe ich eine kurze Vorlesungsreihe vorbereitet, nach der meine Studenten recht gute Renderer zeigen.
Die Aufgabe ist also wie folgt formuliert: Ohne Bibliotheken von Drittanbietern (insbesondere Grafikbibliotheken) etwa dieses Bild zu erhalten:
Warnung: Dies ist ein Schulungsmaterial, das die Struktur der OpenGL-Bibliothek lose wiederholt. Es wird ein Software-Renderer sein. Ich möchte nicht zeigen, wie man Anwendungen für OpenGL schreibt. Ich möchte zeigen, wie OpenGL funktioniert. Ich bin zutiefst davon überzeugt, dass es unmöglich ist, mithilfe von 3D-Bibliotheken effiziente Anwendungen zu schreiben, ohne dies zu verstehen.
Ich werde versuchen, den endgültigen Code auf etwa 500 Zeilen zu bringen. Meine Schüler benötigen 10 bis 20 Programmierstunden, um mit der Erstellung solcher Renderer zu beginnen. Als Eingabe erhalten wir eine Testdatei mit einem Polygondraht + Bildern mit Texturen. Als Ergebnis erhalten wir eine gerenderte, modellfreie grafische Oberfläche, und das Programm generiert einfach ein Bild.
Da das Ziel darin besteht, externe Abhängigkeiten zu minimieren, gebe ich meinen Schülern nur einen Kurs, der die Arbeit mit TGA-Dateien ermöglicht. Es ist eines der einfachsten Formate, das Bilder in den Formaten RGB/RGBA/Schwarzweiß unterstützt. Als Ausgangspunkt erhalten wir also eine einfache Möglichkeit, mit Bildern zu arbeiten. Bitte beachten Sie, dass die einzige zu Beginn verfügbare Funktionalität (neben dem Laden und Speichern von Bildern) die Möglichkeit ist, die Farbe eines Pixels festzulegen.
Es gibt keine Funktionen zum Zeichnen von Liniensegmenten und Dreiecken. Wir müssen das alles von Hand machen. Ich stelle meinen Quellcode zur Verfügung, den ich parallel mit Studierenden schreibe. Ich würde die Verwendung jedoch nicht empfehlen, da dies keinen Sinn ergibt. Der gesamte Code ist auf GitHub verfügbar, und hier finden Sie den Quellcode, den ich meinen Schülern gebe.
# include " tgaimage.h "
const TGAColor white = TGAColor( 255 , 255 , 255 , 255 );
const TGAColor red = TGAColor( 255 , 0 , 0 , 255 );
int main ( int argc, char ** argv) {
TGAImage image ( 100 , 100 , TGAImage::RGB);
image. set ( 52 , 41 , red);
image. write_tga_file ( " output.tga " );`
return 0 ;
}
Output.tga sollte etwa so aussehen: