Einzelnen Beitrag anzeigen

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