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

Aktuelle Zeit: Mi Mai 29, 2024 01:35

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 28 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: GPU via OpenGL rechnen lassen
BeitragVerfasst: Fr Feb 19, 2010 21:35 
Offline
DGL Member
Benutzeravatar

Registriert: So Jan 07, 2007 21:26
Beiträge: 130
Wohnort: mal hier mal da mal irgendwo
Hi Leute,
(ich weiß nicht genau ob es hier in der OpenGL-Kategorie oder Allgemein-Katergorie richtig ist, also tut mir Leid fals ich hier falsch bin :? )
ich erarbeite mir meinen Raytracer von grundauf neu, damals waren Optimierungen extrem schwer umzusetzen, was mich dazu veranlasste (ist das ein richtiges Wort? o_O ) die Struktur zu ändern, bzw. das Projekt noch mal von Null zu beginnen. Da ja Grafikkarten heutzutage an und für sich recht gut geeignet sind um Berechnungen zu parallelisiern und man (fast) immer mehr-kern-Systeme hat, hab ich alles auf Threads ausgebaut, nun will ich OpenGL nutzen um Berechnungen zu parallelisiern. OGL unterstützt ja nun leider nicht Multithreading, was mich zu meiner eigentlichen Frage bringt:

Was macht mehr Sinn: Für jeden Thread einen eigenen Kontext erstellen oder aber die Synchronize-Methode verwenden und den Primärthread alle OpenGL-relevanten Routinen ausführen zu lassen?

cuz
bubble

_________________
Wenn Worte nichts als Worte sind,
dann müssen's Steine sein!
Solange - bis sie pleite sind - schmeißt Fensterscheiben ein!

- Fidl Kunterbunt -


Zuletzt geändert von thebubble am Sa Feb 20, 2010 16:13, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa Feb 20, 2010 11:54 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Ähm...du willst die Grafikkarte rechnen lassen? Dann macht es keinen Sinn die CPU parallel arbeiten zu lassen. Die Grafikkarte kann nur einen Kontext gleichzeitig bearbeiten. Außerdem dürfte ja die Grafikkarte den Hauptteil der Arbeit übernehmen und die CPU sich eigentlich langweilen.

=> Es sollte immer nur einen Thread geben der OpenGL benutzt.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa Feb 20, 2010 14:05 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7804
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Kann man auf Grafikkarten parallel rechnen lassen? Also gezielt?

Geht das vielleicht mit OpenCL?

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa Feb 20, 2010 14:33 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
Kann man auf Grafikkarten parallel rechnen lassen? Also gezielt?

Was meinst du warum Grafikkarten im Vergleich zum Software-Renderer so schnell sind: Eine Grafikkarte arbeitet hoch-parallel, z.B. die GeForce GTX 295 hat 2 GPUs mit jeweils 240 Kernen. Dafür sind die Kerne aber sehr auf die Grafikverarbeitung spezialisiert und für sich alleine genommen natürlich wesentlich langsamer als ein CPU-Kern.
Oder was ist genau die Frage?

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa Feb 20, 2010 16:12 
Offline
DGL Member
Benutzeravatar

Registriert: So Jan 07, 2007 21:26
Beiträge: 130
Wohnort: mal hier mal da mal irgendwo
Öhm ... Ich weiß zwar DAS man die GPU via OpenGL rechnen lassen kann, aber ich weiß leider nicht WIE >_<'
also wie kann ich das bewerkstelligen?

(ich werd gleich mal den Titel des Themas ändern)

Zur Parallelisierung dann auch noch eine Frage, macht das OpenGL bzw. der Treiber oder was auch immer alleine oder muss man das selbst noch einstellen?

cuz bubble

_________________
Wenn Worte nichts als Worte sind,
dann müssen's Steine sein!
Solange - bis sie pleite sind - schmeißt Fensterscheiben ein!

- Fidl Kunterbunt -


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: GPU via OpenGL rechnen lassen
BeitragVerfasst: Sa Feb 20, 2010 16:44 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
Öhm ... Ich weiß zwar DAS man die GPU via OpenGL rechnen lassen kann, aber ich weiß leider nicht WIE >_<'

Wenn du das wirklich über OpenGL (und nicht über spezielle Sprachen für diesen Zweck wie OpenCL oder CUDA) machen willst musst du deine Berechnung geschickt in einen oder mehrere normale Rendervorgänge verpacken. Dein Endergebnis findet sich dann am Ende in einem FBO oder VBO (*). Ohne Shader geht hier natürlich gar nichts, das sollte klar sein. Als Beispiel kannst du die Artikel GLSL_Partikel und GLSL_Partikel_2 nehmen.

