Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

1

08.08.2012, 20:48

D3D11: Near-Clipping-Plane nahezu 0.0

Hallo, nach langer Zeit widme ich mich mal wieder meinem D3D11 RenderSystem und muss gleich mal fragen: ist es normal, dass in D3D11 die near-clipping-plane nahezu gegen Null geht?
Ich kann extreeeem nach an die Polygon heran gehen, auch ohne das irgendwie in der Ferne Z-Fighting los geht oder so.
Eig. nicht schlecht, wenn man z.B. ganz kleine Waffen-Modelle in der Ego-Perspektive knapp vor der Kamera rendern will. Aber irgendwie kann das doch nicht ganz stimmen oder?

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

2

09.08.2012, 08:09

Das hängt immer von den konkreten Werten ab. Ohne die ist eine Beurteilung sehr schwer. Was ist bei Dir nahezu Null? 1? 0.1? 0.00001? Was ist bei Dir weit weg? 1? 10? 10000? Und wie viel Bit hat Dein Depth-Buffer? Auch wichtig ist die Geometrie. Z-Fighting kommt ja im Normalfall eher bei annähernd planaren Polygonen vor. Wenn Du nur senkrecht aufeinander stehende Wände hast, dann wird man das eher nicht sehen.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

3

09.08.2012, 10:07

Hast ja prinzipiell Recht, aber dass ich mit "nahe zu 0.0" nicht 1 meine, könnte man sich schon denken oder ^^

Gehen wir mal von epsilon aus, also ca. 1.0e-6 (0.000001f) :P

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

4

09.08.2012, 10:11

Das sagt über Deine Far-Plane allerdings noch immer nichts. Die Kombination ist ja bekanntlich wichtig, nicht ein Wert allein.
Bei Werten zwischen 10.000 und 100.000 als Far-Plane ist übrigens 1.0 schon "sehr dicht an 0". Das kann man sich also leider nicht denken, finde ich. Es ist immer alles relativ. Man stelle sich z.B. ein Space-Game vor mit nativer Übertragung von Einheiten-Größen in Metern (tausende bis millionen Kilometer Raum), da wäre 1 schon wirklich sehr sehr dicht.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »BlueCobold« (09.08.2012, 10:18)


LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

5

09.08.2012, 10:38

Die Werte in meiner Projektions-Matrix sind: Near = 0.1 und Far = 250.0. Aber wenn ich so extrem nah an eine Fläche heran gehe, sieht es aus,
als wären die Werte: Near = 0.0000000000000001 und Far = 250.0.
Das kann aber irgendwie nicht stimmen. Eigentlich müssten die Flächen schon viel früher von der 'Camera' abgeschitten bzw. geclipt werden.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

6

09.08.2012, 10:46

Wie genau stellst Du denn fest, wie nah Deine Kamera/Near Plane am geclippten Objekt ist? So aus dem Bauch heraus?
0.1 und 250 sind prima Werte. Wie Dein Gefühl von "Near = 0.0000000000000001" entsteht, das kann ich schwer beurteilen.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

7

09.08.2012, 10:57

Ich weiß nicht wie ich mein Problem noch beschreiben soll. Ich kenne den Unterschied zwischen diesem Resultat und dem mit OpenGL, aber einen Screenshot kann ich im Moment leider nicht posten.
Natürlich sind 0.1 und 250.0 prima Werte, aber diese Werte stimmen eben nicht mit dem Ergebnis überein.
Bei OpenGL kann ich mit diesen Werten z.B. nicht nah genug an eine bestimmte Fläche her, um einen Pixel einer Texture über den gesamten Bildschirm verteilt zu sehen - vorausgesetzt, die Texture hat eine nicht zu kleine Auflösung (bitte nicht wieder mit "was ist schon klein" anfangen).
Bei D3D11 passiert das aber, sogar soweit, dass dieser Texture Pixel viel größer als der Bildschirm wird.
Das ist definitiv zu nah! Wenn ich das gewollt hätte, hätte ich 0.00001 oder noch kleinere Werte für die Near Plane eingestellt, und dann müsste aber schon längst Z-Fighting in der Tiefe losgehehn, passiert aber nicht.
Ist ja eig. ne coole Sache, aber ich verstehe es nicht, warum das so ist ?(

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

8

09.08.2012, 11:23

Du sagst also du setzt die Near Plane auf 0.1, aber tatsächlich reicht sie näher heran?
Vielleicht ist deine Projektionsmatrix einfach falsch erzeugt worden.

Übrigens, bzgl. Waffen rendern:
Die kannst du nachträglich "drüber rendern", indem du vorher den Z-Buffer leerst und dann mit einer neuen Projektionsmatrix zeichnest, die z.B. von 0.001 bis 1 geht.
Dann kann deine Waffe auch nie in einer Wand verschwinden oder so.

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

9

09.08.2012, 11:28

@David: Wenn man den Z-Buffer leert, muss man aber die Projektionsmatrix nicht mehr manipulieren, damit die Waffe sehr klein ist.
Weil dann hat man das Problem mit dem Verschwinden in der Wand ja eh nicht mehr.
Aber ist es wirklich so effizient den Z-Buffer zwei mal pro Frame zu leeren? Ich denke es ist immer noch am optimalsten, die Waffe mit dem Projektions-Trick einfach sehr klein zu rendern, dafür aber den Z-Buffer nicht noch mal zu leeren.

Dass meine Projektionsmatrix falsch erzeugt wird, kann ich mir nicht wirklich vorstellen, werde mir das aber noch mal genauer anschauen.
Für D3D9 erzeuge ich exakt die selbe Matrix nur in D3D11 gibt's halt keine Fixed-Function-Pipeline mehr, vlt. stimmt ja bei der Übergabe mit dem Vertex-Shader was nicht.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

10

09.08.2012, 11:34

Was ich meinte:
Du benutzt eine neue Projektionsmatrix, die verhindert, dass die Waffe weggeclipt wird.
Die Größe der Waffe wäre dann ganz normal.

Aber ja, wahrscheinlich ist das nicht die beste Lösung.

Eine andere Möglichkeite wäre die Waffe in ein separates Render-Target zu rendern und später über die normale Sicht zu legen ("Compositing").
Wenn du die Waffe direkt am Anfang renderst, sollte die GPU an keiner Stelle unnötig warten müssen.

Werbeanzeige