Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Di Mai 14, 2024 01:51

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 15 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Do Jun 21, 2012 13:52 
Offline
DGL Member

Registriert: Fr Mai 11, 2012 13:25
Beiträge: 229
Programmiersprache: c++, c, JavaScript
Hi,

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


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Jun 21, 2012 13:59 
Offline
DGL Member
Benutzeravatar

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?

glUniform, glVertexAttrib

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 networkmy 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


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Jun 21, 2012 14:19 
Offline
DGL Member

Registriert: Fr Mai 11, 2012 13:25
Beiträge: 229
Programmiersprache: c++, c, JavaScript
Lord Horazont hat geschrieben:
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


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Jun 21, 2012 16:16 
Offline
DGL Member

Registriert: Fr Mai 11, 2012 13:25
Beiträge: 229
Programmiersprache: c++, c, JavaScript
Hab es ausprobiert, mit ner Oberfläche, die sich mit der Zeit verändert, läuft sehr schnell und sieht gut aus!

Weiss jemand, wie man ne Fouriertransformation in den Shader bekommt?

_________________
"Pixel, ich bin dein Vater."
-Darf Shader


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Jun 21, 2012 18:08 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
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.

Im Gegenteil, dies ist deutlich effizienter! Immer wenn du große Datenmengen durch einfache Berechnungen ersetzen kannst haben Shader massives Potential!
http://wiki.delphigl.com/index.php/shader_Terrain_GPU4

Das Wiki hat geschrieben:
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.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Jun 22, 2012 08:54 
Offline
DGL Member
Benutzeravatar

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)

_________________
Meine Homepage


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Jun 22, 2012 09:49 
Offline
DGL Member
Benutzeravatar

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.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Jun 22, 2012 13:09 
Offline
DGL Member

Registriert: Fr Mai 11, 2012 13:25
Beiträge: 229
Programmiersprache: c++, c, JavaScript
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


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Jun 22, 2012 14:32 
Offline
DGL Member
Benutzeravatar

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 networkmy 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


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Jun 22, 2012 15:22 
Offline
DGL Member
Benutzeravatar

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?


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Jun 22, 2012 16:49 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Ein Problem bei CUDA ist das es nur mit Nvidia läuft, wenn du eine ATI oder IBM-Karte hast kommst du nicht weit. OpenCL ist platformunabhängig.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Jun 22, 2012 17:26 
Offline
DGL Member
Benutzeravatar

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 networkmy 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


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Jun 22, 2012 17:36 
Offline
DGL Member

Registriert: Fr Mai 11, 2012 13:25
Beiträge: 229
Programmiersprache: c++, c, JavaScript
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


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Jun 22, 2012 22:18 
Offline
DGL Member

Registriert: Di Sep 07, 2010 14:28
Beiträge: 34
Wohnort: Frankfurt
Programmiersprache: C++,C#,VB(,Delphi)
Hallo,

Vinz hat geschrieben:
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.

Jonathan

_________________
Das mit dem Dx tut mir leid.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa Jun 23, 2012 11:54 
Offline
DGL Member
Benutzeravatar

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 networkmy 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


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 15 Beiträge ] 
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

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.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.025s | 17 Queries | GZIP : On ]