Zitat:
Zur Parallelisierung dann auch noch eine Frage, macht das OpenGL bzw. der Treiber oder was auch immer alleine oder muss man das selbst noch einstellen?

Das macht die Grafikkarte alleine, du musst dich nicht darum kümmern. Allerdings musst du natürlich dafür sorgen das deine Anwendung auch wirklich parallel ausgeführt werden kann. Wenn du beispielsweise versuchst eine Million GL_POINTS mit additivem Blending in einen 1x1 Pixel großen FBO zu rendern, wirst du feststellen das dies ziemlich langsam ist. Das liegt daran, dass Schreibzugriffe auf eine Speicherzelle nicht parallel ausgeführt werden können.

Generell ist es sinnvoll sich sehr gut mit den Möglichkeiten einer modernen Grafikkarte aus zu kennen. Das betrifft z.B. Floating-Point-Texturen, Instancing, MRT und allgemein den Aufbau der Rendering-Pipeline.

(*) Mit Transform-Feedback kann man in ein VBO schreiben.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa Feb 20, 2010 17:30 
Offline
DGL Member
Benutzeravatar

Registriert: So Jan 07, 2007 21:26
Beiträge: 130
Wohnort: mal hier mal da mal irgendwo
Ich hab mir mal die ganzen Links angeguckt, und ich muss sagen: ich bin verwirrt >_<'

Wenn ich mich recht erinnere ist doch der Fragmentshader und der Pixelshader das selbe oder?

