Ich möchte meine Erinnerungen an meine Versuche teilen, die "3D-Grafik-Engine" fast in der Zeit vor dem Internet zum "Do-it-yourself" zu machen (als wäre er natürlich schon irgendwo dort gewesen, aber ich hatte tatsächlich keine). Es konnte kein Amerika entdeckt werden, die Revolution fand auch nicht statt, aber es gab viel Mühe, Qual und Fan. Im Laufe der Jahre wird die Erinnerung an viele Ereignisse gelöscht, Details verschwinden, Eindrücke verblassen - bei zahlreichen Fahrten ging die Diskettenbox verloren und es gab keine Artefakte aus den beschriebenen Ereignissen.
Hintergrund
Die letzten 4 Schuljahre fanden in der Omsker Sportschule statt, wo einem Kind (außer Sport und einem Schwur) die C-Sprache beigebracht wurde, was es mir ermöglichte, selbst etwas zu schreiben, um zu erkennen, was ich in Spielen dieser Zeit sah . Es war schon schwer, mit 2D-Grafiken zu überraschen, aber Wolf 3D brachte mich für eine Weile zum Stillstand. Einer der älteren Kameraden sagte: „Ja, alles ist auf den Bars“, und dies erlaubte mir, mich vom Boden abzuheben. Dann wurde mir klar, dass der Bresenham-Algorithmus auf die Skalierung der Bildspalte angewendet werden kann, und eine Art Parodie auf Wolf3D begann zu funktionieren. Ich habe mich überhaupt nicht bemüht, etwas Spielbares zu schaffen (was für eine Gemeinheit!), Ich mochte den Prozess der Implementierung grafischer Algorithmen, das Gefühl, dass Sie wissen, wie es gemacht wird und es kann. Bei den Abschlussprüfungen entschied ich mich für Informatik und präsentierte den Lehrern den „theoretischen“ Teil, was sie durch das Vorhandensein eines praktischen Teils sehr überraschte. Aber eine Woche vor der Prüfung sah ich Descent - ein echtes dreidimensionales Spiel mit Texturen. Es war etwas Unmögliches, ich wusste, dass 3DS existiert, aber um einen Cartoon zu rendern, brauchte man viel Zeit, und dann flog es direkt vor unseren Augen.
Während des Abschlusses diskutierte ich mit Freunden, Herzog Nukem (er ist auch Kolumnist), den ich wegen seines Humors und seiner Abwechslung sehr mochte, anstatt wie alle normalen Kinder zu pochen. Und dann sagte mir einer: "Schau dir Quake an." Als ich mir das Kwaku ansah, entschied ich, dass es genug ist, um es zu ertragen, es ist unmöglich, das sind echte 3D-Grafiken, keine Spalten - und ich verstehe absolut nicht, wie das gemacht wird.
Ich war geschickt in Geometrie
Jetzt können Sie in 5 Minuten alle Informationen finden, aber was tun Sie dann? Ich hatte Bücher über 3D-Grafiken, aber sie haben die Frage überhaupt nicht geklärt. In der „Duma“ werden alle Gesichter in einem Trapez auf dem Bildschirm angezeigt. Das Ziehen der Textur erfolgt durch Dehnen der Spalten. Gleichzeitig habe ich die Tatsache aus den Augen verloren, dass Nichtlinearität horizontal entsteht, und tatsächlich ist das Bild in der Duma nicht ganz realistisch. Also habe ich das von Newton entdeckte Hauptprinzip der 3D-Grafik übersehen - "
linearisieren ". Was wird die Quelle aller nachfolgenden Probleme und Würfe.
Da wir bereits wissen, wie man ein Trapez zeichnet, lassen Sie uns jede dreieckige Facette auf dem Bildschirm „zeichnen“. Ja, es kann nicht mit Spalten übermalt werden, aber Geometrie ist keine sehr schwierige Sache. Lassen Sie uns einen Strahl von der Kamera durch jedes Pixel des Bildschirms leiten und herausfinden, wo er das Gesicht schneidet. Dies ist praktisch Raytracing, nur Lite! Jeder Schüler wird diese Formel in 5 Minuten schreiben. Die Gleichung der Linie:
wo
,
Dies sind die Koordinaten des Pixels auf der Bildschirmebene.
Dies ist der Abstand von der Kamera zur Bildschirmebene (Kamera bei Null des Referenzsystems).
- Parameter
Die Gleichung der Ebene:
Wenn n normal ist, ist der Parameter (und damit die Koordinaten) leicht zu finden:
Nun, wie einfach es ist, kommen Sie in den Bereich des
Schmerzes der Spaltung. Der Computer klappt gut, multipliziert sich erträglich (es ist nichts weiter als Additionen und Verschiebungen), aber Division ... Die Division auf meinem Pentium dauerte 46 Taktzyklen. Selbst wenn 320 bis 200, auch wenn nichts mehr, dann benötigen Sie für jeden Frame 3 Millionen Maßnahmen. Und es gibt nur 100 von meinem Hanf, was bedeutet, dass Sie im Prinzip nicht schneller als 30 fps werden können. Und wenn die Auflösung um das Zweifache erhöht wird? 7 fps? Aber der junge Enthusiast war nicht verlegen.
Nehmen wir an, wir haben den Schnittpunkt mit der Fläche berechnet, dann müssen wir zwei Probleme lösen:
- Entscheiden Sie, ob ein Gesicht in diesem Pixel gezeichnet werden soll oder ob ein anderes Gesicht es überlappt
- Texturkoordinaten finden
Baum sortieren
Natürlich wusste ich über den Z-Puffer Bescheid. Aber glauben Sie mir, 99% der Leute, die den Z-Puffer kennen, stellen ihn sich falsch vor, genau wie ich ihn mir falsch vorgestellt habe (es wird eine Erklärung geben). Auf jeden Fall wollte ich unnötige Berechnungen vermeiden (Unterteilungen sind zu schwer), also entschied ich mich für eine andere Technik, die im Buch gelesen wurde - binäre Raumpartitionsbäume, sie sind auch BSP-Bäume. Ich habe Bäume immer geliebt, die Methode, nach einem Baum zu sortieren, hat mich immer mit seiner Magie fasziniert, und hier war ihre Variation - ich habe 8 Stunden ununterbrochen debuggt, aber ich konnte!
Die Methode ermöglichte das Sortieren der Gesichter (gleichzeitig wurden einige Gesichter in Teile geschnitten), so dass beim Anzeigen zuerst „nahe“ Gesichter und dann entfernte Gesichter gezeichnet wurden. Wenn ich also beim Zeichnen des Gesichts gesehen habe, dass das Pixel bereits aufgenommen wurde, können wir sicher zum nächsten Pixel übergehen. Das Ordnungsproblem ist gelöst. Es bleibt, die Texturen zu ziehen.
Tapete Textur kleben
U, V-Koordinaten? Nein, ich habe nicht gehört. Aber beschuldigen Sie mich nicht, denn wenn Sie die Tapete kleben, denken Sie nicht dasselbe über sie. Sie denken, dass Sie hier eine Kante der Tapete haben (horizontaler Texturvektor), hier haben Sie die andere Kante der Tapete (Textur vertikaler Vektor), Sie legen sie an die Wand! Also habe ich für jedes Gesicht 2 Vektoren für die Kanten der Textur gestartet und als ich den Schnittpunkt kannte, fand ich die Koordinaten innerhalb der Textur.
Wir brauchen eine Handlung und Effekte.
Rendern verdient, obwohl nicht schnell, aber verdient! Ich konnte 3D-Grafiken erstellen! Aber was werden wir rendern? Wir brauchen eine Art Handlung, einige Modelle, wir brauchen eine Art Sound.
Ein Wanderer oder ein Flyer? Dieser Walker ging und lässt nicht alle 3D-Schönheit spüren, definitiv eine Fliege! Es wird unseren Abstieg geben.
Ich machte eine Plattform, stellte mehrere Gebäude darauf, zog Texturen mit Fenstern darauf, machte einen Brunnen aus Gesichtern (es schien cool zu sein). Was werden wir schießen? Sie haben im Beben Nägel geschossen, es war nicht cool. Aus irgendeinem Grund, den Kulturwissenschaftlern zu diesem Zeitpunkt nicht kannten, war das Wort „Bolzen“ (das gehämmert werden muss) beliebt, und ich erkannte, dass wir mit Bolzen schießen würden - es stellte sich heraus, dass es sich um Schrauben handelte -, dass die Schlitze an den in das Gebäude getriebenen Bolzen sehr gut aussahen ".
Der Feind? Nun, ich konnte keine Modelle von Menschen machen, ich tat es ... ein fliegender Krankenwagen, fast kubisch, kippte nur ihre Windschutzscheibe ein wenig. Aber die Textur gespeichert.
Klingt. Die Geräusche von Schüssen und Explosionen und der Schrei, den ich bekam, als ich eine Flugmaschine aus Warcraft nahm, der Soundtrack startete die Akustik. Der Mann, der die Welt verkaufte - ich selbst hörte Metal, aber meine Eltern hatten Mitleid, die abends beim Debuggen dasselbe hören mussten.
In Windows 95 wurden die Sounds nicht gemischt, aber sie, der Vorteil der Universität, erzählte mir die Lehrerin von Multithreading und ich schrieb den Mixer in einem separaten Stream - ein weiterer Erfolg (Windows 98 wird in einem Jahr veröffentlicht, in dem die Sounds selbst gemischt werden und diese geheime Fähigkeit unbrauchbar wird).
Kann man es besser machen? Ich entschied mich, die Linearisierung wiederzuentdecken und dachte, was passiert, wenn wir die Texturkoordinaten für die Kanten der Linie genau finden und das Innere verrückt wird? Ich habe es versucht - alles begann um ein Vielfaches schneller zu funktionieren, aber in der Nähe der Gebäude begannen ernsthafte Verzerrungen - wie in einem Raum mit krummen Spiegeln. Korrektur der Perspektive - nein, ich habe nicht gehört.
Nun, da ich nichts gehört habe, hat das nichts damit zu tun, und ich habe diese Option abgelehnt.
Fast das Ende der Geschichte
Gegen Ende des ersten Jahres nahm ich an einem speziellen Kurs über Computergrafik teil und zeigte dem Lehrer alles, was es gab. Wahrscheinlich waren wir gleichermaßen überrascht von ihm, als er die lineare Interpolation von Texturkoordinaten und Normalen, die ungefähre Berechnung der Beleuchtung, die Schätzung des perspektivischen Fehlers und seine Korrektur erklärte, und ich zeigte ihm etwas wirklich Funktionierendes.
Im zweiten Jahr habe ich versucht, alles auf der Grundlage neuer Erkenntnisse zu wiederholen, aber das Standardjahr war 98, und ich habe das zweite Beben auf dem 3D-Beschleuniger gesehen - es war fabelhaft schön. Dann gab es überhaupt kein Geld von dem Wort, der Beschleuniger war wie ein Raumschiff, aus irgendeinem Grund entschied ich, dass ich es in naher Zukunft nicht haben würde. Und das Interesse an Grafikprogrammierung ließ schnell nach - aber ich war begeistert von der Idee, Sound zu verarbeiten. Aber das ist eine andere Geschichte
PS Reale Texturkoordinaten ändern sich nichtlinear, aus Geschwindigkeitsgründen werden sie durch lineare ersetzt. Aber was passiert mit der Z-Koordinate und warum drehen sie Z während der Transformation um? Die Antwort auf diese Frage gibt der Z-Puffer.