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

30.03.2011, 10:38

Early-Z-Culling

Hi, was genau ist Early-Z-Culling? Ich nehme mal an, dass das was ganz anderes ist, also ein einfacher Tiefen-Test.
Und kann man das nur mit Shadern umsetzen? Und wie kann man es mit Shadern umsetzen?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

30.03.2011, 10:49

Early-Depth-Culling ist einfach eine Optimierung die die Grafikkarte unter bestimmten Gegebenheiten machen kann. Der Depth-Test findet normal ja erst nach dem PixelShader statt. Wenn aber der Shader die Fragment-Depth nicht verändert (bzw. mit D3D11 nur in konservativer Weise), etc. kann die Grafikkarte den Depth-Test schon vor dem PixelShader (also Early ;)) machen und dadurch die Ausführung des Shaders für Fragmente die sowieso nicht sichtbar sind sparen. Der Early-Depth-Test kann, vor allem wenn du Fragment-Bound bist (was heute eher der Regelfall ist), sehr viel ausmachen. Darum haben sich so Techniken entwickelt wie z.B. dass man möglichst Front-To-Back oder überhaupt zuerst einmal nur die Tiefe der ganzen Szene rendert (manche Grafikkarten (NVIDIA) haben auch extra dafür bestimmte Optimierungen) und erst dann mit dem nun schon gefüllten DepthBuffer weitermacht. Wie, wann, wo und ob die Grafikkarte Early-Depth-Culling macht kannst du nicht beeinflussen, das entscheidet der Grafiktreiber. Die genauen Kriterien die dafür erfüllt sein müssen findest du in den entsprechenden Manuals. Grundsätzlich sind das so Dinge wie
  • Shader ändert die Fragment-Depth nicht (bzw. nur in konservativer Art, in D3D11 gibts dafür SV_DepthGreater bzw. SV_DepthLessEqual)
  • Der Shader verwendet kein clip() oder discard
  • Alpha-Testing ist aus
  • Der DepthBuffer wurde mit Clear() gelöscht
  • ...

Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von »dot« (30.03.2011, 11:32)


LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

3

31.03.2011, 10:03

Ok danke, vielleicht kann ich dahin gehend meine Shader noch etwas weiter optimieren. Wundert mich aber schon, dass jeder Pixel Shader immer erst komplett durchgerechnet wird, auch dann, wenn der Pixel am Ende sowieso durch den Tiefen-test durchfällt.
Selbst wenn man im Shader mit "discard" den Pixel raus schneidet (z.B. beim Alpha Test).

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

31.03.2011, 10:19

Ok danke, vielleicht kann ich dahin gehend meine Shader noch etwas weiter optimieren. Wundert mich aber schon, dass jeder Pixel Shader immer erst komplett durchgerechnet wird, auch dann, wenn der Pixel am Ende sowieso durch den Tiefen-test durchfällt.
Selbst wenn man im Shader mit "discard" den Pixel raus schneidet (z.B. beim Alpha Test).

Naja wenn der Shader die Tiefe des Pixels ändert gehts ja nicht anders. Wenn der Shader discard oder clip() verwendet wird der Pixel natürlich nichtmehr getestet. Das Problem dabei ist nur dass die GPU ohne den Shader auszuführen ja nicht wissen kann welcher Tiefenwert nun in den Depth-Buffer geschrieben werden soll. Die genauen Infos stehen wie gesagt in den entsprechenden Manuals, z.B. dem NVIDIA GPU Programming Guide...

Werbeanzeige