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

Aktuelle Zeit: Di Mai 28, 2024 22:02

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



Ein neues Thema erstellen Auf das Thema antworten  [ 4 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Mit einer Bitmap für DC
BeitragVerfasst: Di Okt 09, 2012 02:53 
Offline
DGL Member

Registriert: Di Okt 09, 2012 02:19
Beiträge: 7
Programmiersprache: Delphi
Hallo, Wie kann ich konvertieren Sie den folgenden Code in ein Bitmap rendern? Es funktioniert jetzt Rendern auf dem form1.canvas.handle, aber wenn ich das tbm.canvas.handle ändern abstürzt. Kann mir jemand helfen? Sorry, wenn diese Grammatik seltsam ist, habe ich Google Übersetzer.

Dieser Code ist von den sampes hier http://www.pascalgamedevelopment.com/sh ... L-Examples und es läuft gut, wenn Sie die form1.canvas.handle.

Code:
  1. procedure TForm1.Button1Click(Sender: TObject);
  2. VAR
  3.   DemoStart, LastTime : DWORD;
  4.   ElapsedTime         : INTEGER;
  5.   glslsimplevert,
  6.   glslsimplefrag      : TGLSLShader;
  7.   glslsimpleprog      : TGLSLProgram;
  8.   pfd                 : TPixelFormatDescriptor;
  9.   DC,RC               : HDC;
  10.   tbm:tbitmap;
  11. BEGIN
  12.   tbm:=tbitmap.create;
  13.   tbm.pixelformat:=pf24bit;
  14.   tbm.width:=form1.clientwidth;
  15.   tbm.height:=form1.clientheight;
  16.   InitOpenGL;
  17.   DC:=form1.canvas.handle;
  18.   //DC:=tbm.canvas.handle;
  19.   RC := CreateRenderingContext(DC, [opDoubleBuffered], 32, 24, 0, 0, 0, 0);
  20.   // Erstellten Renderkontext aktivieren
  21.   ActivateRenderingContext(DC, RC);
  22.   ReadImplementationProperties;
  23.   ReadOpenGLCore;
  24.   //load simple glsl shader
  25.   glslsimpleprog := TGLSLProgram.Create();
  26.   glslsimplevert := TGLSLShader.Create('mandelbrot.vert');
  27.   glslsimplefrag := TGLSLShader.Create('mandelbrot.frag', GL_FRAGMENT_SHADER_ARB);
  28.   glslsimpleprog.Attach(glslsimplevert);
  29.   glslsimpleprog.Attach(glslsimplefrag);
  30.   glslsimpleprog.Link;
  31.   glslsimpleprog.Enable;
  32.   glslsimpleprog.Set2F('mouse',320,240);
  33.   glslsimpleprog.Set2F('resolution',form1.clientwidth,form1.clientheight);
  34.   demostart:=gettickcount;
  35.   elapsedtime:=1;
  36.   WHILE GetAsyncKeyState ( 27 ) = 0 DO
  37.     BEGIN
  38.       glslsimpleprog.setf('time', elapsedtime/640);
  39.       glLoadIdentity;
  40.       glBegin ( GL_QUADS );
  41.         glTexCoord2f ( 0.0, 0.0 ); glVertex3f ( -320, -240, 0 );
  42.         glTexCoord2f ( 1.0, 0.0 ); glVertex3f (  320, -240, 0 );
  43.         glTexCoord2f ( 1.0, 1.0 ); glVertex3f (  320,  240, 0 );
  44.         glTexCoord2f ( 0.0, 1.0 ); glVertex3f ( -320,  240, 0 );
  45.       glEnd;
  46.       LastTime := ElapsedTime;
  47.       { Calculate Elapsed Time }
  48.       ElapsedTime := GetTickCount - DemoStart;
  49.       { average it out for smoother movement }
  50.       ElapsedTime := ( LastTime + ElapsedTime ) DIV 2;
  51.       SwapBuffers      ( DC );
  52.       //form1.canvas.draw(0,0,tbm);
  53.     END;
  54.     application.terminate;
  55. end;


Ich möchte in der Lage sein, um eine offscreen Bitmap rendern und ziehen Sie es auf die wichtigste Form, wenn ich will. Dies war früher möglich sein, mit normaler OpenGL, aber es scheint nicht mit Shadern und dlgopengl möglich?

Vielen Dank für jede Hilfe, die Sie bieten können.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Mit einer Bitmap für DC
BeitragVerfasst: Di Okt 09, 2012 06:09 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Um in ein Bitmap rendern zu können muss man den Renderkontext mit der Option PFD_DRAW_TO_BITMAP erstellen. Aber du kannst davon ausgehen dass du dann je nach OpenGL-Implementation nur eine Minimalversion bekommst die evtl. garkeine Shader kann, sprich das Rendern ins Bitmap unterstützt dann vermutlich garkeine Shader, das müsstest du dann entsprechend vorher über eine Abfrage der OpenGL-Version oder der Extension abprüfen. Abstürzen tut es momentan wohl weil CreateRenderingContext entweder kein passendes Pixelformat fürs Rendern in eine Bitmap findet (falsche Optionen, 32 Bit Farbe, 24 Bit Tiefe wird evtl. garnicht angeboten) oder z.B. keine Shader unterstützt werden und dann die Funktionszeiger entsprechend NIL sind.

Alternativ kannst du ja auch einen normalen Kontext erstellen, dort hineinreindern und die Pixeldaten des Offscreeninhaltes kopieren. Dann hast du einen vollen OpenGL-Renderkontext mit allen Fähigkeiten deiner Grafikkarte, und könntest z.B. auch FBOs nutzen um Offscreen zu rendern.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Mit einer Bitmap für DC
BeitragVerfasst: Di Okt 09, 2012 23:00 
Offline
DGL Member

Registriert: Di Okt 09, 2012 02:19
Beiträge: 7
Programmiersprache: Delphi
Ich verfolgte den Code und es funktioniert PFD_DRAW_TO_BITMAP richtig eingestellt.

Ich stellte sicher, das Pixelformat der Bitmap ist 32 Bit, um die OpenGL-Kontext passen.

Hier ist das einfachste Beispiel-Code

Code:
  1.  
  2.   tbm:=tbitmap.create;
  3.   tbm.pixelformat:=pf32bit;
  4.   tbm.width:=form1.clientwidth;
  5.   tbm.height:=form1.clientheight;
  6.   DC:=form1.canvas.handle;
  7.   DC:=tbm.canvas.handle;
  8.   InitOpenGL;
  9.   RC := CreateRenderingContext(DC, [opDoubleBuffered,opGDI], 32, 24, 0, 0, 0, 0);
  10.   ActivateRenderingContext(DC, RC);
  11.   ReadImplementationProperties;
  12.   ReadOpenGLCore;
  13. showmessage('DEBUG0');
  14.   glslsimpleprog := TGLSLProgram.Create();
  15. showmessage('DEBUG1');
  16.   glslsimplevert := TGLSLShader.Create('raytracer_vert.glsl');
  17.   glslsimplefrag := TGLSLShader.Create('raytracer_frag.glsl', GL_FRAGMENT_SHADER_ARB);
  18.   glslsimpleprog.Attach(glslsimplevert);
  19.   glslsimpleprog.Attach(glslsimplefrag);
  20.   glslsimpleprog.Link;
  21.   glslsimpleprog.Enable;
  22.   glslsimpleprog.Set2F('resolution',form1.clientwidth,form1.clientheight);
  23.   demostart:=gettickcount;
  24.   elapsedtime:=1;
  25.   glLoadIdentity;
  26.   glBegin ( GL_QUADS );
  27.   glTexCoord2f ( 0.0, 0.0 ); glVertex3f ( -1, -1, 0 );
  28.   glTexCoord2f ( 1.0, 0.0 ); glVertex3f (  1, -1, 0 );
  29.   glTexCoord2f ( 1.0, 1.0 ); glVertex3f (  1,  1, 0 );
  30.   glTexCoord2f ( 0.0, 1.0 ); glVertex3f ( -1,  1, 0 );
  31.   glEnd;
  32.  


DEBUG0 gezeigt. DEBUG1 nicht.
EAccessVioaltion at address 00000000.
TGLSLProgram.Create Anrufe

Code:
  1. constructor TGLSLProgram.Create(); begin FProgramObject := glCreateProgramObjectARB end;


Hat jemand Beispielcode, wie dglopngl verwenden, um eine Bitmap zu machen?

Ich konnte glReadPixels verwenden, um die opengl in ein Bitmap zu konvertieren, aber dies verdoppelt die gesamte Zeit machen.

Oder, wenn FBOs helfen kann, ist es ein Beispiel für ihre Verwendung mit dglopengl?

Vielen Dank.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Mit einer Bitmap für DC
BeitragVerfasst: Mi Okt 10, 2012 08:35 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
BlahBlah hat geschrieben:
DEBUG0 gezeigt. DEBUG1 nicht.
EAccessVioaltion at address 00000000.
TGLSLProgram.Create Anrufe

Code:
  1. constructor TGLSLProgram.Create(); begin FProgramObject := glCreateProgramObjectARB end;

Das liegt daran dass die OpenGL-Implementation für das Rendern in eine Bitmap vermutlich keine Shader unterstützt, also die entsprechenden Methodenzeiger NIL sind, und dann gibts halt eine Zugriffsverletzung. Hier muss man erst prüfen ob die entsprechenden Extensions (z.B. GL_ARB_FRAGMENT_SHADER) überhaupt unterstützt werden.


BlahBlah hat geschrieben:
Ich konnte glReadPixels verwenden, um die opengl in ein Bitmap zu konvertieren, aber dies verdoppelt die gesamte Zeit machen.

Oder, wenn FBOs helfen kann, ist es ein Beispiel für ihre Verwendung mit dglopengl?


Um Readpixels wirst du nicht herumkommen wenn du Bilddaten aus einer OpenGL-Implementation mit vollem Funktionsumfang willst. Egal ob direkt über den Screenbuffer oder FBOs (zu FBOs gibts in unserem Wiki ein Tutorial).

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


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


Wer ist online?

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