PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Sinn oder Unsinn der DX11-Shader-Architektur?


Matti
2011-05-13, 00:59:05
Das Zusammenspiel von Vertex- und Pixel-Shader ist für mich logisch und sinnvoll. Mit DX10 wurde dazwischen noch der Geometry-Shader eingefügt und mit DX11 die Tesselation-Shader. Damit sieht die Pipeline jetzt so aus:

Vertex => Tesselation => Geometry => Pixel

Meiner Meinung nach ist das eine extrem umständliche Architektur. Besser wäre, wenn es einen Shader gäbe, der Polygone direkt mit 3D-Koordinaten erzeugen kann. Er müßte vor dem Vertex-Shader kommen und ich nenne ihn mal "Geometry-Creation-Shader". So daß die Pipeline so aussieht:

Geometry-Creation => Vertex => Pixel

Imo wäre so eine Pipeline einfacher zu programmieren und wäre sogar flexibler, als die aktuelle DX11-Pipeline. Was ist eure Meinung?

BAGZZlash
2011-05-13, 09:46:27
Vielleicht hast Du noch nicht so ganz durchschaut, wer hier was wie macht.

Du hast Deine Meshes (oder, im weitesten Sinne: Die Beschreibung Deiner dreidimensionalen Welt). Diese übergibst Du an den Vertexshader.

Auf Basis dieser primitiven Weltbeschreibung erzeugt der Tesselator zusätzliche Polygone, die die Meshes "feiner aufgelöst" darstellt. Der Tesselator arbeitet (beispielsweise) auf Basis der Distanz von Objekt zu Kamera, und damit weitgehend selbstständig. Eine Rückgabe der Vertices an den Vertexshader sollte in der Regel nicht erforderlich sein.

Nachdem die Welt also in der gewünschten Weise aufgelöst ist, kommt der Geometry Shader und modifiziert ggf. die fertige Geometrie, beispielsweise berechnet er Einwirkungen physikalischer Effekte.

Anschließend macht der Pixelshader seine Arbeit.


Eine dem Vertexshader vorgeschaltete Stufe, wie Du sie vorschlägst, macht Sinn, wenn man beispielsweise prozedurale Geometrie erzeugen will, wie es momentan in der Demoszene en vogue ist. Nach dem Vertexshader dann Tesselator und Geometryshader auszuführen, hat aber auch dann immer noch seinen Sinn.

Spasstiger
2011-05-13, 16:33:45
Der Tesselator arbeitet (beispielsweise) auf Basis der Distanz von Objekt zu Kamera, und damit weitgehend selbstständig.
Genau, vor der Vertex-Shader-Stage hat man überhaupt keine Information darüber, wie groß ein Primitive im Screenspace ist.
Außerdem würde man der Vertex-Shader-Stage mehr Arbeit aufhalsen, wenn man bereits davor tesselliert.

Matti
2011-05-13, 23:12:49
Der Tesselator arbeitet (beispielsweise) auf Basis der Distanz von Objekt zu Kamera

Das wäre ja auch mit einem Geometry-Creation-Shader kein Problem, weil man die Kamera-Position in einer Uniform-Variable übergeben könnte.

Außerdem würde man der Vertex-Shader-Stage mehr Arbeit aufhalsen, wenn man bereits davor tesselliert.

Und derzeit muß der Tesselation- & Geometry-Shader die Arbeit machen. Z.B. muß man im Geometry-Shader ja manuell ein 3D-Displacement in ein 2D-Displacement umrechnen. Also am Ende ist der Rechenaufwand wahrscheinlich ungefähr gleich.

ENKORE
2011-05-13, 23:15:45
Afaik gibts in OpenGL Geometryshader. Da kommen auf der einen Seite Vertices rein und auf der anderen Seite welche raus. Was du im Shader damit machst ist egal, wird aber meistens für Tesselation benutzt. Damit kann man aber auch Terrain erzeugen oder Instancing betreiben. Eigentlich müssten sogar Fraktale kein Problem sein, da nicht festgelegt ist, wieviel Vertices pro Eingangsvertices rauskommen dürfen. Geht das unter DX etwa nicht?

Matti
2011-05-13, 23:21:28
Die Pipeline ist in DX und OpenGL die gleiche. Ich hab nur DX als Beispiel genommen, weil die meisten Leute damit mehr anfangen können. Aber ich bevorzuge übrigens OpenGL für meine Programme.

Matti
2015-09-18, 18:50:22
Inzwischen sind seit meiner ursprünglichen Frage 4 Jahre vergangen ;) und ich habe verstanden, warum der Tessellation-Shader nach dem Vertex-Shader kommt. Aber warum der Geometry-Shader NACH der Tessellation kommt, ist mir immernoch nicht klar. Imo müßte die Pipeline so aussehen:

Geometry => Vertex => Tesselation => Pixel

Kann mir jemand ein konkretes Beispiel nennen, wo man den Geometry-Shader nach Vertex-/Tessellation-Shader braucht?

del_4901
2015-09-18, 19:00:29
PointSprites, ShadowVolumes, Voxelization etc.

Und fuer alles davor gibt es ja Compute.

Matti
2015-09-18, 19:06:23
Für Point-Sprites braucht man es nicht, da gibt's ne Extension, die ganz ohne Shader auskommt.

Aber du hast Recht, für Shadow-Volumes braucht man es NACH der Tessellation. Endlich konnte jemand meine 4 Jahre alte Frage klären :)

del_4901
2015-09-19, 13:37:44
Für Point-Sprites braucht man es nicht, da gibt's ne Extension, die ganz ohne Shader auskommt.

Aber du hast Recht, für Shadow-Volumes braucht man es NACH der Tessellation. Endlich konnte jemand meine 4 Jahre alte Frage klären :)
Point Sprites gibt es in DX11 nicht mehr