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

Aktuelle Zeit: Mi Jul 16, 2025 03:11

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



Ein neues Thema erstellen Auf das Thema antworten  [ 28 Beiträge ]  Gehe zu Seite Vorherige  1, 2
Autor Nachricht
 Betreff des Beitrags: Re: GPU via OpenGL rechnen lassen
BeitragVerfasst: Mo Feb 22, 2010 18:05 
Offline
DGL Member
Benutzeravatar

Registriert: So Jan 07, 2007 21:26
Beiträge: 130
Wohnort: mal hier mal da mal irgendwo
glCheckFrameBufferStatusEXT gibt GL_FRAMEBUFFER_COMPLETE_EXT zurück. Also ist eigentlich alles in Ordnung :(

ModelView- und Projection-Matrix sind Identity ...

Hier mal mein (relevanter) Code im Ganzen:

Code:
  1.  
  2. ...
  3.  
  4. type
  5.   TForm1 = class(TForm)
  6.     ...
  7.   private
  8.     { Private declarations }
  9.     DC,
  10.     RC: Cardinal;
  11.  
  12.     fbo, depthbuffer, tex: GLuint;
  13.  
  14.     procedure Render;
  15.     procedure CheckFBO;
  16.   end;
  17.  
  18. var
  19.   Form1: TForm1;
  20.  
  21. implementation
  22.  
  23. ...
  24.  
  25. procedure TForm1.FormCreate(Sender: TObject);
  26. begin
  27.   DC:=GetDC(Handle);
  28.   if not InitOpenGL() then
  29.     Application.Terminate;
  30.   RC:=CreateRenderingContext(DC, [opDoubleBuffered], 32, 24, 0, 0, 0, 0);
  31.   ActivateRenderingContext(DC, RC);
  32.  
  33.   glClearColor(0.0, 0.0, 0.0, 0.0);
  34.  
  35.   glEnable(GL_DEPTH_TEST);
  36.   glEnable(GL_TEXTURE_2D);
  37.  
  38.   glGenFramebuffersEXT(1, @fbo);
  39.   glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo);
  40.   glGenRenderbuffersEXT(1, @depthbuffer);
  41.   glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, depthbuffer);
  42.   glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT, 512, 512);
  43.   glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, depthbuffer);
  44.   glGenTextures(1, @tex);
  45.   glBindTexture(GL_TEXTURE_2D, tex);
  46.   glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  47.   glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  48.   glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8,  512, 512, 0, GL_RGBA, GL_UNSIGNED_BYTE, nil);
  49.   glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT,
  50.   GL_TEXTURE_2D, tex, 0);
  51.   CheckFBO;
  52. end;
  53.  
  54. procedure TForm1.Render;
  55. begin
  56.   // via fbo in textur rendern
  57.   glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo);
  58.   glPushAttrib(GL_VIEWPORT_BIT);
  59.   glViewPort(0, 0, 512, 512);
  60.  
  61.   glColor3f(1,0,1);
  62.   glBegin(GL_QUADS);
  63.     glVertex2f(100,100);
  64.     glVertex2f(500,100);
  65.     glVertex2f(500,500);
  66.     glVertex2f(100,500);
  67.   glEnd;
  68.   glPopAttrib;
  69.   glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
  70.  
  71.   //normal rendern
  72.   glBindTexture(GL_TEXTURE_2D, tex);
  73.   glCOlor3f(1,1,1);
  74.   glBegin(GL_QUADS);
  75.     glTexCoord2f(0,0);glVertex2f(100,100);
  76.     glTexCoord2f(1,0);glVertex2f(200,100);
  77.     glTexCoord2f(1,1);glVertex2f(200,200);
  78.     glTexCoord2f(0,1);glVertex2f(100,200);
  79.   glEnd;
  80. end;
  81.  
  82. procedure TForm1.Timer1Timer(Sender: TObject);
  83. begin
  84.   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  85.   glMatrixMode(GL_PROJECTION);
  86.   glLoadIdentity;
  87.   glViewport(0, 0, ClientWidth, ClientHeight);
  88.   glOrtho(0, ClientWidth, ClientHeight, 0, 0, 100);
  89.   glMatrixMode(GL_MODELVIEW);
  90.   glLoadIdentity;
  91.  
  92.   Render();
  93.  
  94.   SwapBuffers(DC);
  95.  
  96.   Caption:= gluErrorString(glGetError);
  97. end;
  98.  
  99. ...

_________________
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 18:13 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
ModelView- und Projection-Matrix sind Identity ...

Dann sind deine Vertexkoordinaten falsch, die müssen nämlich zwischen -1.0 und 1.0 liegen, das ist der sichtbare Bereich.

_________________
Yeah! :mrgreen:


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

Registriert: So Jan 07, 2007 21:26
Beiträge: 130
Wohnort: mal hier mal da mal irgendwo
Im FBO?

_________________
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 18:44 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
Im FBO?

Das hat mit dem FBO nichts zu tun. Die Modelviewprojection-Matrix muss so aufgebaut sein das der sichtbare Bereich im -1.0 bis 1.0 Würfel liegt. Alles außerhalb wird abgeschnitten (Clipping), dann wird durch die vierte Koordinate geteilt und anschließend der -1...1 Bereich auf den Viewport umgerechnet. Das meinte ich mit "die Rendering-Pipeline kennen".

_________________
Yeah! :mrgreen:


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

Registriert: So Jan 07, 2007 21:26
Beiträge: 130
Wohnort: mal hier mal da mal irgendwo
aber ich bin doch eigentlich im Ortho-Modus :S

_________________
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 19:34 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Ok, ich sehe es gerade, aber warum schreibst du dann
Zitat:
ModelView- und Projection-Matrix sind Identity ...

wenn das gar nicht der Fall ist...

Ok, ich sehe das Problem:
Da du den FBO nicht initialisierst ist der mit dem initialisiert was vorher an dieser Stelle im Speicher war, also mit hoher Wahrscheinlich einfach 0. Der Tiefentest ist aktiviert. Du renderst dein FBO-Polygon bei Tiefe 0...daher ist es nicht sichtbar, denn glDepthFunc ist per Default auf GL_LESS eingestellt.
=> glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT) auch für den FBO aufrufen!

_________________
Yeah! :mrgreen:


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

Registriert: So Jan 07, 2007 21:26
Beiträge: 130
Wohnort: mal hier mal da mal irgendwo
Dass der sichtbare Bereich von -1 bis 1 geht müssen doch Modelview- und Projection-Matrix beide
|1,0,0,0|
|0,1,0,0|
|0,0,1,0|
|0,0,0,1|

sein oder?
Weil das hab ich jetzt und es ist immernoch nichts zu sehen:

Hier der veränderte Code für das FBO:

Code:
  1.   glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo);
  2.   glPushAttrib(GL_VIEWPORT_BIT);
  3.       glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  4.       glDisable(GL_DEPTH_TEST);
  5.       glViewPort(0, 0, s, s);
  6.       glMatrixMode(GL_MODELVIEW);
  7.       glPushMatrix();
  8.         glLoadIdentity();
  9.         glMatrixMode(GL_PROJECTION);
  10.         glPushMatrix();
  11.           glLoadIdentity();
  12.  
  13.           glColor3f(1,0,1);
  14.           glBegin(GL_QUADS);
  15.             glVertex2f(-1,-1);
  16.             glVertex2f( 1,-1);
  17.             glVertex2f( 1, 1);
  18.             glVertex2f(-1, 1);
  19.           glEnd;
  20.  
  21.         glPopMatrix;
  22.         glMatrixMode(GL_MODELVIEW);
  23.       glPopMatrix;
  24.     glPopAttrib;
  25.   glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);


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: Mo Feb 22, 2010 20:21 
Offline
DGL Member
Benutzeravatar

Registriert: Di Jul 01, 2003 18:59
Beiträge: 887
Wohnort: (The Netherlands)
Programmiersprache: fpc/delphi/java/c#
some examples in cpp:
http://www.mathematik.uni-dortmund.de/~goeddeke/gpgpu/
http://www.mathematik.uni-dortmund.de/~goeddeke/gpgpu/tutorial.html
http://www.mathematik.uni-dortmund.de/~goeddeke/gpgpu/tutorial2.html
http://www.mathematik.uni-dortmund.de/~goeddeke/gpgpu/tutorial3.html

hope they are of use.

_________________
http://3das.noeska.com - create adventure games without programming


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

Registriert: So Jan 07, 2007 21:26
Beiträge: 130
Wohnort: mal hier mal da mal irgendwo
Irgendwie bekomm ich das nicht hin mit dem FBO :cry:
Kann mir jmd evt. nen Beispiel geben, in dem einfach nur ein Quad in eine Textur gerendert wird?

