DGL
https://delphigl.com/forum/

Mit einer Bitmap für DC
https://delphigl.com/forum/viewtopic.php?f=20&t=10615
Seite 1 von 1

Autor:  BlahBlah [ Di Okt 09, 2012 02:53 ]
Betreff des Beitrags:  Mit einer Bitmap für DC

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.

Autor:  Sascha Willems [ Di Okt 09, 2012 06:09 ]
Betreff des Beitrags:  Re: Mit einer Bitmap für DC

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.

Autor:  BlahBlah [ Di Okt 09, 2012 23:00 ]
Betreff des Beitrags:  Re: Mit einer Bitmap für DC

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.

Autor:  Sascha Willems [ Mi Okt 10, 2012 08:35 ]
Betreff des Beitrags:  Re: Mit einer Bitmap für DC

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).

Seite 1 von 1 Alle Zeiten sind UTC + 1 Stunde
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/