AGB  ·  Datenschutz  ·  Impressum  







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

Direkt auf Bitmap zeichnen (OpenGL)

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

n/a Beiträge
 
#5

AW: Direkt auf Bitmap zeichnen (OpenGL)

  Alt 24. Jun 2019, 11:40
Zitat:
Naja, Du hats ja absolute nichts unternommen, um die Bitmap mit dem erzeugten device context zu verbinden. Sieh Dir mal die SelectObject API Funktion an. Wichtig: Speicher den Rückgabewert der Funktion und selektiere diesen wieder per SelectObject in den glDC bevor Du den zerstörst, sonst ist deine Bitmap futsch.
Du meinst sicherlich OldBmp := SelectObject(… Ich habe festgestellt das meistens das OldBitmap 0 ist, es ist also nicht sicher auf der weise die Rückgabe auszuwerten.

Das ist ja mein Problem
Was soll ich unternehmen um das DC mit dem device context zu verbinden?

Das Bitmap kann nicht zerstört werden es wird von außen zugeführt und ist solange gültig wie die Anwendung läuft.
Das einzige was verloren geht ist das DC.. nach jedem
Delphi-Quellcode:
        glFlush;
        SwapBuffers(glDC);
Ich könnte vor glClearColor das DC neu zuweisen und selektieren.. was anderes fällt mir da jetzt nicht ein.
Delphi-Quellcode:
glDC := CreateCompatibleDc(0);
SelectObject(glDC, MeinÜbergebenesBitmap);
PS:
Bitmap erstellen..

Delphi-Quellcode:
    if gBin.UsePlugin then
    begin
      sFile := SpriteResPath + 'plugin.png';
      if FileExists(sFile) then
        gSprDisplayC.GI_SetFromFile(HSprDisplayC, PWideChar(sFile))
    end
    else
    gSprDisplayC.GI_SetFromFile(HSprDisplayC, gG.PhoneBackground);
Dieses wird in meiner Lib intern gespeichert und kann damit zurückgeholt werden..
Mein Container und dessen Handle mit dem das Bitmap erstellt wurde. (Typ Bitmap)

gSprDisplayC.GI_GetProperty(HSprDisplayC, GI_BITMAP);

Jetzt übergeben ich das an meinen BassVis Wrapper..
Delphi-Quellcode:
          mExec.Pluginfile := PAnsiChar(Filename);
          mExec.SON_ConfigFile := PAnsiChar(PluginDir + 'vis.ini');
          mExec.SON_UseOpenGL := true;
          mExec.SON_ParentHandle := HSprDisplayC;
          mExec.SON_ViewportWidth := 1024;
          mExec.SON_ViewportHeight := 800;
          mExec.SON_ShowPrgBar := false;
          mExec.SON_ShowFPS := false;
          mExec.SON_UseCover := false;
          mExec.SON_PaintHandle := gSprDisplayC.GI_GetProperty(HSprDisplayC, GI_BITMAP); // hier das Bitmap
          mExec.Left := 0;
          mExec.Top := 0;
          mExec.Width := Rect.Right;
          mExec.Height := Rect.Bottom;
Delphi-Quellcode:
        Base.VisHandle := BASSSoVisAPI.SONIQUEVIS_CreateVis(Param^.PluginFile,
                                                    Param^.SON_ConfigFile,
                                                    Param^.Left,
                                                    Param^.Top,
                                                    Param^.Width,
                                                    Param^.Height,
                                                    Param^.SON_ParentHandle,
                                                    Param^.SON_ViewportWidth,
                                                    Param^.SON_ViewportHeight,
                                                    Param^.SON_ShowPrgBar,
                                                    Param^.SON_ShowFPS,
                                                    Param^.SON_UseCover,
                                                    Param^.SON_PaintHandle,
                                                    Param^.SON_UseOpenGL);
In der DLL erstelle ich das DC

Delphi-Quellcode:
function TBASSSoVis.IntMeinGL(WinHandle: HWND): BOOL;
var
  IntI, IntJ: integer;

begin
  // OpenGL-Funtionen initialisieren
  Result := False;

  try
    LastWidth := 0;
    LastHeight := 0;

    if not InitOpenGL then
      Halt;

    glDC := CreateCompatibleDc(GetDC(WinHandle)); // hier mein DC
nur damit ich über CreateRenderingContext die richtigen Flags bekomme.

Und nun beim rendern vor glClearColor..
Delphi-Quellcode:
        if VisRenderThread.PaintHandle <> 0 then
        begin
          glDC := CreateCompatibleDc(GetDC(VisRenderThread.ParentHandle));
          SelectObject(glDC, VisRenderThread.PaintHandle);
        end;
Was wird gerendert? Nichts!

Nebenbei gelöscht werden darf das Bitmap in meinem Wrapper nicht der ist nicht der Eigentümer davon das ist mein Container mit dem es erstellt wurde
der gibt das beim beenden wieder frei.

gruss

Geändert von EWeiss (24. Jun 2019 um 14:35 Uhr)
  Mit Zitat antworten Zitat
 


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 06:17 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