Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Direct3D-Oberfläche auf einen Teil eines Panels zeichnen (https://www.delphipraxis.net/121515-direct3d-oberflaeche-auf-einen-teil-eines-panels-zeichnen.html)

Nogge 29. Sep 2008 15:11


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

DeddyH 29. Sep 2008 15:12

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?

Nogge 29. Sep 2008 15:18

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

Medium 29. Sep 2008 17:00

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.

igel457 29. Sep 2008 17:18

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: http://andorra.cvs.sourceforge.net/a...w=markup#l_588


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:27 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz