Wie erzeugt man eine Zufallszahl in HLSL?
Ich frage, weil ich versuchen möchte, GPU-Raytracing . Sie müssen zufällige Richtungen in einem Pixel-Shader erzeugen. Ich möchte also randFloat()
, dass das Ergebnis eine Zufallszahl zwischen -1 und +1 ist.
Wie ist der Umgang mit dem HLSL- Noise- Befehl? Die Dokumente sagen, dass es aus HLSL 2.0 und höher entfernt wurde. Warum ?
Ich habe über einen Ansatz gelesen, bei dem Sie eine Textur mit zufälligen Werten füllen und dann in jedem Scheitelpunkt eine Texturkoordinate haben, die einen Index für diese Textur enthält. Aber das ist per Vertex , ich brauche eine Anweisung, die ich im Pixel-Shader aufrufen kann. Außerdem erfordert dieser Ansatz das "Neueinordnen" der Texkoordinaten pro Scheitelpunkt, wenn Sie unterschiedliche Werte für jeden Frame wünschen, und dies erfordert ein Aktualisieren des Scheitelpunktpuffers für jeden Frame (was teuer sein kann!).
Wie kann man mit Detail billig eine Zufallszahl auf der GPU generieren?
Antworten:
Pseudozufallszahlen in einem Pixel-Shader sind nicht einfach zu erhalten. Ein Pseudozufallszahlengenerator in der CPU hat bei jedem Aufruf der Funktion einen Zustand, aus dem er liest und in den er schreibt. In einem Pixel-Shader ist das nicht möglich.
Hier sind einige Optionen:
Verwenden Sie einen Compute-Shader anstelle eines Pixel-Shaders. Sie unterstützen den Lese- und Schreibzugriff auf einen Puffer, sodass Sie jedes Standard-PRNG implementieren können.
Stichprobe aus einer oder mehreren Texturen mit zufälligen Daten, basierend auf einem Parameter wie der Position des Bildschirmbereichs. Sie können auch einige Berechnungen an der Position durchführen, bevor Sie sie zum Nachschlagen in die Textur verwenden. Auf diese Weise können Sie die Textur wiederverwenden, wenn die Mathematik eine Shader-Konstante enthält, die nach dem Zufallsprinzip pro Draw aufgerufen wird.
Finden Sie eine mathematische Funktion der Position des Bildschirmbereichs, die Ergebnisse liefert, die 'zufällig genug' sind.
Eine schnelle Google-Suche fand diese Seite mit diesen Funktionen:
quelle
So generiere ich mit einem Compute-Shader Pseudo-Zufallszahlen für meine Partikeleffekte. Ich bin mir nicht sicher, wie zufällig dieser Code ist, aber er funktioniert gut genug für meine Zwecke.
Der Schlüssel, um jedem GPU-Kernel seine eigene zufällige Sequenz zuzuweisen, besteht darin, dem Compute-Shader einen anfänglichen zufälligen Startwert von der CPU zuzuführen. Jeder Kernel verwendet dann diesen Startwert, um den Zahlengenerator unter Verwendung seiner Thread-ID als Zählung zu durchlaufen. Von dort sollte jeder Thread seinen eigenen eindeutigen Startwert haben, um eindeutige Werte zu generieren.
quelle