2010-08-29 11 views

Antwort

15

Wenn Sie genau hinsehen, können Sie Beispiele in vielen Videospielen sehen. Jedes Mal, wenn die Kamera versehentlich durch ein Objekt verschiebt - normalerweise ein sich bewegendes Objekt wie ein Zeichen -, merkt man, wie die Welt weiterhin korrekt rendert. Das liegt daran, dass die Rückseiten der Dreiecke, die die Haut des Charakters bilden, nicht gerendert werden. Sie sind effektiv transparent. Wenn dies nicht der Fall wäre, würde jedes Mal, wenn sich die Kamera versehentlich in ein Objekt bewegt, entweder der Bildschirm schwarz werden (weil das Innere des Objekts nicht beleuchtet ist), oder Sie erhalten eine bizarre Perspektive auf die Haut des Objekts von innen.

11

Bei der Rückseitenausblendung werden die Dreiecke, die von der Kamera/dem Blickpunkt wegzeigen, nicht zum Zeichnen berücksichtigt.

Wikipedia definiert dies als:

es ein Schritt in der Grafik-Pipeline ist, dass die Punkte in der Polygon testet, ob im Uhrzeigersinn oder gegen den Uhrzeigersinn erscheinen, wenn auf den Bildschirm projiziert. Wenn der Benutzer angegeben hat, dass nach vorne zeigende Polygone im Uhrzeigersinn gewunden sind, wurde das auf den Bildschirm projizierte Polygon entgegen dem Uhrzeigersinn gedreht, sodass es von der Kamera weg gedreht wurde und nicht gezeichnet wird.

Andere Systeme verwenden die Gesichtsnormale und das Skalarprodukt mit der Ansichtsrichtung.

Es ist eine relativ schnelle Möglichkeit zu entscheiden, ob ein Dreieck gezeichnet werden soll oder nicht. Betrachten Sie einen Würfel. Zu jeder Zeit werden 3 der Seiten des Würfels vom Benutzer abgewandt sein und daher nicht sichtbar sein. Selbst wenn diese gezeichnet wären, würden sie von den drei "nach vorne" weisenden Seiten verdeckt werden. Wenn Sie die Rückseitenauswurffunktion ausführen, reduzieren Sie die Anzahl der gezogenen Dreiecke von 12 auf 6 (2 pro Seite).

Die Rückseitenkeulung funktioniert am besten mit geschlossenen "soliden" Objekten wie Würfeln, Kugeln, Wänden.

Einige Systeme haben dies nicht, da sie Flächen als doppelseitig betrachten und daher von jeder Richtung aus sichtbar sind.

+0

Ich verstehe es immer noch nicht :) Wenn ich ein rotes Dreieck habe, sollte es in beiden Fällen gezeichnet werden (Scheitelpunkte sind in cw oder ccw Reihenfolge). Mit Gesichtskeulen würde das Dreieck verschwinden, wenn ich es von hinten betrachte. – fhucho

+0

@fhucho - in diesem Fall betrachtest du, dass das Dreieck in der Tat doppelseitig ist und das Gesichtsauswählen "aus" zurückdrehen will. – ChrisF

+0

Danke, ich verstehe es jetzt. – fhucho

1

Dreiecke haben ihre Koordinaten in einer bestimmten Reihenfolge spezifiziert, im Uhrzeigersinn IIRC.

Wenn die Grafik-Engine ein Dreieck aus einer bestimmten Richtung betrachtet und die Koordinaten gegen den Uhrzeigersinn sind, weiß sie, dass sie durch ein Objekt auf die Rückseite des Dreiecks schaut. Da die Vorderseite des Objekts das Dreieck bedeckt, muss es nicht gezeichnet werden.

+1

Es ist eigentlich umgekehrt - CCW-Punkte zeigen ein nach vorne gerichtetes Dreieck an und CW-Punkte zeigen nach hinten. Es gibt jedoch eine Möglichkeit, dies zu ändern. – cHao

+0

Ich glaube, dass Direct3D standardmäßig CCW für Frontside ist, während OpenGL CW für Frontseite standardmäßig ist – Octopus

+0

OpenGL Standard ist CCW. Es kann mit 'glFrontFace (GL_CW)' geändert werden. DirectX ist standardmäßig CW. –

2

Es ist nur und Optimierungstechnik.

Wenn Sie ein geschlossenes Objekt betrachten, sagen Sie einen Würfel, sehen Sie nur etwa die Hälfte der Gesichter: die Gesichter, die Ihnen zugewandt sind (oder zumindest die Gesichter, die Ihnen nicht zugewandt sind, werden immer von einem anderen Gesicht verdeckt) Punkte zu Ihnen)

Wenn Sie alle diese rückwärts gerichteten Gesichter überspringen zeichnen, wird es zwei Folgen haben: - die Renderzeit zweimal besser sein wird (im Durchschnitt) - das Finale wird sich nicht ändern machen (da eine andere Die Vorderseite wird auf einen "Ausgelöschten" gezeichnet.

So erhalten Sie im Grunde x2 perf kostenlos.

Um zu wissen, ob das Dreieck nach vorne oder nach hinten gerichtet ist, nehmen Sie v0-v1 und v0-v2, machen Sie ein Kreuzprodukt. Dies gibt Ihnen das Gesicht normal. Wenn dieser Vektor zu Ihnen zeigt (Punkt (normal, viewVector) < 0), zeichnen Sie.