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

Aktuelle Zeit: Do Mär 28, 2024 17:10

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



Ein neues Thema erstellen Auf das Thema antworten  [ 39 Beiträge ]  Gehe zu Seite 1, 2, 3  Nächste
Autor Nachricht
 Betreff des Beitrags: [gelöst] Rendern in Bitmap
BeitragVerfasst: Di Feb 28, 2012 11:02 
Offline
DGL Member

Registriert: Mo Feb 27, 2012 14:34
Beiträge: 25
Programmiersprache: Pascal
Hallo,

ich möchte gern in eine Bitmap rendern, die größere Abmessungen hat als mein Bildschirm. Jetzt habe ich mir
folgendes aus verschiedenen Foren zusammengebastelt.

Code:
  1.  
  2. procedure bitmap_render_ganz_neu(Breite, Hoehe : Integer; Dateiname : String);
  3. Var
  4.     FormatIndex         : integer;
  5.     ErrorCode           : GLenum;
  6.         Bitmap1: TBitmap;
  7.         Bitmap1DC : HDC;
  8.         Bitmap1PFD: TPixelFormatDescriptor;
  9.     Bitmap1RC : HGLRC;
  10.  
  11. begin
  12.  
  13.   Bitmap1 := TBitmap.Create;
  14.   Bitmap1DC := Bitmap1.Canvas.Handle;
  15.   Bitmap1.PixelFormat := pf32bit;
  16.  
  17.   FillChar(Bitmap1PFD, SizeOf(TPixelFormatDescriptor), 0);
  18.     With Bitmap1PFD Do Begin
  19.         nSize:= SizeOf(Bitmap1PFD);
  20.         nVersion:= 1;
  21.         dwFlags:= PFD_SUPPORT_GDI or PFD_DRAW_TO_BITMAP or PFD_SUPPORT_OPENGL;
  22.         iPixelType:= PFD_TYPE_RGBA;
  23.         cColorBits:= 32;
  24.         cDepthBits:= 32;
  25.         iLayerType:= PFD_MAIN_PLANE;
  26.  
  27.         cRedBits := 0;     
  28.         cRedShift := 0;
  29.         cGreenBits := 0;
  30.         cGreenShift := 0;
  31.         cBlueBits := 0;
  32.         cBlueShift := 0;
  33.         cAlphaBits := 0;
  34.         cAlphaShift := 0;
  35.         cAccumBits := 0;
  36.         cAccumRedBits := 0;
  37.         cAccumGreenBits := 0;
  38.         cAccumBlueBits := 0;
  39.         cAccumAlphaBits := 0;
  40.         cStencilBits := 0;
  41.         cAuxBuffers := 0;
  42.         bReserved := 0;
  43.         dwLayerMask := 0;
  44.         dwVisibleMask := 0;
  45.         dwDamageMask := 0;
  46.  
  47.     End;
  48.  
  49.     FormatIndex:= ChoosePixelFormat(Bitmap1DC, @Bitmap1PFD);
  50.     If FormatIndex = 0 Then
  51.         Raise Exception.Create('ChoosePixelFormat failed ' +
  52.             IntToStr(GetLastError));
  53.  
  54.     If Not SetPixelFormat(Bitmap1DC, FormatIndex, @Bitmap1PFD) Then
  55.         Raise Exception.Create('SetPixelFormat failed ' +
  56.             IntToStr(GetLastError));
  57.  
  58.     Bitmap1RC:= wglCreateContext(Bitmap1DC);
  59.     If FGLContext = 0 Then
  60.         Raise Exception.Create('wglCreateContext failed ' +
  61.             IntToStr(GetLastError));
  62.  
  63.     If Not wglMakeCurrent(Bitmap1DC, Bitmap1RC) Then
  64.         Raise Exception.Create('wglMakeCurrent failed ' +
  65.             IntToStr(GetLastError));
  66.  
  67.     ErrorCode:= glGetError;
  68.     If ErrorCode <> GL_NO_ERROR Then
  69.         Raise Exception.Create('FormCreate:' + gluErrorString(ErrorCode));
  70.  
  71.     glViewport(0, 0, Bitmap1.Width, Bitmap1.Height);    // Setzt den Viewport für das OpenGL Fenster
  72.     glMatrixMode(GL_PROJECTION);        // Matrix Mode auf Projection setzen
  73.     glLoadIdentity();                   // Reset View
  74.  
  75.     glOrtho(-Breite/2, Breite/2, -Hoehe/2, Hoehe/2, -Breite, Breite);
  76.  
  77.     ErrorCode:= glGetError;
  78.     If ErrorCode <> GL_NO_ERROR Then
  79.         Raise Exception.Create('Resize:' + gluErrorString(ErrorCode));
  80.  
  81.     glMatrixMode(GL_MODELVIEW);         // Zurück zur Modelview Matrix
  82.     glLoadIdentity();                   // Reset View
  83.  
  84.     glClear(GL_COLOR_BUFFER_BIT Or GL_DEPTH_BUFFER_BIT);
  85.         glClearColor(0.5, 0.7, 0.9, 1.0);
  86.     glEnable(GL_DEPTH_TEST);
  87.         glClearDepth(0.98);
  88.  
  89.     Zeichne_in_Speicher(Breite, Hoehe); //Zeichenbefehle
  90.  
  91.     glFinish;
  92.     ErrorCode:= glGetError;
  93.     If ErrorCode <> GL_NO_ERROR Then
  94.         Raise Exception.Create('Paint:' + gluErrorString(ErrorCode));
  95.  
  96.     Bitmap1.SaveToFile(Dateiname);
  97.    
  98.     Bitmap1.Destroy;
  99.  
  100. End;      
  101.  


