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

21.10.2013, 21:37

Vertex Buffer mit Compute Shader manipulieren

Hi,
mit OpenCL kann man für GL, D3D9, D3D10 und D3D11 einen Vertex-Buffer manipulieren.
Im OpenCL compute shader hat man dann einfach globalen pointer auf eine Struktur, die genau so aufgebaut ist, wie ein Vertex.

Wie kann man das mit GLSL/HLSL Compute Shadern machen? Da kenne ich nur die RWBuffer bzw. RWStructuredBuffer. Kann man die auch irgendwie auf Vertex-Buffer abbilden?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

21.10.2013, 21:42

Ich versteh das Problem nicht ganz, du erzeugst eben ein passendes Unordered Access View für deinen Buffer und bindest diesen dann eben z.B. als RWBuffer bzw. RWStructuredBuffer usw...

Legend

Alter Hase

Beiträge: 731

Beruf: Softwareentwickler

  • Private Nachricht senden

3

21.10.2013, 22:00

Ich glaube dann muss man hier erklären, dass man einerseits bei DirectX einen Buffer erstellt und diesen dann durch das Erstellen von Views für verschiedene Aufgaben fit macht.
"Wir müssen uns auf unsere Kernkompetenzen konzentrieren!" - "Juhu, wir machen eine Farm auf!"

Netzwerkbibliothek von mir, C#, LGPL: https://sourceforge.net/projects/statetransmitt/

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

4

21.10.2013, 22:00

Stimmt, daran habe ich gar nicht gedacht. Bisher hatte ich die UAVs immer nur mit den Shader Ressourcen (meine C++ Klasse für die RWBuffer) zusammen in eine Klasse gepackt.

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

5

23.10.2013, 21:14

Ich glaube dann muss man hier erklären, dass man einerseits bei DirectX einen Buffer erstellt und diesen dann durch das Erstellen von Views für verschiedene Aufgaben fit macht.

Ja, im Grunde weiß ich das, nur ich hatte das irgendwie im Bezug auf Vertex-/ Index-Buffer ausgeblendet ^^

Noch eine Frage zu den Views: Bisher war ich der Auffassung, dass wenn ich mit einem Compute-Shader einen Buffer durch einen UAV schreibe, dann eine Kopie von dem Buffer mache und diese Kopie mit einem SRV in z.B. einem Pixel Shader verwenden kann.
Der Grund warum ich das kopiere ist, weil ich davon ausging, dass sich der Buffer der geschrieben wird mit einem parallel laufenden Pixel-Shader in die Quere kommen könnte.
Aber wahrscheinlich hätte ich das gar nicht machen brauchen, oder?! Also einfach einen Buffer und ein UAV und ein SRV dafür erstellen, richtig??

Legend

Alter Hase

Beiträge: 731

Beruf: Softwareentwickler

  • Private Nachricht senden

6

23.10.2013, 23:34

Ich erwarte in so einem Fall, dass DirectX die ShaderResourceView nicht benutzen mögen wird, solange der Buffer noch per UnorderedAccessView gebraucht wird. D.h. du solltest einen Buffer mit den beiden Views erstellen und musst halt darauf achten welche View wann wo gesetzt ist. Und dann ist es Aufgabe von DirectX oder drunter liegenden Schichten zu warten, bis der Compute Shader durch ist, bevor der Pixel Shader loslegt. Mal abgesehen davon, dass auch heute nach meinem Kenntnisstand eh selten bis gar nicht verschiedene Shader wirklich gleichzeitig laufen.
"Wir müssen uns auf unsere Kernkompetenzen konzentrieren!" - "Juhu, wir machen eine Farm auf!"

Netzwerkbibliothek von mir, C#, LGPL: https://sourceforge.net/projects/statetransmitt/

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

7

23.10.2013, 23:50

Versteh ich das richtig, du willst einen Buffer im selben Dispatch bzw. Draw Call gleichzeitig als Input und als Output nutzen!? Oder was genau meinst du mit einem "parallel laufenden Pixel Shader"?

Sc4v

Alter Hase

Beiträge: 376

Beruf: Student

  • Private Nachricht senden

8

24.10.2013, 01:32

Mit OpenGL geht das einfach indem du den ArrayBuffer als Shader Storage Buffer bindest

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

9

24.10.2013, 10:18

Versteh ich das richtig, du willst einen Buffer im selben Dispatch bzw. Draw Call gleichzeitig als Input und als Output nutzen!?

Was ich damit meine ist folgendes: ich mache ein Dispatch, danach ein Draw Call und ich weiß ja nicht, wie D3D das 'schedule'n kann. Ich weiß also nicht, ob der Pixel Shader dann parallel zu dem Compute Shader laufen wird, obwohl ich das sequenziell aufgerufen habe.

Aber ich nehme mal an, dass 'Legend' damit recht hat. Ich werde das also bei mir anpassen, sodass ich einen Buffer mit mehreren Views verwenden kann.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

10

24.10.2013, 10:45

Versteh ich das richtig, du willst einen Buffer im selben Dispatch bzw. Draw Call gleichzeitig als Input und als Output nutzen!?

Was ich damit meine ist folgendes: ich mache ein Dispatch, danach ein Draw Call und ich weiß ja nicht, wie D3D das 'schedule'n kann. Ich weiß also nicht, ob der Pixel Shader dann parallel zu dem Compute Shader laufen wird, obwohl ich das sequenziell aufgerufen habe.

Ich bezweifle, dass das auf irgendwelcher aktuellen Hardware im Moment tatsächlich Compute Kernel und Grafikpipeline parallel betrieben werden können. Und spätestens, wenn zwischen deinem Compute Shader und deinem Pixel Shader eine Datenabhängigkeit besteht, wie in deinem Fall, muss bereits rein prinzipiell auf jeden Fall serialisiert werden...

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »dot« (24.10.2013, 10:51)


Werbeanzeige