Auf allen Links werden Shader Versionen >2.0 verwendet, da ich nun aber ein recht altes Notebook hab, hab ich gradmal Vertex- und Pixel-Shader 2.0, dadurch fallen auf jedenfall Transform-Feedback und GLSL Partikel 2 auf jedenfall Weg, da meine Shaderversionen einfach inkompatibel sind. GLSL Partikel: Genau das selbse PixelShader 3.0 :(

Gibt es eine Variante die Ergebnisse des Shaders "Abzufangen" um mit ihnen zu arbeiten?

cuz bubble

_________________
Wenn Worte nichts als Worte sind,
dann müssen's Steine sein!
Solange - bis sie pleite sind - schmeißt Fensterscheiben ein!

- Fidl Kunterbunt -


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: GPU via OpenGL rechnen lassen
BeitragVerfasst: Sa Feb 20, 2010 17:59 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
Wenn ich mich recht erinnere ist doch der Fragmentshader und der Pixelshader das selbe oder?

Ja, unter DirectX heißt der Fragmentshader halt Pixelshader.

Zitat:
Gibt es eine Variante die Ergebnisse des Shaders "Abzufangen" um mit ihnen zu arbeiten?

Ja, das FramebufferObject (FBO). Das erlaubt es einfach in eine Textur statt in den Framebuffer zu rendern. Die Textur kannst du dann in den Hauptspeicher kopieren. Sollte auch mit ShaderModell 2.0 funktionieren.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: GPU via OpenGL rechnen lassen
BeitragVerfasst: Sa Feb 20, 2010 18:13 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Der erste Artikel braucht nur deshalb Shader 3.0, weil er den Texturlookup im Vertexshader benutzt. Alles andere geht auch mit Shader 2.0.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: GPU via OpenGL rechnen lassen
BeitragVerfasst: Sa Feb 20, 2010 18:15 
Offline
DGL Member
Benutzeravatar

Registriert: So Jan 07, 2007 21:26
Beiträge: 130
Wohnort: mal hier mal da mal irgendwo
Eine Frage hab ich dennoch, diesmal aber wieder was den Fragmentshader angeht:

Mein Frag.-Shader kann laut "OpenGL Extensions Viewer" maximal 512 Unifroms übergeben, mein Raytracer soll ja nun aber irgendwann mal komplexe Meshes darstellen können, die dann wiederum auf Garantie mehr als 512 Dreiecke hat. Wie kann ich dieses Problem lösen?

cuz
bubble

_________________
Wenn Worte nichts als Worte sind,
dann müssen's Steine sein!
Solange - bis sie pleite sind - schmeißt Fensterscheiben ein!

- Fidl Kunterbunt -


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: GPU via OpenGL rechnen lassen
BeitragVerfasst: Sa Feb 20, 2010 18:20 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zum ersten handelt es sich um Uniform-Vektoren, also du hast maximal 512 vec4 uniforms. Desweiteren kannst du Float-Texturen benutzen, zumindest wenn deine Hardware GL_ARB_texture_float oder ggf. einen Vorgänger davon kann.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: GPU via OpenGL rechnen lassen
BeitragVerfasst: Sa Feb 20, 2010 18:51 
Offline
DGL Member
Benutzeravatar

Registriert: So Jan 07, 2007 21:26
Beiträge: 130
Wohnort: mal hier mal da mal irgendwo
T___T GL_ARB_texture_float wird nicht unterstützt ....
Bei google find ich nichts über Vorgänger :(
ich Liste mal alle Extensions die was damit zu tun haben könnten mit "texture" auf die ich hab:
GL_ARB_texture_env_add
GL_ARB_texture_env_combine
GL_ARB_texture_env_crossbar
GL_ARB_texture_env_dot3
GL_ARB_texture_mirrored_repeat
GL_ARB_texture_rectangle
GL_ATI_texture_env_combine3
GL_EXT_texture_object

Kann man auch ein komplettes VBO übergeben eigene Records erstellen und diese dann mit uniform übergeben?

Ich hab übrigens eine ATI X1250 falls das irgendwie hilfreich sein sollte...

cuz
bubble

_________________
Wenn Worte nichts als Worte sind,
dann müssen's Steine sein!
Solange - bis sie pleite sind - schmeißt Fensterscheiben ein!

- Fidl Kunterbunt -


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: GPU via OpenGL rechnen lassen
BeitragVerfasst: Sa Feb 20, 2010 19:51 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
Kann man auch ein komplettes VBO übergeben eigene Records erstellen und diese dann mit uniform übergeben?

Das geht mit TextureBufferObjects, aber das braucht Shader 4.0 ;)

Der Vorgänger von GL_ARB_texture_float ist GL_ATI_texture_float. Du kannst aber versuchen Floating-Point-Zahlen durch Fixed-Point-Zahlen zu simulieren:
Code:
  1. zahl = (256.0*255.0)*tex.r + (255.0)*tex.g + (255.0/256.0)*tex.b + (255.0/65536.0)*tex.a - 32768.0;

Damit kannst du Zahlen zwischen -32768 und 32767 mit einer Genauigkeit hinter dem Komma von 4-5 Dezimalstellen darstellen. Da sollte reichen, da du diese Darstellung ja nur zum laden der Daten brauchst, rechnen kannst du im Shader mit echten Floats und das Ergebnis des Raytracings sind ja eh nur Farbwerte.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: GPU via OpenGL rechnen lassen
BeitragVerfasst: Mo Feb 22, 2010 16:33 
Offline
DGL Member
Benutzeravatar

Registriert: So Jan 07, 2007 21:26
Beiträge: 130
Wohnort: mal hier mal da mal irgendwo
Okay, dass müsst ich mit der Wertespanne eigentlich hinbekommen, das einzige was mir im moment noch Probleme bereitet ist der Framebuffer...

Also Fehlermeldungen kommen keine (auch nich durch gluErrorString(glGetError)) aber ich kann auch trotzdem nix sehen T__T

Hier mal mein Code zum rendern:

Code:
  1.   glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo);
  2.   glPushAttrib(GL_VIEWPORT_BIT);
  3.   glViewPort(0, 0, 512, 512);
  4.  
  5.   glColor3f(1,0,1);
  6.   glBegin(GL_QUADS);
  7.     glVertex2f(0,0);
  8.     glVertex2f(100,0);
  9.     glVertex2f(100,100);
  10.     glVertex2f(0,100);
  11.  
  12.     glVertex2f(100,100);
  13.     glVertex2f(200,100);
  14.     glVertex2f(200,200);
  15.     glVertex2f(100,200);
  16.   glEnd;
  17.  
  18.   glPopAttrib;
  19.   glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
  20.  
  21.   glBindTexture(GL_TEXTURE_2D, tex);
  22.   glCOlor3f(1,1,1);
  23.   glBegin(GL_QUADS);
  24.     glTexCoord2f(0,0);glVertex2f(100,100);
  25.     glTexCoord2f(1,0);glVertex2f(200,100);
  26.     glTexCoord2f(1,1);glVertex2f(200,200);
  27.     glTexCoord2f(0,1);glVertex2f(100,200);
  28.   glEnd;


GL_TEXTURE_2D ist natürlich aktiviert :)

_________________
Wenn Worte nichts als Worte sind,
dann müssen's Steine sein!
Solange - bis sie pleite sind - schmeißt Fensterscheiben ein!

- Fidl Kunterbunt -


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: GPU via OpenGL rechnen lassen
BeitragVerfasst: Mo Feb 22, 2010 17:36 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Sind ModelView und Projection-Matrix auf Identity gesetzt?
Was sagt glCheckFramebufferStatusEXT ?

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 28 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: Google [Bot] und 3 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.010s | 17 Queries | GZIP : On ]