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
 
#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
 


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