Depth Buffer mit 64 Bit

Für Fragen zu Grafik APIs wie DirectX und OpenGL sowie Shaderprogrammierung.
Antworten
Mirror
Establishment
Beiträge: 308
Registriert: 25.08.2019, 05:00
Alter Benutzername: gdsWizard
Kontaktdaten:

Depth Buffer mit 64 Bit

Beitrag von Mirror »

Hallo,

kennt jemand eine Möglichkeit einen Depth Buffer mit 64 Bit unter DirectX 11 oder DirectX 12 anzulegen ?

Geht das überhaupt ?
Hat den StormWizard 1.0 und 2.0 verbrochen. https://mirrorcad.com
Benutzeravatar
gombolo
Establishment
Beiträge: 161
Registriert: 26.01.2011, 20:33

Re: Depth Buffer mit 64 Bit

Beitrag von gombolo »

ohne jetzt in die Doku zu schauen, aber weil ich mich seit ein paar Wochen mit DirectX11 beschäftige und viel experimentiert habe muss ich sagen ich kenne ich bis jetzt 24Bit und 32Bit Puffer. Wobei ich mich Frage was macht man mit einem 64Bit Puffer?

Weil vielleicht kann man das auch anders Lösen, wenn du eine solche Genauigkeit benötigst.
Benutzeravatar
TomasRiker
Beiträge: 99
Registriert: 18.07.2011, 11:45
Echter Name: David Scherfgen
Wohnort: Hildesheim

Re: Depth Buffer mit 64 Bit

Beitrag von TomasRiker »

Ich glaube nicht. Wäre wahrscheinlich auch nutzlos, wenn die GPUs intern mit 32-Bit-Floats rechnen. Dann hättest du nichts von der höheren Genauigkeit.
Mirror
Establishment
Beiträge: 308
Registriert: 25.08.2019, 05:00
Alter Benutzername: gdsWizard
Kontaktdaten:

Re: Depth Buffer mit 64 Bit

Beitrag von Mirror »

Ich kenne auch nur 32 und 24 Bit. Zumindest als DXGI-Format. Deswegen frage ich ja.

Soweit ich weis wird der Depth-Wert in einen 32 oder 24 Bit Integerwert umgerechnet. Ich denke das dadurch viel an Informationen verloren geht. Da der höchste Wert gleich eins gesetzt wird. Hundertprozentig sicher bin ich aber nicht. Hier würde also auch bei 32 Bit-Float auf 64Bit Integer was bringen.
Hat den StormWizard 1.0 und 2.0 verbrochen. https://mirrorcad.com
Benutzeravatar
Krishty
Establishment
Beiträge: 8316
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Depth Buffer mit 64 Bit

Beitrag von Krishty »

TomasRiker hat geschrieben: 11.05.2024, 13:05 Ich glaube nicht. Wäre wahrscheinlich auch nutzlos, wenn die GPUs intern mit 32-Bit-Floats rechnen. Dann hättest du nichts von der höheren Genauigkeit.
Genau. Intern wird mit 32-Bit-Gleitkommazahlen gerechnet. Beim Schreiben in DXGI_FORMAT_D32_FLOAT findet im Grunde keine Umrechnung und kein Genauigkeitsverlust statt.

Die meisten Genauigkeitsprobleme entstehen bereits bei der Berechnung – bei der Transformation der Vertex-Koordinaten durch die Projektionsmatrix. Es gibt einige Empfehlungen, wie man die verringern oder sogar zum Vorteil nutzen kann – prominentes Beispiel ist Outerra, die ja quasi die ganze Welt mit 32-Bit-Tiefenpuffer rendern.
Mirror hat geschrieben: 11.05.2024, 13:21Da der höchste Wert gleich eins gesetzt wird. Hundertprozentig sicher bin ich aber nicht.
AFAIK musst du die Far Clipping Plane nicht auf 1 setzen; Unendlich geht bspw. auch.

Ein Bit wird auch durch das Vorzeichen „verschwendet“. OpenGL optimiert das berüchtigterweise dadurch, dass der Clip Space von -1 bis +1 geht. Ich habe noch nie jemand getroffen, der das gut findet – zumal Tricks wie Outerras dann nicht mehr funktionieren. Alle hassen es und nehmen lieber den Verlust des Sign Bits in Kauf.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Mirror
Establishment
Beiträge: 308
Registriert: 25.08.2019, 05:00
Alter Benutzername: gdsWizard
Kontaktdaten:

Re: Depth Buffer mit 64 Bit

Beitrag von Mirror »

Danke Krishty. Wie zauberst Du nur sowas aus dem Ärmel ? Das könnte gehen. Aber auch an die anderen ein Danke.
Hat den StormWizard 1.0 und 2.0 verbrochen. https://mirrorcad.com
Mirror
Establishment
Beiträge: 308
Registriert: 25.08.2019, 05:00
Alter Benutzername: gdsWizard
Kontaktdaten:

Re: Depth Buffer mit 64 Bit

Beitrag von Mirror »

Leider hat das nicht die Auswirkungen auf mein Rasterproblem gehabt, wie ich es mir vorgestellt habe. Ich habe deshalb einen neuen Thread aufgemacht.
Hat den StormWizard 1.0 und 2.0 verbrochen. https://mirrorcad.com
Mirror
Establishment
Beiträge: 308
Registriert: 25.08.2019, 05:00
Alter Benutzername: gdsWizard
Kontaktdaten:

Re: Depth Buffer mit 64 Bit

Beitrag von Mirror »

TomasRiker hat geschrieben: 11.05.2024, 13:05 Ich glaube nicht. Wäre wahrscheinlich auch nutzlos, wenn die GPUs intern mit 32-Bit-Floats rechnen. Dann hättest du nichts von der höheren Genauigkeit.
Bei CUDA gibt es auch die Möglichkeit 64 Bit ( double ) zu verwenden. Krishty hatte es auch schon mal geschrieben.
Hat den StormWizard 1.0 und 2.0 verbrochen. https://mirrorcad.com
Matthias Gubisch
Establishment
Beiträge: 493
Registriert: 01.03.2009, 19:09

Re: Depth Buffer mit 64 Bit

Beitrag von Matthias Gubisch »

Klar können GPUs auch mit 64-Bit Doubles rechnen, sind dann aber entsprechend langsamer.

Native kann DX12 keinen 64Bit Depth buffer, da müsstest du vermutlich schon selber anfangen und die rasterization im compute shader machst.
Dann fällst du aber wieder auf das Problem das 64bit atomics nur sehr sporadisch unterstüzt werden (AFIAK nur für integer)
Bevor man den Kopf schüttelt, sollte man sich vergewissern einen zu haben
Benutzeravatar
Schrompf
Moderator
Beiträge: 5074
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas
Wohnort: Dresden
Kontaktdaten:

Re: Depth Buffer mit 64 Bit

Beitrag von Schrompf »

64bit-Atomics gibt's nur für Integer, hab ich auch gehört. Aber das Schöne an IEEE 754 floats ist, dass Gleich, Ungleich und sogar Größer/Kleiner-Tests auch funktionieren, wenn man die Floats bitweise als Integer betrachtet. Min/Max-64-Atomics gehen also auch für Floats :-)
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Benutzeravatar
Krishty
Establishment
Beiträge: 8316
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Depth Buffer mit 64 Bit

Beitrag von Krishty »

Schrompf hat geschrieben: 12.09.2024, 12:53 64bit-Atomics gibt's nur für Integer, hab ich auch gehört. Aber das Schöne an IEEE 754 floats ist, dass Gleich, Ungleich und sogar Größer/Kleiner-Tests auch funktionieren, wenn man die Floats bitweise als Integer betrachtet. Min/Max-64-Atomics gehen also auch für Floats :-)
Das geht aber nur, wenn man nicht 0 überschreitet, denn sonst müsstest du von Sign-Magnitude in Zweierkomplement umrechnen. Damit sind OpenGL-Style-Depth-Buffers (Tiefe -1…+1) raus. Kein Showstopper, sollte man aber von vornherein wissen.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Schrompf
Moderator
Beiträge: 5074
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas
Wohnort: Dresden
Kontaktdaten:

Re: Depth Buffer mit 64 Bit

Beitrag von Schrompf »

Oh stimmt, floats haben ja ein explizites Vorzeichenbit und kein Zweierkomplement. Guter Hinweis!

Öhm... fällt mir gerade so auf: der Unreal-Rasterizer benutzt 64er-Atomics ja, um Tiefe und Farbe race-condition-frei schreiben zu können. Das heißt ja aber auch, dass die nur 32Bit für den Farbwert haben? Wie machen die dann HDR? Irgendsonen Fancy Shared-Exponent-Trick wie HL2 damals?
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Matthias Gubisch
Establishment
Beiträge: 493
Registriert: 01.03.2009, 19:09

Re: Depth Buffer mit 64 Bit

Beitrag von Matthias Gubisch »

Schrompf hat geschrieben: 12.09.2024, 17:19 Öhm... fällt mir gerade so auf: der Unreal-Rasterizer benutzt 64er-Atomics ja, um Tiefe und Farbe race-condition-frei schreiben zu können. Das heißt ja aber auch, dass die nur 32Bit für den Farbwert haben? Wie machen die dann HDR? Irgendsonen Fancy Shared-Exponent-Trick wie HL2 damals?
Hier kann ich helfen
Der Trick ist dass der Unreal Rasterizer gar keine Farbe schreibt sondern eine Triangle ID

Das Ergebnis ist dann ein soganannter VisibilityBuffer mit 32 bit Tiefe in den oberen Bits und 32 Bit Triangle ID in den unteren Bits
Aus der TriangleID lässt sich dann später das tatsächliche Dreieck + Material ableiten welches dann in einem ComputeShader berechnet wird.

Das macht die Szene unabhängiger von der Geometriemenge da im Rasterizerpass der PixelShader minimal ist und nur ein 64Bit wert schreibt (ich weis Unreal hat auch einen ComputeShader Rasterizer aber das Prinzip ist das gleiche)

Später führt man dann einfach für jeden Pixel einen Compute Shader aus.

Ich mache das in meiner Engine zum Beispiel so dass ich einen Radix Sort auf die Materialen mache und mir die PixelCoordinaten speichere und dann jeden Shader entsprechend der Anzahl Pixel starte.

Unreal Started ihre ComputeShader Fullscreen und checkt dann als erstes ob in dem Tile das die aktuelle Gruppe bearbeiten soll das Material überhaupt vorkommt. Wenn nicht wird die Gruppe sofort beendet.

Soweit in kürze, ich kann das gerne mal ausführlicher erklären wenn ich es mal wieder zum Stammtisch schaffe ;)
Bevor man den Kopf schüttelt, sollte man sich vergewissern einen zu haben
Antworten