Erstellen Sie eine Tuschezeichnung ohne Schattierung und mit allen Linien mit gleichem Gewicht - wie Sie es in einem Strip-Comic wie Dilbert sehen. Dies stellt eine aktive dreidimensionale Welt dar, aber Objekte haben keine Texturen, aber Sie sehen auch keine tessellierten Dreiecke.
Als Beispiel sollten Sie die Oberfläche des Mondes zeichnen. Die Linien, die Sie möglicherweise zeichnen, befinden sich am oberen Rand der Hügel, bis zu dem Punkt, an dem sie auf das allgemeine Niveau der Oberfläche treffen. Dahinter würden Sie dasselbe für größere Hügel tun, in die Ferne und dahinter, was am Horizont sichtbar war. Bei Kratern können Sie einen nahen Kreis für die Außenkante und einen teilweise maskierten Kreis für die Unterkante zeichnen. Felsbrocken hätten eine Linie um den Rand und entlang der wichtigsten sichtbaren Kanten. Die Astronauten würden eine Linie entlang ihrer Außenkante und entlang der Hauptmerkmale ihres Raumanzugs haben.
Ich bin ein erfahrener Programmierer, aber neu in der 3D-Programmierung. Ich kann mir nicht ohne weiteres ein Spiel vorstellen, das so aussieht - wurde es gemacht? Und wie würde man das machen? Zwei Probleme kommen in den Sinn - die signifikanten Kanten zu finden und sie zu zeichnen. Würde es eine "Engine" brauchen, die von Matrizen auf der Basis von Linien codiert wird, anstatt eine normale 3D-Engine?
Antworten:
Grundsätzlich geht es um Edge-Finding, und es gibt eine Reihe von Spielen, die dies auf unterschiedliche Weise tun.
Wahrscheinlich war das erste Jet Set Radio (im Westen als "Jet Grind Radio" veröffentlicht). Nur ein oder zwei Monate später erschien das Spiel, für das ich eine ähnliche Rendering-Technik entwickelt hatte: Looney Tunes: Space Race . (Beim Space Race haben wir unser Bestes getan, um eine gleichmäßige Liniendicke beizubehalten, während Jet Set Radio die ungleichmäßigen Linienbreiten zu einem großen Teil seines visuellen Stils machte.)
Beide Spiele funktionierten auf die gleiche Weise. Zeichnen Sie das Objekt für jedes zu skizzierende Objekt zweimal. Rendern Sie es zunächst mit umgekehrter Rückseite, wobei ein Scheitelpunkt-Push angewendet wird (dh jeder Scheitelpunkt wird um einen gewissen Abstand entlang seines normalen Vektors verschoben), und in welcher Farbe auch immer die "Linien" erscheinen sollen. Zeichnen Sie dann erneut, ohne den Scheitelpunkt zu drücken und mit normaler Rückseite. Diese beiden Operationen geben Ihnen eine farbige Silhouette um ein Objekt, und es ist alles, was diese ersten beiden Spiele verwendet haben. In Space Race habe ich die Illusion einer konstanten Linienbreite beibehalten, indem ich die Scheitelpunkte in unterschiedlichem Abstand verschoben habe, je nachdem, wie weit das Objekt von der Kamera entfernt war. In Jet Set Radio war dies nicht der Fall (was dazu führte, dass Linien größer oder kleiner wurden, wenn Objekte näher oder weiter von der Kamera entfernt waren).
NVidia und ATI bieten verschiedene Demos anderer Möglichkeiten, um diesen Effekt zu erzielen. Dabei geht es hauptsächlich um Pixel-Shader, die nach Normalen suchen, die für jedes Pixel senkrecht zum Kamera-zu-Pixel-Vektor sind. Diese erfordern jedoch alle sehr hochauflösende Netze und erzeugen inkonsistente Netze Linienbreiten in der Praxis. Ich weiß nicht, ob Spiele tatsächlich diesen Ansatz verwenden. Ich glaube nicht, dass ich welche gesehen habe, die den Mustern dieser Firmen ähneln.
Ich werde Sie auch auf Dragon's Lair 3D hinweisen , das einzige Spiel, von dem ich weiß, dass es das wirklich richtig macht. Nehmen Sie das Punktprodukt von Kamera zu Polygon und die Normalen des Polygons für jedes Polygon in einem Modell, um festzustellen, ob jedes Polygon zur Kamera zeigt oder von dieser weg zeigt, und überprüfen Sie dann alle Paare verbundener Polygone. Wenn sich ein Polygonpaar eine Kante teilt und ein Polygon der Kamera zugewandt ist und ein Polygon nicht, zeichnet es eine dünne Linie mit konstanter Breite entlang dieser Kante im Bildschirmbereich. (Ich konnte diese Funktion im Dreamcast for Space Race nicht schnell genug ausführen, oder ich hätte sie verwendet. Heute würde ich auf modernen Computern genau so versuchen, diesen Effekt zu erzielen, obwohl dies der Fall ist. '
Dragon's Lair 3D ist auch das einzige mir bekannte Spiel, das tatsächlich Linien zwischen Bereichen unterschiedlicher Farbe oder an scheitelpunktnormalen Diskontinuitäten zeichnet, auch wenn dort keine Silhouette vorhanden ist. Ich vermute, dass sie ein benutzerdefiniertes Werkzeug hatten, mit dem ihre Künstler Polygonkanten benennen konnten, um immer eine Linie zu erhalten.
Okami , das von einigen anderen Leuten erwähnt wurde, scheint einen Vertex-Push-Ansatz mit doppeltem Rendering zu verwenden, ähnlich wie Jet Set Radio und Space Race, verwendet aber auch Texturen, die mit einem gebürsteten Kunststil erstellt wurden. (Hügel in der Ferne werden beispielsweise als Pinselstriche in eine Textur gezeichnet, die als Standardquad gezeichnet wird.) Okami ist reizend, aber ich denke nicht, dass es wirklich die Technologie berührt, nach der Sie fragen; sicherlich verwendet es den älteren Ansatz für seine Wirkung.
In Ihrem Fall möchten Sie dies ohne Farbfüllung tun und nur die Welt nur mit Linien zeichnen. Das ist einfach zu machen; Zeichnen Sie einfach alle Polygone ohne Beleuchtung und in einer einzigen konstanten Farbe, die der Hintergrundfarbe entspricht. Jeder dieser Ansätze sollte mit diesem Ansatz funktionieren, ohne dass Ihre Spiel-Engine geändert wird. Es ist wichtig, diese Polygone "dieselbe Farbe wie der Hintergrund" zu zeichnen, da sie verhindern, dass Hintergrundkanten durch Vordergrundobjekte sichtbar werden, was sehr schnell verwirrend werden kann.
quelle
Sie sprechen von nicht fotorealistischem Rendering (auch bekannt als NPR). In einem Echtzeit-3D-Spiel werden Fragment- / Pixel-Shader verwendet.
Scrollen Sie hier durch, um einige Beispiele zu sehen: http://developer.download.nvidia.com/shaderlibrary/webpages/shader_library.html
quelle