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

Aktuelle Zeit: Sa Aug 17, 2019 17:59

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



Ein neues Thema erstellen Auf das Thema antworten  [ 16 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: Direkt auf Bitmap zeichnen (OpenGL)
BeitragVerfasst: Mo Jun 24, 2019 00:08 
Offline
DGL Member
Benutzeravatar

Registriert: Do Nov 04, 2010 20:04
Beiträge: 169
Wohnort: Köln
Programmiersprache: Delphi
Ich rendere meine Plugins auf das DC von meinem Window. (Das Flackert aber ohne spezielle tricks)

Jetzt möchte ich aber direkt auf ein Bitmap zeichnen wie muss ich den CreateRenderingContext erstellen damit dieser erkennt das ich auf ein Bitmap zeichnen will?
Das HBitmap wird von außerhalb übergeben.

Code:
  1.     glDC := GetDC(WinHandle);
  2.  
  3.     // Renderkontext erstellen (32 Bit Farbtiefe,
  4.     // 32 Bit Tiefenpuffer, Doublebuffering)
  5.     h_RC := CreateRenderingContext(glDC, [opDoubleBuffered], 24, 32, 0, 0, 0, 0);


verwende ich jetzt
Code:
  1.  
  2. glDC := CreateCompatiblemDC(GetDC(WinHandle));


Dann wird im CreateRenderingContext erkannt das ich ein Bitmap anstelle eines Fenster verwenden will.
Aber es rendert nichts.
Fehler gibt es aber auch nicht.

crosspost.. https://www.delphipraxis.net/201102-dir ... pengl.html

gruss


Zuletzt geändert von EWeiss am Fr Aug 02, 2019 20:33, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Jun 25, 2019 04:19 
Offline
DGL Member
Benutzeravatar

Registriert: Do Nov 04, 2010 20:04
Beiträge: 169
Wohnort: Köln
Programmiersprache: Delphi
Macht es noch sinn hier irgend eine Frage zu stellen?
Das Forum scheint Tot zu sein.

gruss


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Jun 25, 2019 18:45 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 1987
Programmiersprache: C++
Du kannst nicht direkt in ein Bitmap zeichnen.
Schau mal in Richtung FBO welches du dann ins Bitmap kopierst. Gibt auch Tutorials dazu.

_________________
Steppity,steppity,step,step,step! :twisted:
❆ ❄ ❄ ❄ ❅ ❄ ❆ ❄ ❅ ❄ ❅ ❄ ❅ ❄ ❄
❄ ❄ ❄ ❅ ❄ ❄ ❄ ❅ ❄ ❄ ❆ ❄ ❄


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Jun 25, 2019 21:41 
Offline
DGL Member
Benutzeravatar

Registriert: Do Nov 04, 2010 20:04
Beiträge: 169
Wohnort: Köln
Programmiersprache: Delphi
i0n0s hat geschrieben:
Du kannst nicht direkt in ein Bitmap zeichnen.
Schau mal in Richtung FBO welches du dann ins Bitmap kopierst. Gibt auch Tutorials dazu.

Wo kann ich das erlesen? OK hier..https://wiki.delphigl.com/index.php/Tut ... fferobject
Danke für deinen Beitrag.

Oder hast du vielleicht ein kleines Sample wo ich das nachverfolgen kann?
----------------------------

Mein Problem ist folgendes ..
Ich möchte eine Texture oder was auch immer ohne OpenGL Window in meiner Anwendung visualisieren.

Siehe Shot. Corona wird in OpenGL gerendert.

Im Moment erstelle ich ein OpenGL Window auf meine Haupt Anwendung (Fenster).
Damit ich die Visualisierung sehen kann muss ich den Container der über dem OpenGL Window liegt durchsichtig machen also mit Alpha wert 160..
Das verändert aber meine Schrift und alles andere was in diesen Window gezeichnet wird.
Das möchte ich umgehen in dem ich auf eine andere weise das Bitmap Rendere.. also direkt in meinem Container ohne Hintergrund OpenGL Window.

PS:
Wenn das nicht geht wie du sagst dann frage ich mich was diese Flags sollen.. Entweder ich kann auf ein Bitmap zeichnen oder nicht.
Code:
  1.      if AType in MemoryDCs then
  2.       dwFlags := dwFlags or PFD_DRAW_TO_BITMAP // Draw to Bitmap, warum soll es dann nicht gehen und wenn du recht hast was soll das ganze.
  3.     else
  4.       dwFlags := dwFlags or PFD_DRAW_TO_WINDOW;
  5.  
  6.     if opDoubleBuffered in Options then
  7.       dwFlags := dwFlags or PFD_DOUBLEBUFFER;
  8.  
  9.     if opGDI in Options then
  10.       dwFlags := dwFlags or PFD_SUPPORT_GDI;
  11.  


Bsp:
Ich übergebe ein HBitmap.. aus meiner Anwendung
und mache das hier..

Code:
  1.  
  2. glDC := CreateComatibleDC(0)
  3. // oder
  4. glDC := CreateComatibleDC(GetDC(Mein WindowHandle));
  5. OldBitmap := SelectObject(glDC, Mein übergebenes Bitmap));
  6.  

