AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Direkt auf Bitmap zeichnen (OpenGL)

Direkt auf Bitmap zeichnen (OpenGL)

Ein Thema von EWeiss · begonnen am 23. Jun 2019 · letzter Beitrag vom 28. Jun 2019
Antwort Antwort
EWeiss
(Gast)

n/a Beiträge
 
#1

AW: Direkt auf Bitmap zeichnen (OpenGL)

  Alt 25. Jun 2019, 15:20
Sorry das ich das nach 24 Stunden nochmal hoch pushe.. Hat noch jemand eine Idee?
Informationen sollten ja genug vorhanden sein

Das mit dem Flag "PFD_DRAW_TO_BITMAP" kann ich mir abschminken ist Software Rendering und uninteressant..
Frage mich nur warum man so etwas in einer Bibliothek noch drin lässt wenn es nichts taugt. Hmmmm

gruss

Geändert von EWeiss (26. Jun 2019 um 00:05 Uhr)
  Mit Zitat antworten Zitat
Fritzew

Registriert seit: 18. Nov 2015
Ort: Kehl
678 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Direkt auf Bitmap zeichnen (OpenGL)

  Alt 28. Jun 2019, 13:46
So sollte es gehen:

Delphi-Quellcode:
unit glHelper;

interface

uses
   Windows,
   graphics,
   dglOpenGl;

type
   TGlHelper = class
   private
      function GetGlBitmap(aWidth, aHeight: integer): TBitmap;
   protected
      procedure RenderSceneGL; virtual;
   end;

implementation

function TGlHelper.GetGlBitmap(aWidth, aHeight: integer): TBitmap;

type
   ByteArray = array [0 .. 0] of byte;
   pByteArray = ^ByteArray;

var
   lDataSize: Cardinal;
   lFrameBufferid: GLuint;
   lRenderbufferId: GLuint;
   lActViewtexure: GLuint;
   lData: Pointer;

   Y, X, x4: integer;
   pSrc, pDest: pByteArray;

begin
   result := nil;
   lDataSize := aWidth * aHeight * 4;
   if lDataSize > 0 then
      begin
  // Prepare fbo
         glDrawBuffer(GL_BACK);
         glGenFramebuffers(1, @lFrameBufferid);
         glBindFramebuffer(GL_FRAMEBUFFER, lFrameBufferid);

         glGenRenderbuffers(1, @lRenderbufferId);
         glBindRenderbuffer(GL_RENDERBUFFER, lRenderbufferId);

         glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, aWidth, aHeight);
         glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, lRenderbufferId);

         GLGenTextures(1, @lActViewtexure);
         GLBindTexture(GL_TEXTURE_2D, lActViewtexure);
         GLTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
         GLTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
         GLTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, aWidth, aHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, nil);

         GLFramebufferTexture2D(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, lActViewtexure, 0);

         glBindFramebuffer(GL_FRAMEBUFFER, lFrameBufferid);
         GLViewPort(0, 0, aWidth, aHeight);


  // render the scene part

         RenderSceneGL;
         GLFinish;

         glDrawBuffer(gl_Front);

         glBindRenderbuffer(GL_FRAMEBUFFER, 0);
         GLDeleteRenderbuffers(1, @lRenderbufferId);
         glBindFramebuffer(GL_FRAMEBUFFER, 0);
         GLDeleteFramebuffers(1, @lFrameBufferid);

         lData := AllocMem(lDataSize);
         try
            GLGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, lData);
            GLBindTexture(GL_TEXTURE_2D, 0);
            GLDeleteTextures(1, @lActViewtexure);
      // Prepare the Bitmap

            result := TBitmap.Create;
            result.PixelFormat := pf32bit;
            result.Width := aWidth;
            result.Height := aHeight;

            pSrc := @pByteArray(lData)[aWidth * 4 * (aHeight - 1)];
            for Y := 0 to aHeight - 1 do
               begin
                  pDest := result.ScanLine[Y];
                  for X := 0 to aWidth - 1 do
                     begin
                        x4 := X * 4;
                        pDest[x4 + 0] := pSrc[x4 + 2];
                        pDest[x4 + 1] := pSrc[x4 + 1];
                        pDest[x4 + 2] := pSrc[x4 + 0];
                        pDest[x4 + 3] := pSrc[x4 + 3];
                     end;
                  Dec(pSrc, aWidth * 4);
               end;
         finally
            FreeMem(lData);
         end;
      end;
end;

procedure TGlHelper.RenderSceneGL;
begin

end;

end.
Fritz Westermann
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#3

AW: Direkt auf Bitmap zeichnen (OpenGL)

  Alt 28. Jun 2019, 17:24
Hi Fritz..
Danke für deine Mühe werde es mal testen.

Verstehe nur nicht wie ich das in meinen Buffer portieren soll
Delphi-Quellcode:
          glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, StretchWidth, StretchHeight, GL_BGRA,
             GL_UNSIGNED_BYTE, VisInfo^.VisBuf);
Ich werde mal meinen Quelltext abändern der nur den einen Plugintyp unterstützt und dir den Source davon mal schicken wenn du möchtest.
Ohne Beispiel mit Quelltext wird das schwierig.

gruss

Geändert von EWeiss (28. Jun 2019 um 18:16 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#4

AW: Direkt auf Bitmap zeichnen (OpenGL)

  Alt 28. Jun 2019, 20:29
@Fritz.. Habe die DLL und ein Beispiel Projekt zum testen der DLL fertig..
Wenn du zeit und Lust dazu hast kann ich es gerne hochladen vielleicht kannst du mir das dann implementieren?

Ich weis leider nicht wie ich das alles zusammen bringen soll. (FBO keinerlei Erfahrung.)
Wir müssen dann nur ein Bitmap aus der Anwendung an die DLL schicken auf der dann gerendert werden soll.. (HBitmap also das Handle sollte doch reichen oder?)
wenn du Interesse daran hast werde ich das noch implementieren so das du dich damit nicht rumschlagen must.

gruss

Geändert von EWeiss (11. Jul 2019 um 15:58 Uhr)
  Mit Zitat antworten Zitat
Fritzew

Registriert seit: 18. Nov 2015
Ort: Kehl
678 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Direkt auf Bitmap zeichnen (OpenGL)

  Alt 28. Jun 2019, 21:39
Mache ich dir gerne, kommt im Moment etwas auf die Temperaturen an... 😄
Fritz Westermann
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#6

AW: Direkt auf Bitmap zeichnen (OpenGL)

  Alt 28. Jun 2019, 21:42
Mache ich dir gerne, kommt im Moment etwas auf die Temperaturen an... 😄
Das ist nett von dir..
Ich addiere noch das PaintBitmap zum übergeben an die Library dann lade ich das Archiv hoch.
Link schicke ich über PN.

Danke dir.

gruss
  Mit Zitat antworten Zitat
Antwort Antwort

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:31 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz