2016-04-25 15 views
1

Ich möchte prozedural generierte Landscape Meshes mit einem flachen schattierten Aussehen in Unity3D erstellen.Muss ich geteilte Scheitelpunkte in Mesh in Unity verwenden?

Ich dachte, es wäre das beste zu schaffen drei eindeutige Vertices pro Dreieck und verwenden Sie eine für die Scheitelpunkte berechnet normal. Der Aufbau dieses Netzes würde zu redundanten Vertex-Positionsinformationen führen. (Würde es einen Einfluss auf die Renderzeit haben?)

Wie auch immer ... das Problem ist, dass ich Shading-Techniken, z. Umgebungsokklusion auf diesem Mesh. Ich möchte die Mesh-Topologie, die Unity3D für ihre Shader erwartet, nicht durcheinander bringen.

Ist es besser, das Netz mit geteilten Scheitelpunkten zu erstellen, fügen Sie vielleicht ein benutzerdefiniertes Scheitelpunktattribut hinzu, z. 'flat_normal' und die Shader anpassen, um dies zu verwenden?

+0

Ich denke, dass in der überwiegenden Mehrheit der Situationen GPU mehr Rechenleistung zur Verfügung hat als CPU. Der einzige Weg, das herauszufinden, ist, beide Szenarien zu testen, denke ich. Ich würde gerne die Profiler-Statistiken zu diesem Thema sehen. –

+0

"redundante Vertex-Positionsinformationen"? Das gibt es nicht. Es gibt überhaupt keinen Grund dafür, dass Sie Eckpunkte in einem Netz teilen müssen. – Fattie

+0

rein FWIW, (1) es ist üblich, ein Netz als Landschaft zu erstellen (oft völlig unnötig, aber keine große Sache). (2) Sie wollen einen "flachen, cartoony" Look. überhaupt kein problem, klicken sie einfach durch die vielen flach-cartoony shader verfügbar (es gibt eine große auswahl da draußen), um einen anschein zu bekommen, die sie mögen. Es ist erwähnenswert, dass (3) Unity ein "Terrain" -System beinhaltet, das heutzutage ziemlich gut ist. Sie können das einfach trivial verwenden und der ganze Job ist erledigt. (Wählen Sie erneut den gewünschten Shader-Look.) – Fattie

Antwort

3

Die einfache Antwort ist

Nein,

Einheit nicht im geringsten, "sucht" shared verts. Keine 3D-Pipeline hat etwas mit Shared Verts zu tun. Shared Verts hilft oder behindert die 3D-Pipeline überhaupt nicht.

(Sehr oft, wenn wir zum Beispiel dynamisches Mesh machen, wir nur „überhaupt nicht geteilt verts verwenden“, weil, wie Sie wahrscheinlich, es ist oft viel einfacher zu nicht Nutzung freigegebene verts gefunden zu haben.)

Der einzige Grund, Shared Verts zu verwenden, ist, wenn es aus irgendeinem Grund für Sie bequemer ist. In diesem Fall erlaubt die 3D-Pipeline (Unity oder anderswo) gemeinsame Nutzung ohne Nachteile.

+0

BTW, für die Aufzeichnung ist es erwähnenswert: Es dauert vielleicht drei Zeilen Code, um zwischen Shared/Unshared Verts zu konvertieren. Wenn Sie (aus irgendeinem Grund) möchten, haben Sie einfach einen Pass am Ende, der die Verts "teilt" (oder "de-shares"). (Es wird keinen Unterschied für die Rendering-Pipeline machen; es kann einfacher für Sie aus einem anderen Grund sein.) – Fattie

+0

tatsächlich gibt es Fälle, in denen Sie Scheitelpunkte nicht geteilt haben können und das ist, wenn Sie entweder eine scharfe Kante (= die Scheitelpunktnormalen haben wollen) anders sein) oder Sie haben eine UV-Naht (= die UV-Koordinaten müssen unterschiedlich sein) oder Sie möchten, dass benachbarte Flächen unterschiedliche Eckpunktfarben erhalten. – yes

+0

wahr, ein ausgezeichneter Punkt. Wenn Sie das gleiche Mesh in Betracht ziehen, dann müssen Sie manchmal *** *** *** *** Mesh verwenden. Auch in Bezug auf die Frage hier betont dies absolut, dass das OP sicherlich keine geteilten Verts verwenden muss. Der Schlüssel zu dieser QA ist, dass das OP erwähnt * "Ich möchte die Mesh-Topologie, die Unity3D für seine Shader erwartet, nicht durcheinander bringen" *.was absolut falsch ist; die 3D-Pipeline ist für Dreiecke "zustandslos", es ist nie notwendig, verts zu teilen. – Fattie