warum soll das nicht gehen mit dem Flag PFD_DRAW_TO_BITMAP..

gruss


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


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Jun 25, 2019 23:34 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 1987
Programmiersprache: C++
Zitat:
You should avoid using this flag during context creation, as it may cause you to not get a hardware-accelerated rendering context. It will give you the Microsoft OpenGL version 1.1 software renderer.

Es ist ein historischer Flag und er sollte nicht mehr verwendet werden.
Ein Sample habe ich nicht, aber das OpenGL-Fenster braucht nicht sichtbar sein. Du zeichnest ja in den Buffer und nicht in den DC.

_________________
Steppity,steppity,step,step,step! :twisted:
❆ ❄ ❄ ❄ ❅ ❄ ❆ ❄ ❅ ❄ ❅ ❄ ❅ ❄ ❄
❄ ❄ ❄ ❅ ❄ ❄ ❄ ❅ ❄ ❄ ❆ ❄ ❄


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Jun 25, 2019 23:39 
Offline
DGL Member
Benutzeravatar

Registriert: Do Nov 04, 2010 20:04
Beiträge: 169
Wohnort: Köln
Programmiersprache: Delphi
i0n0s hat geschrieben:
Zitat:
You should avoid using this flag during context creation, as it may cause you to not get a hardware-accelerated rendering context. It will give you the Microsoft OpenGL version 1.1 software renderer.

Es ist ein historischer Flag und er sollte nicht mehr verwendet werden.
Ein Sample habe ich nicht, aber das OpenGL-Fenster braucht nicht sichtbar sein. Du zeichnest ja in den Buffer und nicht in den DC.


Entschuldige verstehe ich jetzt nicht..
Wie kann ich dann den Buffer in meinem Container zeichnen wenn ich kein DC benötigt?
Denn die Daten müssen ja wo rein und sichtbar sein. (Kein DC, kein Window.. wohin dann? )
So wie du sagst kann ich ja kein Bitmap als RenderContex definieren.

Zur zeit ist das meine Übergabe
Code:
  1.  
  2.           mExec.Pluginfile := PAnsiChar(Filename);
  3.           mExec.SON_ConfigFile := PAnsiChar(PluginDir + 'vis.ini');
  4.           mExec.SON_UseOpenGL := true;
  5.           mExec.SON_ParentHandle := gG.MainHandle;
  6.           mExec.SON_ViewportWidth := 1024;
  7.           mExec.SON_ViewportHeight := 800;
  8.           mExec.SON_ShowPrgBar := false;
  9.           mExec.SON_ShowFPS := false;
  10.           mExec.SON_UseCover := false;
  11.           mExec.SON_PaintHandle := 0; // Scheint ja nach deiner Aussage nicht zu gehen.. gut muss ich dann wieder entfernen.
  12.           mExec.Left := 14;
  13.           mExec.Top := 46;
  14.           mExec.Width := Rect.Right;
  15.           mExec.Height := Rect.Bottom;
  16.  


Und auf dem Parent (Window) wohlbemerkt wird gezeichnet.
Anschließend erstelle ich in meiner Library ein Fenster auf dem gerendert wird und das parent davon ist VisRenderThread.ParentHandle
Mein Fenster das ich übergeben habe und in dem gerendert werden soll (lieber wäre mir ein Bitmap)

