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

BlazeX

Alter Hase

  • »BlazeX« ist der Autor dieses Themas

Beiträge: 478

Wohnort: DD

Beruf: Maschinenbau-Student

  • Private Nachricht senden

1

28.11.2010, 17:36

[Erledigt] Geht das mit ComputeShadern?

Hi Leute!
Ich habe vor ein Tool zu schreiben, das eine Relaxed Cone Map aus einer Height Map berechnet.
Bisher habe ich eine Version als PixelShader geschrieben, die allerdings nicht läuft. Das ist einfach zu viel pro Pixel. Dabei hängt sich jedesmal der Treiber auf.
Da ich auf die GPU-Beschleunigen nicht verzichten will, dachte ich an ComputeShader.
Allerdings habe ich eine Einschränkung: DirectX 10 Hardware. :pinch:

Geht das dann überhaupt?
Wenn ja, gleich die nächste Frage: Wie mache ich aus Texture2D-Resourcen ComputeShader (Profile cs_4_0) freundliche Resourcen?
Und wie kann ich "einzelne Texel" lesen?

Vielen Dank im Voraus! :)

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »BlazeX« (29.11.2010, 16:10)


dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

28.11.2010, 19:09

Natürlich geht das mit ComputeShadern. Die Frage ist aber warum hängt sich dein PixelShader auf, das find ich merkwürdig weil eigentlich sollte das ganze doch nicht sooo aufwändig sein? Du kannst in einem ComputeShader ganz normal auf Texturen zugreifen.

BlazeX

Alter Hase

  • »BlazeX« ist der Autor dieses Themas

Beiträge: 478

Wohnort: DD

Beruf: Maschinenbau-Student

  • Private Nachricht senden

3

28.11.2010, 19:36

Der Treiber hängt sich auf, weil die Grafikkarte nicht mehr reagiert. Die berechnet pro Pixel bei einer Textur der Größe 256x256 etwa 256*256*128 mal verschiedene Sachen und vergleicht diese mit einander. Das dürfte zu viel sein.

Gut, dass Texture2D als Input funktioniert. Aber wie steht es mit dem Output? Ich bräucht da wieder eine Texture2D.
cs_4_0 unterstützt aber nur Buffer als Output und CopyResource von Buffer zu Texture2D geht nicht.

Wie löst man das Problemchen?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

28.11.2010, 19:38

Warum musst du 256x256x128 = 2^23 Vergleiche pro Pixel machen, das ist natürlich viel zu viel, im NVIDIA Artikel machen die nur 128!? Ich vermute mal du übersiehst dass dein Shader ja bereits pro Pixel läuft!?

BlazeX

Alter Hase

  • »BlazeX« ist der Autor dieses Themas

Beiträge: 478

Wohnort: DD

Beruf: Maschinenbau-Student

  • Private Nachricht senden

5

28.11.2010, 19:46

Du übersiehst, dass im NVIDIA Artikel kein kompletter Shader angegeben ist. depth2relaxedcone wird für jeden Pixel kombiniert mit jedem Offset aufgerufen. Und jedes Offset heißt 256*256 mal den ConeRadius berechnen.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

6

28.11.2010, 19:48

... edit ...
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]

BlazeX

Alter Hase

  • »BlazeX« ist der Autor dieses Themas

Beiträge: 478

Wohnort: DD

Beruf: Maschinenbau-Student

  • Private Nachricht senden

7

28.11.2010, 20:09

Mir kommt gerade eine Idee: Im CS die ConeRations berechnen. Als Output einen UAV-Buffer (Größe=TexWidth * TexHeight) nutzen. Im VS ein FullscreenQuad (Fullscreen = Texturgröße) rendern und im PS den ConeRatio des Output-Texels (Output des PS: Texture2D) aus dem USV-Buffer laden.
Sollte theoretisch mit hlsl_4_0 gehen, oder?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

8

28.11.2010, 21:00

Du kannst im ComputeShader über eine RWTexture2D auch in Texturen schreiben, ich würde das ganze ausschließlich über ComputeShader lösen, das erlaubt sicherlich die performanteste Implementierung. Wenn ich das richtig verstehe musst du für jeden Pixel zu jedem anderen Pixel einen Ray tracen!? Wie man das jetzt am besten macht um die Hardware optimal zu nutzen müsste man ein wenig überlegen. Ein naiver Ansatz wäre mal für alle Pixel parallel jeweils einen Strahl zu tracen und das eben 256x256 Mal zu machen und jeweils die Zwischenergebnisse zu buffern. Vielleicht/Vermutlich wärs aber besser das anders anzugehen und das shared Memory zu nutzen um massiv Bandbreite zu sparen. Aber da müsste man sich mal ein wenig genauer Gedanken drüber machen und evtl. n paar Tests durchführen...

BlazeX

Alter Hase

  • »BlazeX« ist der Autor dieses Themas

Beiträge: 478

Wohnort: DD

Beruf: Maschinenbau-Student

  • Private Nachricht senden

9

28.11.2010, 21:18

Allerdings ist RWTexture2D auf DX10er Hardware nicht verfügbar. :cursing:
Wahrscheinlich wird es doch CPU-Arbeit. ;(

EDIT: Meine Idee von vorhin funktioniert übrigens auch nicht, da ich per PixelShader keine UAVs nutzen und gleichzeitig auf ein RenderTarget schreiben kann.

EDIT2: Da die Buffer im CS funktionieren, kommt mir eine neue Idee.
CPU:
- Alle Pixel als Source durchgehen.
-- Die Pixelkoordinaten per ConstantBuffer auf GPU laden
-- ComputeShader starten:
-- - Sourcekoordinaten per CB erhalten
-- - alle Pixel als Destination durchgehen
-- -- ConeRatio für alle Destinations berechnen
-- - Beste ConeRatio des SourcePixel in UAV (genau 1 float groß) speichern
-- Ergebnis (ConeRatio in UAV) auslesen und in ResultTexture (Endgültige Relaxed Cone Map) an die Stelle der Sourcekoordinaten schreiben

Das dürfte dann immernoch schneller sein, als nur durch CPU berechnet. :thumbsup:
Wenns klappt :wacko:
Morgen irgendwann. Gute Nacht! :sleeping:

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »BlazeX« (28.11.2010, 21:34)


dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

10

28.11.2010, 21:32

Evtl. kannst du auf eine Texture über ein entsprechendes View wie auf einen StructuredRWBuffer oder einen ByteAddressBuffer zugreifen!?

Werbeanzeige