![]() |
Direct3D-Oberfläche auf einen Teil eines Panels zeichnen
Hallo Community,
ich benutze CreateImageSurface unter Direct3D mit Directx 8, um die Frames einer Kamera auf einem Panel darzustellen. Jetzt möchte ich aber nicht das ganze Panel ausfüllen, sondern nur einen Ausschnitt davon, d.h. von Position 25,25 bis 100,100 anstatt 0,0 bis 100,100. Weiß jemand, welchen Befehl ich dafür brauche bzw. welche bereits verwendeten Befehle ich modifizieren muss? Ich finde bislang nichts diesbzgl. im Inet. Nogge |
Re: Direct3D-Oberfläche auf einen Teil eines Panels zeichnen
Du musst den 3. Befehl modifizieren :mrgreen: . Nee, im Ernst, was sollen wir ohne Source denn sagen?
|
Re: Direct3D-Oberfläche auf einen Teil eines Panels zeichnen
Naja, ich benutze halt das, was nötig für die Erstellung einer Surface ist ;)
Delphi-Quellcode:
ZeroMemory(@d3dpp, sizeof(d3dpp));
d3dpp.Windowed := true; d3dpp.hDeviceWindow := hMainWnd; d3dpp.SwapEffect := D3DSWAPEFFECT_DISCARD; d3dpp.BackBufferCount := 1; d3dpp.BackBufferWidth := SCREEN_WIDTH; d3dpp.BackBufferHeight := SCREEN_HEIGHT; d3dpp.BackBufferFormat := D3DDisplayMode.Format; // Create the D3D Device hRes := D3DObject.CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hMainWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, d3dpp, D3DDevice); if (FAILED(hRes)) then begin result := E_FAIL; exit; end; [...] hRes := D3DDevice.CreateImageSurface(SCREEN_WIDTH, SCREEN_HEIGHT, D3DFMT_X8R8G8B8, D3DSurface); if (FAILED(hRes)) then begin result := E_FAIL; exit; end; [...] hRes := D3DSurface.LockRect(buffer, nil, 0); if (FAILED(hRes)) then begin result := E_FAIL; exit; end; // fill the buffer with the pixel information pDest := PByte(buffer.pBits); for i := 0 to high(data) do begin copyMemory(pDest, @data[i], sizeOf(TLine)); inc(pDest, buffer.Pitch); end; hRes := D3DSurface.UnlockRect; if (FAILED(hRes)) then begin result := E_FAIL; exit; end; [...] D3DDevice.Clear(0, nil, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,0), 1, 0); if (SUCCEEDED( D3DDevice.BeginScene() )) then begin D3DDevice.CopyRects(D3DSurface, nil, 0, D3DBackBuffer, nil); if ( FAILED( D3DDevice.EndScene() ) ) then begin result := E_FAIL; exit; end; D3DDevice.Present(nil, nil, 0, nil); end |
Re: Direct3D-Oberfläche auf einen Teil eines Panels zeichnen
Ich würde da der Einfachheit halbar einfach ein weiteres Panel in das bestehende packen, dass die gewünschte Lage und Größe hat. Wenn ich da einigermaßen richtig informiert bin, zeichnet DX immer auf einen kompletten DC, ohne dass man innerhalb dieses noch Unterbereiche einteilen könnte.
|
Re: Direct3D-Oberfläche auf einen Teil eines Panels zeichnen
Du kannst einen Viewport einstellen. Alle Grafikoperationen (inklusive Swap) sind dann nur in diesem Bereich aktiv.
PS: ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:40 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 by Thomas Breitkreuz