Code:
  1.  
  2.   if Windows.RegisterClass(wClass) <> 0 then
  3.   begin
  4.     if VisRenderThread.PaintHandle <> 0 then
  5.       glCtrl^ := VisRenderThread.ParentHandle
  6.     else
  7.     glCtrl^ := CreateWindowEx(0, SOClassName, SOTitle, WS_CHILD or WS_VISIBLE or
  8.       WS_CLIPSIBLINGS or WS_CLIPCHILDREN, 0, 0, 100, 100, VisRenderThread.ParentHandle, 0, h_Instance, nil);
  9.   end;
  10.  


den Buffer erstelle ich so
Code:
  1.  
  2.   FillChar(BmpInfo, sizeof(BITMAPINFO), 0);
  3.   BmpInfo.bmiHeader.biSize := sizeof(BITMAPINFOHEADER);
  4.   BmpInfo.bmiHeader.biWidth := StretchWidth;
  5.   BmpInfo.bmiHeader.biHeight := -StretchHeight;
  6.   BmpInfo.bmiHeader.biPlanes := 1;
  7.   BmpInfo.bmiHeader.biBitCount := 32;
  8.  
  9.   VisBmp := CreateDIBSection(0, BmpInfo, DIB_RGB_COLORS, VisBuf, 0, 0);
  10.   VisDC := CreateCompatibleDC(0);
  11.  
  12.   if (VisBmp = 0) or (VisBuf = nil) or (VisDC = 0) then
  13.   begin
  14.     if (VisBmp <> 0) then
  15.       DeleteObject(VisBmp);
  16.     if (VisDC <> 0) then
  17.       DeleteDC(VisDC);
  18.  
  19.     BassFuncs^.SetError(DWORD(BASS_ERROR_UNKNOWN));
  20.     exit;
  21.   end;
  22.  
  23.   SelectObject(VisDC, VisBmp);
  24.  
  25.   if (VisInfo^.VisBmp <> 0) then
  26.     DeleteObject(VisInfo^.VisBmp);
  27.   if (VisInfo^.VisDC <> 0) then
  28.     DeleteDC(VisInfo^.VisDC);
  29.  
  30.   VisInfo^.VisDC := VisDC;
  31.   VisInfo^.VisBuf := VisBuf;
  32.   VisInfo^.VisBmp := VisBmp;
  33.  


und der wird auf diese weise gerendert.
Code:
  1.         if (not VisInfo^.VisPointer^.Render(VisInfo^.VisBuf, StretchWidth, StretchHeight,
  2.             StretchWidth, @VisData)) then
  3.  


und der rest..
Code:
  1.        
  2.         glClearColor(0.0, 0.0, 0.0, 0.0);
  3.         glClear(GL_COLOR_BUFFER_BIT);
  4.         glLoadIdentity();
  5.  
  6.         EnterCriticalSection(CritSect);
  7.         try
  8.           if VisTexture <> 0 then
  9.             glBindTexture(GL_TEXTURE_2D, VisTexture);
  10.           glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, StretchWidth, StretchHeight, GL_BGRA,
  11.             GL_UNSIGNED_BYTE, VisInfo^.VisBuf);
  12.         finally
  13.           LeaveCriticalSection(CritSect);
  14.         end;        
  15.        
  16.         glColor4f(1, 1, 1, 1);
  17.         glEnable(GL_TEXTURE_2D);
  18.  
  19.         glBegin(GL_QUADS);
  20.         glTexCoord2d(0.0, 0.0);
  21.         glVertex2f(0.0, 0.0);
  22.         glTexCoord2d(0.0, 1.0);
  23.         glVertex2f(0.0, LastHeight);
  24.         glTexCoord2d(1.0, 1.0);
  25.         glVertex2f(LastWidth, LastHeight);
  26.         glTexCoord2d(1.0, 0.0);
  27.         glVertex2f(LastWidth, 0.0);
  28.         glEnd();
  29.  
  30.         if length(BassSoInfo.SongTitle) > 0 then
  31.         begin
  32.           BassSoVis.SongRender;
  33.           if SON_ShowFPS then
  34.             BassSoVis.GetFramesInSec;
  35.  
  36.           if SON_ShowPrgBar then
  37.           begin
  38.             SON_Current_YPos := 20;
  39.             ProgressBarRender;
  40.           end
  41.           else
  42.             SON_Current_YPos := 5;
  43.         end;
  44.  
  45.         glFlush;
  46.         SwapBuffers(glDC);
  47.  
  48.  