Jetzt bekomme ich schon bei
Code:
  1. FormatIndex:= ChoosePixelFormat(Bitmap1DC, @Bitmap1PFD);

einen Fehler.

Ich hoffe, mir kann einer von Euch weiterhelfen.

Gruß DAP


Zuletzt geändert von DAP am Mi Nov 04, 2015 15:17, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Rendern in Bitmap
BeitragVerfasst: Di Feb 28, 2012 11:04 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
DAP hat geschrieben:
einen Fehler.
Ich hoffe, mir kann einer von Euch weiterhelfen.

Da ich nicht gut in Fehlerraten bin, nein. Aber vielleicht, wenn du uns den Fehler verräts.

_________________
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  
 Betreff des Beitrags: Re: Rendern in Bitmap
BeitragVerfasst: Di Feb 28, 2012 11:16 
Offline
DGL Member

Registriert: Mo Feb 27, 2012 14:34
Beiträge: 25
Programmiersprache: Pascal
Lord Horazont hat geschrieben:
DAP hat geschrieben:
einen Fehler.
Ich hoffe, mir kann einer von Euch weiterhelfen.

Da ich nicht gut in Fehlerraten bin, nein. Aber vielleicht, wenn du uns den Fehler verräts.


ChoosePixelFormat failed 6


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Rendern in Bitmap
BeitragVerfasst: Di Feb 28, 2012 13:53 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Wenn man via PFD_DRAW_TO_BITMAP direkt in ein Bitmap rendern will, dann bekommt man i.d.R. nur unbeschleunigtes GL 1.1 (via Softwarerenderer). Und der bietet dass von dir gewollte Pixelformat (32 Bit Tiefenpuffer z.B.) evtl. garnicht an.

Von PFD_DRAW_TO_BITMAP sollte man einfach die Finger lassen, wie gesagt ist dass i.d.R. Softwarerenderer mit max. OpenGL 1.1. Besser via Hardware ein FBO oder einen Offscreenpuffer erstellen (siehe glGenRenderbuffers), und diesen dann z.B. mit glReadPixels auslesen und die Pixeldaten dann selbst in ein Bitmap / JPG etc. speichern.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Rendern in Bitmap
BeitragVerfasst: Di Feb 28, 2012 14:30 
Offline
DGL Member

Registriert: Mo Feb 27, 2012 14:34
Beiträge: 25
Programmiersprache: Pascal
ich möchte aber gern in eine größere Bitmap rendern, als der Gerätecontext es hergibt.
Da es einfache Grafiken sind, wäre die Einschränkung per Softwarerendering hinnehmbar.

Mit 24 bit bekomme ich den gleichen Fehler, es muss also an etwas anderem liegen, vielleicht
kann doch noch jemand den Fehler "erraten" im Quelltext, ich benutze noch nicht so lange
OpenGl.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Rendern in Bitmap
BeitragVerfasst: Di Feb 28, 2012 14:42 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Dein Fehler hat an sich nicht wirklich viel mit OpenGL zu tun. Wenn ChoosePixelFormat einen Fehler ausgibt, dann bedeutet dass i.d.R. dass du ein Pixelformat angefordert hast dass von der Implementation nicht angeboten wird. Und im Bitmap hast du eine GL 1.1 Softwareimplementation, die in dem Bereich sehr stark eingeschränkt ist. Da solltest du halt mal bei einem ganz simplen Pixelformat anfangen, also 640x480 mit 32 Bit Farbe und ohne Tiefe, und schaun ob das klappt.