EDIT:
Nebenbei noch ne Frage zur Parallelisierung... ich wills ja nun folgener Maßen machen ... Alle wichtigen Daten in Texturen rendern (deshalb das bisher nicht gelingende FBO) und dann über einen Shader alles berechnen lassen, ich würde da an und für sich (nach meinen bisherigen Überlegungen) so machen, dass ich einfach für jeden Pixel einen Pixel male (>_<' also mit GL_POINTS arbeite), wird das auch parallelisiert wenn ich das dann so mache:

Code:
  1.  
  2.   //Daten in Textur
  3.   ....
  4.   //Eigentliches Rendern
  5.   glBegin(GL_POINTS);
  6.   for y:=0 to Height-1 do
  7.     for x:=0 to Width-1 do
  8.       glVertex2f(x, y);
  9.   glEnd();
  10.  


Natürlich ist der Shader dann schon gebunden...

Falls das nicht geht, würde das dann mit 'nem VBO klappen, bzw. welche Variante wäre generell besser?

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: Di Feb 23, 2010 22:12 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Für den FBO habe ich leider gerade nichts passendes zur Hand.

Was das rendern angeht...ähm...du willst jeden Pixel auf dem Bildschirm rendern und nimmst dafür GL_POINTS? Parallelisiert wird das, ja. Aber bei einer Auflösung von 1024x1024 sind das über eine Million Punkte, das ist dir klar oder? In deinem Fall würdest du diese eine Million Punkte (1 Mio * 8 Byte = 8 MB) auch noch in jedem Durchgang extra zur Grafikkarte hochladen. Das schreit gerade zu nach einem kleinen VBO, z.B. nur ein paar Zeilen, die dann aber mehrfach (verschoben) gerendert werden.

ABER: Würde ein einziges Bildschirmfüllendes Quad nicht genau die gleiche Aufgabe erledigen? Ein solches Vorgehen würde allerdings natürlich den Vertexshader nur viermal (Quad = 4 Vertices) aufrufen. Da du aber keinen Texturgriff im Vertexshader hast, kannst du diesen aber vermutlich eh nicht sinnvoll für dein Vorhaben nutzen. Wenn du nur den Fragmentshader für jeden Pixel aufrufen möchtest ist ein Quad das Mittel der Wahl.

_________________
Yeah! :mrgreen:


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

Registriert: Di Jul 01, 2003 18:59
Beiträge: 887
Wohnort: (The Netherlands)
Programmiersprache: fpc/delphi/java/c#
Have a look at the tutorial i mentioned, it will tell how to do it using rendering a quad.
http://www.mathematik.uni-dortmund.de/~goeddeke/gpgpu/tutorial.html

_________________
http://3das.noeska.com - create adventure games without programming


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

Registriert: So Jan 07, 2007 21:26
Beiträge: 130
Wohnort: mal hier mal da mal irgendwo
@noeska: thanks for your help :) it will take a lot of time, 'cause i didn't worked with cpp for a long time and my english isn't that good, but i will try it ;)

So und jetzt noch was auf deutsch, da ich ja mit dem Framebuffer noch nicht wirklich vorangekommen bin hab ich mir in einer Pause vom FBO mal Gedanken über meine Daten-Textur gemacht. Speziell: Sie einfach mal mit zufälligen Daten zu füllen,
hier mein Code dafür:

Code:
  1. function TForm1.GenerateDataTexture: GLuint;
  2. var data:TData;
  3.     i:integer;
  4. begin
  5.   SetLength(data, 16*16);
  6.   for i:=0 to High(data) do
  7.     data[i]:=random(100)/100;
  8.  
  9.   glGenTextures(1, @Result);
  10.   glBindTexture(GL_TEXTURE_2D, Result);
  11.   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  12.   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  13.   glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA16, 16,16,0, GL_RGBA, GL_FLOAT, @data[0]);
  14. end;


Mit den beiden Parametern in denen zur Zeit GL_RGBA steht, hab ich schon viele Verschiedene Kombinationen versucht, allerdings kommt es immer zu einer Zugriffverletzung...
TData = Array of GLdouble

Wo liegt da mein Fehler?

_________________
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: Mi Feb 24, 2010 18:59 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
Wo liegt da mein Fehler?

Das Array muss aus 16x16x4 Floats bestehen.

_________________
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 Vorherige  1, 2
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 11 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.009s | 14 Queries | GZIP : On ]