Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi 2D-Bild (array of byte's) mit Direct3D darstellen (https://www.delphipraxis.net/118621-2d-bild-array-bytes-mit-direct3d-darstellen.html)

Nogge 11. Aug 2008 19:15


2D-Bild (array of byte's) mit Direct3D darstellen
 
Hallo Community,
ich suche jetzt schon seit Stunden überall im Netz ein Tutorial für das einfache Darstellen eines 2D-Bildes in Form eines array of array of Byte mithilfe von Direct3D. Dabei soll ein Byte eine Farbe/einen Pixel darstellen. DirectDraw soll veraltet sein, sodass ich mich für Direct3D entschieden habe. Ich weiß aber absolut nicht, wie ich folgendes erreichen kann (PseudoCode):

Delphi-Quellcode:
1.) renderObj.Parent := PaintBox1.Handle;
2.) renderObj.CopyMem(@myPic, sizeof(myPic));
3.) renderObj.render;
Kann mir da jmd helfen?

Vielen Dank, Nogge

Nogge 22. Aug 2008 14:17

Re: 2D-Bild (array of byte's) mit Direct3D darstellen
 
ich habe es jetzt geschafft, ein 2D-Bild zu zeichnen, aber maxPrimitiveCount ist zu wenig, d.h. ich kann nur 65000 Points zeichnen.
Delphi-Quellcode:
// Lock the Vertex Buffer to get the pointer
  hRes := D3DVertexBuffer.Lock(0, dataSize, pBuffer,
                                    D3DLOCK_DISCARD or D3DLOCK_NOSYSLOCK);
  if (FAILED(hRes)) then
  begin
    result := E_FAIL;
    exit;
  end;

  // fill the buffer with the vertices
  copyMemory(pBuffer, @pixelList[0], dataSize);

  // Unlock the buffer
  if (FAILED(D3DVertexBuffer.Unlock())) then
  begin
    result := E_FAIL;
    exit;
  end;

  for i := 0 to high(pixelList) do
  begin
    pixelList[i].x      := i mod SCREEN_WIDTH;
    pixelList[i].y      := i div SCREEN_WIDTH;
    pixelList[i].z      := 0.5;
    pixelList[i].rhw    := 1.0;
    pixelList[i].color  := data[i];
  end;

//[...]

D3DDevice.SetStreamSource(0, D3DVertexBuffer, sizeof(TPixel));
D3DDevice.SetVertexShader( POINT_FLAGS );
D3DDevice.DrawPrimitive(D3DPT_POINTLIST, 0, len); // wenn len>65000, dann zeichnet er nur noch schwarz ab der Stelle
Wie ist es möglich, mit einer älteren GraKa z.B. eine 400x250 Zeichenoberfläche pixelgenau zu zeichnen?

finn91 22. Aug 2008 14:20

Re: 2D-Bild (array of byte's) mit Direct3D darstellen
 
Hallo,

Vielleicht solltest du daraus eine Textur machen. Erscheint mir der leichtere Weg.

Gruß,

Finn

Nogge 22. Aug 2008 14:23

Re: 2D-Bild (array of byte's) mit Direct3D darstellen
 
Mh, ich brauche es allerdings für eine Echtzeitanwendung, d.h. es soll das Bild einer Kamera dargestellt werden. Daher wollte ich über die GraKa gehen und nicht eine einfache Textur per CPU rendern lassen. Desweiteren ändern sich das Bild ja ständig und ich weiß nicht, ob dazu eine Textur die beste Wahl ist. Oder kann man dies auch über Direct3D realisieren?

finn91 22. Aug 2008 14:38

Re: 2D-Bild (array of byte's) mit Direct3D darstellen
 
Tut mir leid, aber da bin ich leider in wenig überfragt. Ich weis nicht, ob man den Weg über die CPU ganz aussparen kann. Allerdings gibt es ja Videoplayer, die das Bild über Direct3D rendern (Stichwort: Hardwarebeschleunigung), vielleicht hilft dir das ja irgendwie weiter. Das müsste deinem Szenario ja recht ähnlich sein.

Gruß,

Finn

Nogge 25. Aug 2008 22:09

Re: 2D-Bild (array of byte's) mit Direct3D darstellen
 
So, ich habe es jetzt selbst herausgefunden. Man benötigt folgende Funktionen, die ich hier mal als Stichworte für andere Bedürftige hinterlasse:
  • Direct3DCreate8(D3D_SDK_VERSION)
  • GetAdapterDisplayMode(..)
  • CreateDevice(..)
  • GetBackBuffer(..)
  • CreateImageSurface(..)
  • LockRect(..), copyMemory(..), UnlockRect(..)
  • CopyRects(..) // Funktion des Interfaces IDIRECT3DDEVICE8
Bei Fragen könnt ihr mir ne Nachricht hinterlassen.

Gruß Nogge


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:35 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