Aber wie gesagt ists besser z.B. den angesprochenen Offscreenpuffer zu erstellen, der ja auch größer sein kann als der Gerätekontext. Je nach Hardware sind hier auch mal 16kx16k drin. Wäre also die bessere Lösung.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Rendern in Bitmap
BeitragVerfasst: Di Feb 28, 2012 14:49 
Offline
DGL Member

Registriert: Mo Feb 27, 2012 14:34
Beiträge: 25
Programmiersprache: Pascal
könntest du mir da ein kleines Beispiel geben, ich bin wie gesagt noch nicht so ganz firm drin


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Rendern in Bitmap
BeitragVerfasst: Do Mär 01, 2012 16:02 
Offline
DGL Member

Registriert: Mo Feb 27, 2012 14:34
Beiträge: 25
Programmiersprache: Pascal
kann mir denn nicht jemand von Euch weiterhelfen, wie man den Offscreenpuffer zum speichern einer Bitmap verwendet?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Rendern in Bitmap
BeitragVerfasst: Do Mär 01, 2012 16:08 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Wir haben in unserem Wiki ein Tutorial in dem gezeigt wird wie man ein Framebufferobjekt (Offscreenpuffer) erstellt. Daraus musst du dann nur noch via glReadPixels die Pixeldaten auslesen (vorher ggf. den Drawpuffer umstellen, also glDrawBuffer (GL_COLOR_ATTACHMENT0_EXT);). Die kannst du dann ja ganz einfach in ein passendes Bildformat exportieren.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Rendern in Bitmap
BeitragVerfasst: Mi Okt 28, 2015 16:48 
Offline
DGL Member

Registriert: Mo Feb 27, 2012 14:34
Beiträge: 25
Programmiersprache: Pascal
Hallo,

aus privaten Gründen konnte ich mich zwischenzeitlich nicht weiter um das Problem des Renderns kümmern, möchte aber jetzt wieder einsteigen. Ich denke ich sollte die Variante mit dem Framebuffer weiter verfolgen. Könnte mir vielleicht jemand ein lauffähiges Mini Projekt für Lazarus als Grundgerüst geben, wo auf diese Art und Weise auf einen Framebuffer zugegriffen wird? Ich würde gern ein Bitmap mit ca. 2000x1750 Pixeln erzeugen.

Ich hoffe, die Frage nach einem Beispielprojekt kommt jetzt nicht so unverschämt rüber.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Rendern in Bitmap
BeitragVerfasst: Mi Okt 28, 2015 17:19 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Ich habe da etwas, nutzt aber OpenGL 3.3, es sollte mit dem alten OpenGL auch gehen, da nur der Textur-Buffer das Massgebendliche ist.
Textur 0 ist die Textur in die später gerender wird.
Textur 1 ist eine ganz normale Textur, gut als Vergleich.
Code:
  1. var
  2.     textureID0, textureID1: GLuint;
  3.  
  4.     // Render Bufffer
  5.     FramebufferName, depthrenderbuffer: GLuint;  
  6.  
  7.   // ------------ Texturen laden --------------
  8.  
  9.   // --- Textur 0
  10.  
  11.   glGenTextures(1, @textureID0);
  12.   glBindTexture(GL_TEXTURE_2D, textureID0);
  13.  
  14.   glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, TexturSize, TexturSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, nil);
  15.  
  16.   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  17.   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  18.  
  19.   // Frame Buffer erzeugen
  20.  
  21.   glGenFramebuffers(1, @FramebufferName);
  22.   glBindFramebuffer(GL_FRAMEBUFFER, FramebufferName);
  23.  
  24.   glGenRenderbuffers(1, @depthrenderbuffer);
  25.   glBindRenderbuffer(GL_RENDERBUFFER, depthrenderbuffer);
  26.  
  27.   glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, TexturSize, TexturSize);
  28.   glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthrenderbuffer);
  29.  
  30.   glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, textureID0, 0);
  31.  
  32.   // --- Textur 1
  33.  
  34.   with Image2.Picture.Bitmap.RawImage do begin
  35.     glGenTextures(1, @textureID1);
  36.     glBindTexture(GL_TEXTURE_2D, textureID1);
  37.  
  38.     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, Description.Width, Description.Height, 0, GL_BGRA, GL_UNSIGNED_BYTE, Data);
  39.  
  40.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  41.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  42.  
  43.     glGenerateMipmap(GL_TEXTURE_2D);
  44.   end;  


