Ich erstelle einen
GDI-VideoBuffer(VisBuf) abhängig vom Viewport = bsp. 512x384 außerhalb des Threads.
Die Visualisierung wird dann also in VollBild 1920x1200 auf den Viewport 512x384 gestretcht.
Das schont CPU resourcen.
Delphi-Quellcode:
FillChar(BmpInfo, SizeOf(BITMAPINFO), 0);
BmpInfo.bmiHeader.biSize := SizeOf(BITMAPINFOHEADER);
BmpInfo.bmiHeader.biWidth := StretchWidth;
BmpInfo.bmiHeader.biHeight := -StretchHeight;
BmpInfo.bmiHeader.biPlanes := 1;
BmpInfo.bmiHeader.biBitCount := 32;
VisBmp := CreateDIBSection(0, BmpInfo, DIB_RGB_COLORS, VisBuf, 0, 0);
Dann wird der Record VisData mit den Wave/FFT Daten gefüttert
und anschließend im Plugin selbst gerendert wo ich keinen Einfluss drauf habe
Delphi-Quellcode:
if (not VisInfo^.VisPointer^.Render(VisInfo^.VisBuf, StretchWidth,
StretchHeight, StretchWidth, @VisData)) then
anschließend hole ich mir das
DC vom
OpenGL Contex (RenderWindow)
DC := GetDc(ParentHandle);
Danach verwende ich StretchBlt um die Daten auf das
DC vom Source VisDC zu zeichnen
Delphi-Quellcode:
if (
not StretchBlt(
DC, VisInfo^.x, VisInfo^.y, VisInfo^.w, VisInfo^.h, VisInfo^.VisDC, 0,
0, StretchWidth, StretchHeight, SRCCOPY))
then
Anschließend wird der inhalt vom VisBuf in eine OGL-Texture kopiert
Delphi-Quellcode:
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, StretchWidth, StretchHeight, 0,
GL_BGRA_EXT, GL_UNSIGNED_BYTE, VisInfo^.VisBuf);
Der rest sind noch ein paar OGL sachen
Delphi-Quellcode:
glEnable(GL_TEXTURE_2D);
glBegin(GL_QUADS);
...
glFlush();
SwapBuffers(glDC);
Das wars dann.
Nach meiner änderung von Timer auf Thread geht es jetzt soweit und die Kerne werden
gleichmäßig ausgelastet.
Wenn aber nun aus der Anwendung heraus die resitz Message geschickt wird die außerhalb des threads läuft
Result := BASS_SONIQUEVIS_Resize(Param^.VisHandle, Left, Top, Width, Height);
dann kracht es gewaltig in irgendeiner OGL .dll
so sieht es im moment aus.
Zitat:
liest du etwa den
OpenGL-Framebuffer mit glReadPixels aus
Nein die Pixels werden in Rechtecke zerlegt aus der glTexImage2D Texture
Delphi-Quellcode:
glColor4f(1, 1, 1, 1);
glEnable(GL_TEXTURE_2D);
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();
gruss