das ist der Hauptpart..
Code:
  1.  
  2.           glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, StretchWidth, StretchHeight, GL_BGRA,
  3.             GL_UNSIGNED_BYTE, VisInfo^.VisBuf);
  4.  

Aber dadurch bekomme ich das teil nicht in mein Fenster.. bzw.. schon aber dann flackert es arg.

Danke noch für deine Hilfe..

gruss


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Jun 26, 2019 12:14 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1207
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Könnte dies weiter helfen ?

https://wiki.delphigl.com/index.php/Laz ... ramepuffer

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Jun 26, 2019 12:25 
Offline
DGL Member
Benutzeravatar

Registriert: Do Nov 04, 2010 20:04
Beiträge: 169
Wohnort: Köln
Programmiersprache: Delphi
mathias hat geschrieben:

Danke Mathias werde es mir mal anschauen.
Ist zwar Lazarus muss halt schauen wie ich das in Delphi umsetzen kann. ;)

gruss


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Jun 26, 2019 12:28 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1207
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Der einfachste Weg wird sein, wen du es direkt mit Lazarus probierst.
Unter Win hast du dies schnell eingerichtet.

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Jun 26, 2019 12:33 
Offline
DGL Member
Benutzeravatar

Registriert: Do Nov 04, 2010 20:04
Beiträge: 169
Wohnort: Köln
Programmiersprache: Delphi
mathias hat geschrieben:
Der einfachste Weg wird sein, wen du es direkt mit Lazarus probierst.
Unter Win hast du dies schnell eingerichtet.

Das nutz mir nichts weil ich in Delphi arbeite muss es so oder so dort einbinden.

Danke habe es mir angeschaut hilft mir nicht weiter..
Werde das wohl verwerfen müssen.

gruss


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Jun 27, 2019 12:25 
Offline
DGL Member
Benutzeravatar

Registriert: Do Nov 04, 2010 20:04
Beiträge: 169
Wohnort: Köln
Programmiersprache: Delphi
Hat wirklich niemand ein einfaches Beispiel wie ich den FBO erstellen und damit auf ein Bitmap zeichnen kann? (Delphi natürlich) ;)
Der Artikel in der Wiki ist ja fein.. wäre aber besser wenn man das dort besprochenen Tutorial auch laden könnte. (als Quelle nicht als Text)

Ich möchte den VisInfo^.VisBuf in ein Bitmap bringen.. wie ist mir eigentlich egal solange es irgend's geht.
Von einer DLL in die Anwendung.

Code:
  1. glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, StretchWidth, StretchHeight, GL_BGRA, GL_UNSIGNED_BYTE, VisInfo^.VisBuf);


gruss


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Jun 27, 2019 18:06 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1207
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Zum Tutorial sollte auch die kompleten Sourcen vorhanden sein.
Die .pas Dateiein sind mit Delphi indentisch.

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Jun 28, 2019 04:01 
Offline
DGL Member
Benutzeravatar

Registriert: Do Nov 04, 2010 20:04
Beiträge: 169
Wohnort: Köln
Programmiersprache: Delphi
mathias hat geschrieben:
Zum Tutorial sollte auch die kompleten Sourcen vorhanden sein.
Die .pas Dateiein sind mit Delphi indentisch.

Danke ich habe es mir angeschaut aber nein ist nicht identisch mit Delphi..
Trotzdem Danke.

Zudem arbeite ich mit der dglOpenGL.pas die in keinen der BEispielen vorkommt.
Selbst bei einem versuch es nach Delphi zu portieren würden mir die ganzen Abhängigkeiten bzgl.. der fehlenden *.pas Dateien fehlen.
Lazarus möchte ich nicht installieren habe mir dadurch schon mal meine D2010 Installation zerschossen.

gruss


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Jun 28, 2019 16:50 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1207
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Die dglopebgl.pas wird on jedem Beispiel verwendet.

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Jun 28, 2019 17:37 
Offline
DGL Member
Benutzeravatar

Registriert: Do Nov 04, 2010 20:04
Beiträge: 169
Wohnort: Köln
Programmiersprache: Delphi
mathias hat geschrieben:
Die dglopebgl.pas wird on jedem Beispiel verwendet.

Es hat mir jemand in der DP ein Beispiel aufgesetzt wie es funktionieren könnte.
Werde das mal testen.

https://www.delphipraxis.net/1435558-post7.html

gruss


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder 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:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.060s | 18 Queries | GZIP : On ]