Beim rendern sieht das dann so aus:

Code:
  1. rocedure TForm1.RenderScene;
  2. begin
  3.  
  4.   // --- In Texturbuffer render
  5.  
  6.   glBindFramebuffer(GL_FRAMEBUFFER, FramebufferName);
  7.  
  8.   glClearColor(1.0, 1.0, 0.0, 1.0);
  9.   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  10.   glViewport(0, 0, TexturSize, TexturSize);
  11.  
  12.   with RenderTextur_Shader do begin // Triangle
  13.     Shader.UseProgram;
  14.     glBindVertexArray(uiVAO[0]);
  15.  
  16.     TriangleMatrix.Uniform(WorldMatrix_id);
  17.     glDrawArrays(GL_TriangleS, 0, Length(Triangle) * 3);
  18.   end;
  19.  
  20.  
  21.   //  --- Normal auf den Bildschirm rendern
  22.  
  23.   glBindFramebuffer(GL_FRAMEBUFFER, 0);
  24.  
  25.   glClearColor(1.0, 0.5, 1.0, 0.0);
  26.   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  27.  
  28.  
  29.   glViewport(0, 0, ClientWidth, ClientHeight);
  30.  
  31. // Multitexturing mit der gewöhnlichenTextur und der Gerenderten.
  32.  
  33.   glActiveTexture(GL_TEXTURE0);
  34.   glBindTexture(GL_TEXTURE_2D, textureID0);
  35.  
  36.   glActiveTexture(GL_TEXTURE1);
  37.   glBindTexture(GL_TEXTURE_2D, textureID1);
  38.  
  39.   with Cube_Shader do begin  // Rechteck
  40.     Shader.UseProgram;
  41.     glBindVertexArray(uiVAO[1]);
  42.  
  43.     WorldMatrix.Uniform(WorldMatrix_id);
  44.     glDrawArrays(GL_TriangleS, 0, Length(Quad) * 3);
  45.   end;
  46.  
  47.   OpenGLControl.SwapBuffers;
  48. end;


Anstelle von dem:
Code:
  1.     Shader.UseProgram;
  2.     glBindVertexArray(uiVAO[0]);
  3.  
  4.     TriangleMatrix.Uniform(WorldMatrix_id);
  5.     glDrawArrays(GL_TriangleS, 0, Length(Triangle) * 3);  

Sollte auch Code mit glBegin, glRotate etc. möglich sein.

Ich hoffe das hilft dir weiter.

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Rendern in Bitmap
BeitragVerfasst: Mi Okt 28, 2015 22:48 
Offline
DGL Member

Registriert: Mo Feb 27, 2012 14:34
Beiträge: 25
Programmiersprache: Pascal
vielen Dank für die schnelle Antwort, werde es morgen gleich ausprobieren


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Rendern in Bitmap
BeitragVerfasst: Do Okt 29, 2015 09:33 
Offline
DGL Member

Registriert: Mo Feb 27, 2012 14:34
Beiträge: 25
Programmiersprache: Pascal
habe mal mein kleines Testprogramm aus Lazarus hochgeladen, (der Ursprung stammt auch aus dem Forum), bekomme aber schon bei

Code:
  1.  glGenFramebuffers(1, @FramebufferName);
(Zeile 184)

einen SIGSEGV Fehler. Ich vermute starkt, dass noch irgendwelche Einstellungen nicht richtig oder Variablen nicht richtig initialisiert sind.

Vielleicht könnte einer mal drüber schauen.


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Rendern in Bitmap
BeitragVerfasst: Do Okt 29, 2015 16:22 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Zitat:
einen SIGSEGV Fehler. Ich vermute starkt, dass noch irgendwelche Einstellungen nicht richtig oder Variablen nicht richtig initialisiert sind.

Bei läuft es ohne SIGSEV. Es hat einen schwarzen Kasten mit eine roten Linie von oben-links bis rechts-unten.
Und wen ich den Button drücke, verschwindet die Linie.

Ich habe es mit Linux und Wine getestet.

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Rendern in Bitmap
BeitragVerfasst: Do Okt 29, 2015 16:28 
Offline
DGL Member

Registriert: Mo Feb 27, 2012 14:34
Beiträge: 25
Programmiersprache: Pascal
Der Fehler tritt bei mir auf, wenn ich den Button drücke, dort wollte ich die Routine zum speichern der Datei einbauen.

Na klasse, läuft leider nicht bei mir unter Windows 7 :? .


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


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.059s | 17 Queries | GZIP : On ]