ich hab grad angefangen, ein bisschen an einem Vertex-Shader rumzuspielen, dabei sind mir mehrere Fragen durch den Kopf gegangen:
1. Kann man mit Vertex-Shadern seine Physik-Engine von der GPU berechnen lassen, und ist das dann genau so schnell, als hätte man es mit cuda programmiert.
Ich wollte mich nämlich an eine kleine Physik-Engine rantasten und weiss noch nicht, wie ich die Rechenlast von der CPU auf die GPU verlagern soll, dabei wollte ich ausschliesslich Sachen verwenden, die ich uneingeschränkt verwenden darf. Soweit ich weiss, ist ja cuda jetzt frei, aber es wäre wohl deutlich mehr aufwand, vermute ich. Oder gibt es da schon freie, fertige Sachen für? PhysX?
2. Ich habe mir vorgenommen, demnächst VBOs zu lernen, mache momentan alles mit Displaylisten, und ich hätte gerne ein veränderbares Terrain.
Da hab ich mich gefragt, ob man nicht einfach eine Displayliste mit ner Ebene laden kann und alles andere vom Shader machen lässt, also den Anfangszustand und alle anderen Zustände des Terrains vom Shader berechnen lässt. Gehts das? Und, wie schnell ist das dann?
3. Wie kann ich meinem Shader mitteilen, wie spät es ist? Bzw. ihm eine Variable übergeben?
schönen Gruß
Vinz
_________________ "Pixel, ich bin dein Vater." -Darf Shader
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Vinz hat geschrieben:
Ich wollte mich nämlich an eine kleine Physik-Engine rantasten und weiss noch nicht, wie ich die Rechenlast von der CPU auf die GPU verlagern soll, dabei wollte ich ausschliesslich Sachen verwenden, die ich uneingeschränkt verwenden darf.
Machs auf der CPU. GPU ist deutlich komplizierter und wenn du noch keine Physikengine geschrieben hast, solltest du erstmal den einfachen weg gehen.
Vinz hat geschrieben:
Soweit ich weiss, ist ja cuda jetzt frei, aber es wäre wohl deutlich mehr aufwand, vermute ich. Oder gibt es da schon freie, fertige Sachen für? PhysX?
Für PhysX hab ich noch keine Linux-Treiber gesehen. Cuda geht, aber ich würde wenn dann zu OpenCL raten.
Vinz hat geschrieben:
2. Ich habe mir vorgenommen, demnächst VBOs zu lernen, mache momentan alles mit Displaylisten, und ich hätte gerne ein veränderbares Terrain.
Mach VBOs und änder die Geometrie. Das ist ausreichend effizient. Den veränderten Zustand immer im Shader zu berechnen ist auf dauer nicht effizient. Du kannst zwar ne Heightmap in eine Textur legen und danach die Vertices des Terrains verschieben, aber das limitiert dich sehr schnell in der Auflösung.
Vinz hat geschrieben:
3. Wie kann ich meinem Shader mitteilen, wie spät es ist? Bzw. ihm eine Variable übergeben?
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Machs auf der CPU. GPU ist deutlich komplizierter und wenn du noch keine Physikengine geschrieben hast, solltest du erstmal den einfachen weg gehen.
Ok, aber könnte man es hinbekommen, dass die Physik mittels Shader von der GK berechnet wird, wobei sich dann auch mehrere Prozessoren der GPU darum kümmern würden, also dass es deutlich schneller wir, als auf der CPU?
Lord Horazont hat geschrieben:
Den veränderten Zustand immer im Shader zu berechnen ist auf dauer nicht effizient. grüße
Leuchtet mir ein, aber wie ist es, wenn die zu zeichnende Oberfläche sich fortlaufen verändert (Bsp: Wasseroberfläche) bzw. kann man dem Shader nicht mitteilen, dass, wenn sich das Terrain gerade nicht verändert, er nix zu berechnen braucht, und auf abgespeicherte Werte zugreifen soll?
_________________ "Pixel, ich bin dein Vater." -Darf Shader
Den veränderten Zustand immer im Shader zu berechnen ist auf dauer nicht effizient. Du kannst zwar ne Heightmap in eine Textur legen und danach die Vertices des Terrains verschieben, aber das limitiert dich sehr schnell in der Auflösung.
Shader#Beispiel:_Heightmap-Terrain Beispiel: Heightmap-Terrain Angenommen wir benötigen für jeden Vertex eine Position, eine Normale und zwei Sets von Texturkoordinaten, also insgesamt 10 Floats bzw. 40 Bytes. Bei einer Heightmapgröße von 4096x4096 benötigen wir also 640 Mb Speicher. Dies ist also nicht wirklich sinnvoll, insbesondere da viele Grafikkarten nur 512, 256 oder gar nur 128 Mb Speicher haben. Dies ist also mit der festen Funktionspipeline nicht praktikabel zu lösen.
Gewöhnlich rendert man das Terrain nicht am Stück sondern in Blöcken von z.B. 64x64 Quads. Wir verwenden nun einen kleinen Vertexbuffer der 65x65 minimale Vertices enthält: Jeweils nur eine 2D-Position. Im Vertexshader verschieben wir die 2D-Vertices an die richtige Stelle. Die Höhe des jeweiligen Vertex wird aus der Heightmap-Textur ausgelesen und an die entsprechende Koordinate geschrieben. Auch die Vertexnormalen und Texturkoordinaten berechnet man direkt im Shader. Letztlich benötigen wir nur den kleinen Vertexbuffer, den ebenfalls sehr kleinen Indexbuffer und natürlich die Heightmaptextur. Angenommen wir verwenden 16bit Graustufen dann hat diese Textur eine Größe von 32 Mb. Dies sollte auch auf älteren Grafikkarten im Rahmen des machbaren sein. Der hier beschriebene Shader ist in der Shadersammlung verfügbar.
Im Fall eines 4096er Terrains haben wir also mal eben eine Speicherersparnis von fast 95%!!!!
Wenn sich deine Oberfläche verändert reicht es nun einfach die Heightmap zu verändern, du musst nicht sämtliche Daten neu schreiben.
Registriert: Mo Nov 08, 2010 18:41 Beiträge: 769
Programmiersprache: Gestern
Shader (also GLSL,ARB-programme,etc.) setzt man prinzipiell eher fürs Zeichnen ein, da du halt immer noch den ganzen andern 3D kram drum herum hast. (schau dir im Wiki einfach mal das Diagramm zur Shaderpipeline an) Für eine relativ "freihe" Programmierung, wie etwa für eine Physikengine benötigt, bietet sich am ehesten OpenCL an, da du hier die khronos Leute dahinter hast und dementsprechend eine höhere Verbreitung und bessere Integration in OpenGL hast. Außerdem ist es in diesen Sinne wesentlich einfacher als Shader, da du hier für CPU und GPU programmierst und der CL-Context letztenendes entscheidet ob CPU oder GPU es ausführen. (ein System mit krüppel GPU aber highend CPU ist ja heutzutage nicht selten)
Registriert: Di Okt 03, 2006 14:07 Beiträge: 1277 Wohnort: Wien
Vinz hat geschrieben:
Weiss jemand, wie man ne Fouriertransformation in den Shader bekommt?
Ich habe keine Ahnung, was die Zutaten für eine Fouriertransformation sind. Aber um Daten in den Shader zu bekommen benutzt man meistens glUniform: http://wiki.delphigl.com/index.php/glUniform
In den neueren Opengl-Versionen gibt es auch Uniform-Buffer-Objects ("UBO": http://www.opengl.org/wiki/Uniform_Buffer_Object), wo man mehrere Daten für den Shader gemeinsam streamen kann. Da kann ich aber keine Auskunft geben, weil ich so etwas noch nicht gemacht habe.
Also es geht mit Shadern, aber besser geeignet wäre cuda oder OpenCL für Physikengines.
Ist es viel Aufwand, in OpenCL einzusteigen und darf man es beliebig verwenden?
Eine Frage zu Shadern hätt ich auch noch: Wenn etwas im Shader steht, kann man dann davon ausgehen, dass es einzig und allein auf der GK ausgeführt wird, so dass sich die CPU direkt langweilt, wenn man (fast) alles von Shadern machen lässt? (Bei modernen GKs kommts ja eig auf das bisschen Rechenpower(CPU) gar nicht mehr an, oder?)
Und, wie wird es auf der GK ausgeführt? Bei cuda kann man ja selber bestimmen, wie viele Threads und Blocks sich um eine Menge von Berechnungen (gleichzeitig) kümmern. Kann man da mit Shadern auch was steuern? Und wie ist es bei OpenCL?
_________________ "Pixel, ich bin dein Vater." -Darf Shader
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Coolcat hat geschrieben:
Im Fall eines 4096er Terrains haben wir also mal eben eine Speicherersparnis von fast 95%!!!!
Ok, hängt halt davon ab was man macht. Ich habe festgestellt, dass ein gut tesseliertes Terrain besser sein kann, um auch bei scharfen Kanten ein gutes Aussehen zu bekommen.
Zur Performacne: Klar, wenn die veränderungen im Terrain sich durch eine „einfach“ von t abhängende Funktion darstellen lassen geht das. Aber bei allgemeiner Physik ist das eher nicht der Fall (Kollisionen und eventuelle Verformungen!).
grüße
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Registriert: Di Okt 03, 2006 14:07 Beiträge: 1277 Wohnort: Wien
Vinz hat geschrieben:
Ist es viel Aufwand, in OpenCL einzusteigen und darf man es beliebig verwenden?
Ob es viel Aufwand ist, kann ich eigentlich nicht reinen Gewissens beantworten. Ich habe mich einige Zeit lang viel mit Physik beschäftigt und habe mir im Zuge dessen das einzige Buch gekauft, das sich nur mit OpenCL beschäftigt - es liegt hier neben mir. Aber ich habe mich bisher nur wenig damit beschäftigt, weil ich vorher noch meine Grafik-Engine auf einen Stand bringen muss, mit dem Physik Spass macht.
Was ich bisher dem Buch entnehmen konnte, war, dass OpenCL dafür gebaut ist, mit OpenGL gut zusammenzuarbeiten. Jemand, der OpenGL gut kennt, wird sich vermutlich schneller in OpenCL einarbeiten. Beide sind zielich low-level, also für Otto Normalverbraucher schwerer zu handhaben als z.B. DirectX.
So als ZusatzInfo: wenn Du Dich für OpenCL interessierst, wären Englischkenntnisse nicht schlecht.
Und Deine zweite Frage ist jedenfalls mit ja zu beantworten: man darf es beliebig verwenden und es sollte auf mehreren Plattformen laufen.
Übrigens, die deutsche Wikipedia hat ein paar Infos zu OpenCL.
Vinz hat geschrieben:
Eine Frage zu Shadern hätt ich auch noch: Wenn etwas im Shader steht, kann man dann davon ausgehen, dass es einzig und allein auf der GK ausgeführt wird, so dass sich die CPU direkt langweilt, wenn man (fast) alles von Shadern machen lässt?
Also, bei OpenGL hatten wir hier immer wieder das Problem (nicht nur auf Windows), dass die GrafikKarte bei Überlastung auf die CPU auslagert. Das bemerkt man, wenn das Zeichnen plötzlich viel langsamer geht. Eine neuere Grafikkarten verbessert die Situation.
Vinz hat geschrieben:
Und, wie wird es auf der GK ausgeführt?
Na, parallel, oder ich habe die Frage nicht verstanden.
Vinz hat geschrieben:
Bei cuda kann man ja selber bestimmen, wie viele Threads und Blocks sich um eine Menge von Berechnungen (gleichzeitig) kümmern. Kann man da mit Shadern auch was steuern?
Soweit ich weiß nicht. Ich kann pro zu zeichnendem Objekt einen Shader verwenden und OpenGL kümmert sich drum, dass das möglichst schnell vor sich geht - je nach Grafikkarte eben.
Vinz hat geschrieben:
Und wie ist es bei OpenCL?
Puh, da überforderst Du mich jetzt. Habe jetzt ganz hektisch im Programming Guide geblättert, aber wenn Du Dich mit Cuda auskennst, kannst Du mir vielleicht ein Stichwort geben, wo ich nachsehen soll?
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Ich könnte schwören hier ist gerade ne Antwort verschwunden. Zumindest hat mir das Forum gerade „Das von dir gewählte Thema existiert nicht“ um die ohren gehauen und es war der Ansicht, die letzte Antwort sei von Vinz.
grüße
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Jo, hab meine vorherige Antwort gelöscht, da ich in ihr was gefragt hab, was ich kurz danach gefunden hab... also scheinbar kann man mit OpenCL sowie mit cuda selbst über die "Threads" bestimmen, was wohl wichtig ist für eine effiziente Physik-Engine.
Dass cuda nur mit nvidia-karten läuft ist natürlich blöd, aber momentan hat eh fast jeder eine, oder? Vor allem die Leute, die gamen. Hat jemand Erfahrungen, was leichter zu handhaben ist, cuda oder OpenCL?
_________________ "Pixel, ich bin dein Vater." -Darf Shader
Dass cuda nur mit nvidia-karten läuft ist natürlich blöd, aber momentan hat eh fast jeder eine, oder?
Da würde ich aufpassen, denn das stimmt nicht. Jenachdem wie hoch die Anforderungen an das System sind, könnten Leute mit zb. Notebooks, die dann vielleicht noch so einen "Doppelchip" von Intel und AMD(Ati) haben(Inklusive mir) auf die Idee kommen, das dort zu spielen, aber dann das Spiel nur auf nvidia karten läuft, regen sich die Leute auf und werfen das Spiel (bestenfalls nur) in die Ecke.
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Ja, nicht auf CUDA setzen. Ich würde sogar behaupten, dass AMD gerade eher vorne liegt. Zumindest was man hier im Forum so liest. Ich selber habe ne nVidia…
grüße
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Mitglieder in diesem Forum: 0 Mitglieder und 4 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.