AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi 2D-Bild (array of byte's) mit Direct3D darstellen

2D-Bild (array of byte's) mit Direct3D darstellen

Ein Thema von Nogge · begonnen am 11. Aug 2008 · letzter Beitrag vom 25. Aug 2008
Antwort Antwort
Nogge

Registriert seit: 15. Jul 2004
336 Beiträge
 
Delphi 7 Professional
 
#1

2D-Bild (array of byte's) mit Direct3D darstellen

  Alt 11. Aug 2008, 20:15
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
  Mit Zitat antworten Zitat
Nogge

Registriert seit: 15. Jul 2004
336 Beiträge
 
Delphi 7 Professional
 
#2

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

  Alt 22. Aug 2008, 15:17
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?
  Mit Zitat antworten Zitat
finn91

Registriert seit: 24. Jun 2007
16 Beiträge
 
#3

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

  Alt 22. Aug 2008, 15:20
Hallo,

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

Gruß,

Finn
  Mit Zitat antworten Zitat
Nogge

Registriert seit: 15. Jul 2004
336 Beiträge
 
Delphi 7 Professional
 
#4

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

  Alt 22. Aug 2008, 15:23
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?
  Mit Zitat antworten Zitat
finn91

Registriert seit: 24. Jun 2007
16 Beiträge
 
#5

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

  Alt 22. Aug 2008, 15:38
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
  Mit Zitat antworten Zitat
Nogge

Registriert seit: 15. Jul 2004
336 Beiträge
 
Delphi 7 Professional
 
#6

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

  Alt 25. Aug 2008, 23:09
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
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 +2. Es ist jetzt 14:33 Uhr.
Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf