2010-10-12 7 views
12

Kann ich Shader für die Berechnung einiger Werte verwenden und sie dann zur weiteren Verwendung zurückgeben?Verwenden von Shader für Berechnungen

Zum Beispiel sende ich Mesh auf GPU, mit einigen Parametern darüber, wie es geändert werden soll (Position der Scheitelpunkte ändern), und zurück resultierende Mesh? Ich sehe das eher unmöglich, weil ich keine Variable für die Kommunikation von Shadern zu CPU gesehen habe. Ich benutze GLSL, also gibt es nur Uniform, Attribute und Unterschiede. Sollte ich ein Attribut oder eine Uniform verwenden, wären sie nach dem Rendern noch gültig? Kann ich die Werte dieser Variablen ändern und sie in der CPU lesen? Es gibt Methoden zum Mapping von Daten in GPU, aber würden diese geändert und gültig sein?

So denke ich darüber nach, obwohl es auch andere Wege geben könnte, die mir unbekannt sind. Ich würde mich freuen, wenn mir jemand dies erklären könnte, da ich gerade ein paar Bücher über GLSL gelesen habe und jetzt möchte ich komplexere Shader programmieren, und ich möchte keine Methoden lindern, die zu dieser Zeit unmöglich sind.

Dank

Antwort

6

Große Frage! Willkommen in der schönen neuen Welt des General-Purpose-Computing auf Graphics Processing Units (GPGPU).

Was Sie tun möchten, ist mit Pixel-Shadern möglich. Sie laden eine Textur (d. H. Daten), wenden einen Shader an (um die gewünschte Berechnung auszuführen) und verwenden dann Render to Texture, um die resultierenden Daten von der GPU an den Hauptspeicher (RAM) zu übergeben.

Es gibt Werkzeuge für diesen Zweck geschaffen, vor allem OpenCL und CUDA. Sie helfen sehr GPGPU, so dass diese Art der Programmierung fast wie CPU-Programmierung aussieht.

Sie benötigen keine 3D-Grafik-Erfahrung (obwohl immer noch bevorzugt :)). Sie müssen keine Tricks mit Texturen machen, Sie laden nur Arrays in den GPU-Speicher. Verarbeitungsalgorithmen werden in einer leicht modifizierten Version von C geschrieben. Die neueste Version von CUDA unterstützt C++.

Ich empfehle mit CUDA zu starten, da es die reifste ist: http://www.nvidia.com/object/cuda_home_new.html

+0

Wie Testalino schrieb, ist CUDA nVidia-spezifisch. Wenn ich Radeon betreibe, würde ich nicht langsamer werden, oder ist es sogar möglich, CUDA auf Radeon auszuführen? Ist OpenCL weniger effektiv oder warum empfehlen Sie es nicht als erstes zu verwenden? – Raven

+0

@Raven Ja, CUDA ist vollständig nVidia-spezifisch.Wenn ich wählen sollte, würde ich CUDA + nVidia bevorzugen. Da Sie ATI haben, müssen Sie OpenCL auswählen. Soweit ich weiß, ist CUDA ausgereifter, Werkzeuge sind besser usw. In Bezug auf die Leistung denke ich nicht, dass es einen signifikanten Unterschied gibt. – Andrey

+0

@Raven, ich würde Direct Compute wählen, wenn ich bereits Direct X verwende, Open CL, wenn ich Open GL verwende. Ich würde CUDA niemals aus dem angegebenen Grund verwenden. Sie können nicht sicherstellen, dass jeder, der Ihre Anwendung verwendet, über eine NVIDIA-Karte verfügt. – testalino

0

Meine beste Vermutung wäre, Sie zu BehaveRT zu senden, die eine Bibliothek nutzen GPUs für behavorial Modelle erstellt ist. Ich denke, dass, wenn Sie Ihre Änderungen in der Bibliothek formulieren können, könnten Sie von seiner Abstraktion profitieren

Über die Daten hin und her zwischen Ihrer CPU und GPU, ich lasse Sie durchsuchen die Dokumentation, ich bin mir nicht sicher

2

Dies ist auf modernen Grafikkarten mit Open CL, Microsoft Direct Compute (Bestandteil von DirectX 11) oder CUDA problemlos möglich. Die normalen Shader-Sprachen werden verwendet (GLSL, HLSL zum Beispiel). Die ersten beiden arbeiten sowohl an Nvidia- als auch an ATI-Grafikkarten, Cuda ist Nvidia exklusiv.

Dies sind spezielle Bibliotheken zum Rechnen auf der Grafikkarte. Ich würde dafür keine normale 3D-API verwenden, obwohl dies mit einigen Problemumgehungen möglich ist.

1

Jetzt können Sie Shader-Puffer Objekte in OpenGL verwenden, um Werte in Shadern zu schreiben, die in Host gelesen werden kann.