Einzelnen Beitrag anzeigen

EWeiss
(Gast)

n/a Beiträge
 
#3

AW: Direkt auf Bitmap zeichnen (OpenGL)

  Alt 24. Jun 2019, 11:10
CreateRenderingContext..
Delphi-Quellcode:
  glDC := GetDC(WinHandle);

  // Renderkontext erstellen (32 Bit Farbtiefe,
  // 32 Bit Tiefenpuffer, Doublebuffering)
  h_RC := CreateRenderingContext(glDc,
    [opDoubleBuffered], 24, 32, 0, 0, 0, 0);
  // Erstellten Renderkontext aktivieren
  ActivateRenderingContext(glDc, h_RC, True);
gezeichnet wird so..
Delphi-Quellcode:
        glClearColor(0.0, 0.0, 0.0, 0.0);
        glClear(GL_COLOR_BUFFER_BIT);
        glLoadIdentity();

        EnterCriticalSection(CritSect);
        try
          glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, StretchWidth, StretchHeight, GL_BGRA,
            GL_UNSIGNED_BYTE, VisInfo^.VisBuf);
        finally
          LeaveCriticalSection(CritSect);
        end;

        glColor4f(1, 1, 1, 1);
        glEnable(GL_TEXTURE_2D);

        if VisTexture <> 0 then
          glBindTexture(GL_TEXTURE_2D, VisTexture);
        glBegin(GL_QUADS);
        glTexCoord2d(0.0, 0.0);
        glVertex2f(0.0, 0.0);
        glTexCoord2d(0.0, 1.0);
        glVertex2f(0.0, LastHeight);
        glTexCoord2d(1.0, 1.0);
        glVertex2f(LastWidth, LastHeight);
        glTexCoord2d(1.0, 0.0);
        glVertex2f(LastWidth, 0.0);
        glEnd();

        if length(BassSoInfo.SongTitle) > 0 then
        begin
          BassSoVis.SongRender;
          if SON_ShowFPS then
            BassSoVis.GetFramesInSec;

          if SON_ShowPrgBar then
          begin
            SON_Current_YPos := 20;
            ProgressBarRender;
          end
          else
            SON_Current_YPos := 5;
        end;

        glFlush;
        SwapBuffers(glDC);
      end;
Bedingt durch diese Zeile teile ich dem CreateRenderingContext mit das ich auf ein Window zeichnen will das möchte ich aber nicht.
glDC := GetDC(WinHandle);

also gibt es nur die Möglichkeit das DC auf andere weise zu erstellen.
Über...
Delphi-Quellcode:
glDC := CreateCompatibleDc(0);
SelectObject(glDC, MeinÜbergebenesBitmap);
Sollte stimmen das Problem ist nur es rendert nicht.

In der Function CreateRenderingContext wird dann abhängig von der Erstellung des DC (MemoryDC, WindowDc.. usw..) das entsprechende Flag gesetzt.
Delphi-Quellcode:
  if GL_LibHandle = nil then
    InitOpenGL;

  FillChar(PFDescriptor, SizeOf(PFDescriptor), 0);

  with PFDescriptor do
  begin
    nSize := SizeOf(PFDescriptor);
    nVersion := 1;
    dwFlags := PFD_SUPPORT_OPENGL;

    AType := GetObjectType(DC);

    if AType = 0 then
      RaiseLastOSError;

    if AType in MemoryDCs then
      dwFlags := dwFlags or PFD_DRAW_TO_BITMAP
    else
      dwFlags := dwFlags or PFD_DRAW_TO_WINDOW;
Aber wie gesagt es tut sich nichts.

Im Moment mache ich es so das ich auf das DC meiner Haupt Anwendung zeichne und den Canvas auf die korrekte Position verschiebe.
Logischerweise ist das Fenster nicht sichtbar, es rendert zwar aber man sieht es nicht.
Deshalb wende ich einen Trick an in dem ich das darüberliegende Fenster einfach mit dem WS_EX_LAYERED Style versehe und den Alpha Kanal auf 160 einstelle.

Nur dann sind die Schriften etwas verblasst, was ich umgehen möchte indem ich direkt auf das Bitmap zeichne. (siehe Pic)
Direkt auf das Hauptfenster zeichnen Funktioniert nicht das Flackert extrem deshalb der Umweg über das Bitmap. (WM_ERASEBKGND) macht hier Probleme.

gruss

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