JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=a634f91cfe234597d5a1204baf23b3ecMedaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Wie krieg ich den Backbuffer in ein Surface? Bin verzweifelt

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Nomis_Simon
Mini JLI'ler


Alter: 35
Anmeldedatum: 18.08.2006
Beiträge: 12

Medaillen: Keine

BeitragVerfasst am: 18.08.2006, 16:16    Titel: Wie krieg ich den Backbuffer in ein Surface? Bin verzweifelt Antworten mit Zitat

Wieso lässt sich der bäckbuffer unter DX9 nicht in ein Surface
Kopieren? Ich meine man kann ihn ja auch über LockRect sperren wieso dann nicht das. Sad
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 18.08.2006, 18:04    Titel: Antworten mit Zitat

Harhar endlich kann ich mein Wissen mal anwenden, so funktioniert es bei mir und auch noch sehr flott. Beachte das ich keinerlei Texturfilter benutzte da ich eine 1:1 Kopie machen möchte und alles andere zuviel performance kosten würde.

Zusätzliche Sicherheitschecks wären auch noch gut.

Surface ist vom Typ IDirect3DSurface9*
Texture vom Typ IDirect3DTexture9* wurde dabei so erstellt:

CPP:
Texture_cl::CreateTexture(unsigned int Width, unsigned int Height, D3DFORMAT Format)
{
   if (Format==D3DFMT_UNKNOWN)
      Format = get_BackBufferFormat();
   if (Width==0)
      Width = get_BackBufferWidth();
   if (Height==0)
      Height = get_BackBufferHeight();

   unsigned int tmp = 2;
   while (tmp<Width) tmp *= 2;
   Width = tmp;

   tmp = 2;
   while(tmp<Height) tmp *= 2;
   Height = tmp;

   // create our texture from scratch
   if (FAILED( D3DXCreateTexture(get_Device(), Width, Height, 0, D3DUSAGE_RENDERTARGET, Format, D3DPOOL_DEFAULT, &Texture) ))
      throw Exception("Unable to create."));
}


CPP:
IDirect3DSurface9* Texture_cl::get_Surface()
{
   if (Surface)
      Surface->Release();
   Surface = NULL;
   if (FAILED(Texture->GetSurfaceLevel(0, &Surface) ))
      throw Exception(Unable to get surface."));

   return Surface;
}

void Texture_cl::CopyBackBuffer(unsigned int OffsetX, unsigned int OffsetY, unsigned int Width, unsigned int Height)
{
   if (Width==0)
      Width = get_BackBufferWidth();
   if (Height==0)
      Height = get_BackBufferHeight();


   IDirect3DSurface9* Dest = get_Surface();
   IDirect3DSurface9* BackBuffer = NULL;

   if (FAILED( get_Device()->GetRenderTarget(0, &BackBuffer_) ))
      throw Exception("Unable to obtain BackBuffer surface");

   RECT Rect;
   Rect.left = OffsetX;
   Rect.top = OffsetY;
   Rect.right = Width+OffsetX;
   Rect.bottom = Height+OffsetY;

   if (FAILED( get_Device()->StretchRect(BackBuffer_, &Rect, Dest_, &Rect, D3DTEXF_NONE) ))
      throw Exception("Unable to vopy BackBuffer surface");

   BackBuffer_->Release();
}

_________________
"I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse."
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Nomis_Simon
Mini JLI'ler


Alter: 35
Anmeldedatum: 18.08.2006
Beiträge: 12

Medaillen: Keine

BeitragVerfasst am: 18.08.2006, 19:51    Titel: Antworten mit Zitat

Leider hab ichs genau so versucht. Ich hab den Backbuffer über StretchRect einfach in
ein surface kopiert. Das schlägt aber fehl. Hab es zurzeit mit LockRect gelöst, das drückt mir die Framerate aber von 750 auf 11.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 18.08.2006, 19:53    Titel: Antworten mit Zitat

Was gibt er dir für Fehlercode?

Welches Format hat dein Backbuffer?

Bist du sicher das der gewähle Ausschnitt zum kopieren gut genug ist?

Was genau machst du, wie erstellst du deinen Backbuffer, deine TargetTexture?
_________________
"I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse."
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Nomis_Simon
Mini JLI'ler


Alter: 35
Anmeldedatum: 18.08.2006
Beiträge: 12

Medaillen: Keine

BeitragVerfasst am: 18.08.2006, 19:59    Titel: Antworten mit Zitat

Den fehlercode Hab ich mir noch nicht angeschaut. Erlich gesagt hab ich nur über das FAILED Makro überprüft ob es geglückt ist. Ich schau mir das aber sofort an.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Nomis_Simon
Mini JLI'ler


Alter: 35
Anmeldedatum: 18.08.2006
Beiträge: 12

Medaillen: Keine

BeitragVerfasst am: 18.08.2006, 20:15    Titel: Antworten mit Zitat

Boah!!

Auf a moi geht`s.
Wollt nur mit DXGetErrorDescription9() den Rückgabewert von StretchRect überprüfen und scho geht ois wia i woit.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Nomis_Simon
Mini JLI'ler


Alter: 35
Anmeldedatum: 18.08.2006
Beiträge: 12

Medaillen: Keine

BeitragVerfasst am: 18.08.2006, 20:44    Titel: Antworten mit Zitat

Es Funktioniert doch nicht der Rechner hat mir doch nur angezeigt was früher mal auf dem Surface gelegen ist.

hab mir den fehler genauer angeschau ist nämlich folgender:
D3DERR_INVALIDCALL

kann aber nichts damit anfangen.

hab die sache folgendermaßen initialisiert
Code:

// Initialisieren
LPDIRECT3DDEVICE9  m_lpD3DDevice;
LPDIRECT3DSURFACE9 m_lpBackBuffer;


 m_lpD3D = Direct3DCreate9(D3D_SDK_VERSION);

    if(NULL == m_lpD3D)
    {
        // Fehler, D3D-Objekt wurde nicht erzeugt
        return FALSE;
    }

    // Parameter für den Modus festlegen
    D3DPRESENT_PARAMETERS PParams;
    ZeroMemory(&PParams,sizeof(PParams));

    PParams.SwapEffect       = D3DSWAPEFFECT_DISCARD;
    PParams.hDeviceWindow    = hWnd;
    PParams.Windowed         = bWindowed;

    PParams.BackBufferWidth  = 1280;
    PParams.BackBufferHeight = 1024;
    PParams.BackBufferFormat = D3DFMT_A8R8G8B8;
   PParams.PresentationInterval=D3DPRESENT_INTERVAL_IMMEDIATE;
    HRESULT hr;
    PParams.Flags            = D3DPRESENTFLAG_LOCKABLE_BACKBUFFER;
    // Direct3D-Gerät anlegen
    if(FAILED(hr = m_lpD3D->CreateDevice(
                                 D3DADAPTER_DEFAULT,
                                 D3DDEVTYPE_HAL,
                                 hWnd,
                                 D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                                 &PParams,
                                 &m_lpD3DDevice)))
    {
        // Fehler, Gerät kann nicht angelegt werden
        const char* Err = DXGetErrorDescription9(hr);
 
        DXTRACE_MSG(Err);
      //D3DXCreateTextureFromFileEX(


        return FALSE;
    }
 
    // Zeiger auf dem Hintergrundpuffer holen
    m_lpD3DDevice->GetBackBuffer(0,0,
                                 D3DBACKBUFFER_TYPE_MONO,
                                 &m_lpBackBuffer);


so hab ich das Surface angelegt:
Code:

/erzeugen
LPDIRECT3DSURFACE9 m_lpBBCopy;

 if(FAILED(m_lpD3DDevice->CreateOffscreenPlainSurface(
                           320,256,
                           D3DFMT_A8R8G8B8,
                           D3DPOOL_DEFAULT,
                           &m_lpBBCopy,
                           0)))MessageBox(0,"GetoffscreenplainFehler","Titel",MB_OK);


und so wollte ich den backbuffer in die oberfläche kopieren
Code:

//Kopieren

ZoomArea.left = x-160;
ZoomArea.top = y-128;
ZoomArea.right = x+160;
ZoomArea.bottom = y+128;



if(FAILED(m_lpD3DDevice->StretchRect(m_lpBackBuffer,
                        &ZoomArea,
                        m_lpBBCopy,
                        NULL,
                        D3DTEXF_NONE))) MessageBox(0,"StretchRectFehler bei Backbuffer","Titel",MB_OK);






der letzte punkt funktioniert aber nich

Die hresult variable die ich beim letzten funktionsaufruf zurück bekomme sagt wie oben schon erwähnt

D3DERR_INVALIDCALL
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 18.08.2006, 21:08    Titel: Antworten mit Zitat

1.) D3DFMT_A8R8G8B8 durch D3DFMT_X8R8G8B8 ersetzen, Alpha beim Backbuffer erscheint mir etwas unnötig, darauf folgend deiner TargetTexture das selbe verpassen.

2.) Versuche dich an die power of 2 Norm zu halten, da nicht alle Grafikkarten non power of 2 Grössen beherrschen. Das hier erstellt für dich die nächst grösste power of 2 Grösse:

CPP:
unsigned int PowerOf2(unsigned int Value)
{
   unsigned int tmp = 2;
   while(tmp<Value) tmp *= 2;
   return tmp;
}


3.) Wenn du StretchRect ohne Filter und schnell haben möchtest solltest du beim 2ten Rect Parameter den gleichen Rect Grösse verwenden wie beim ersten Parameter (mit Grösse meine ich wirklich die Grösse und nicht nur das Rect)
_________________
"I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse."
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Nomis_Simon
Mini JLI'ler


Alter: 35
Anmeldedatum: 18.08.2006
Beiträge: 12

Medaillen: Keine

BeitragVerfasst am: 19.08.2006, 08:01    Titel: Antworten mit Zitat

D3DFMT_X8R8G8B8 das half leider nicht.

Erlich gesagt von diesem Power of2 hab ich noch nie was gehört vielleicht
kannst du mir einen Link geben wo das beschrieben steht


Was mir vielleicht helfen würde wäre ein komplett kleines Programm
das D3d initialisiert eine surface anlegt und dann den backbuffer fehlerfrei in das Surface zu legen. In ein Surface und keine Textur nur ein gewöhnliches Surface.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Nomis_Simon
Mini JLI'ler


Alter: 35
Anmeldedatum: 18.08.2006
Beiträge: 12

Medaillen: Keine

BeitragVerfasst am: 19.08.2006, 10:43    Titel: Antworten mit Zitat

Oh sorry hab erst jetzt die power of 2 sache verstanden
Ich habe bereits oberflächen deren größe keine Zweierpotenzen war kopiert und dabei auch größenändrungen übernommen. Hat immer funktioniert.

und das auch in den Backbuffer.
aber umgekehrt funktioniert es nicht.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 19.08.2006, 13:11    Titel: Antworten mit Zitat

Wenn es dir nichts ausmacht kannst du auch gerne das Projekt/Solution von dir packen und mir senden. Ich kanns dann mal anschaun, interessieren würde mich daran nur das 3D Zeugs.
_________________
"I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse."
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Nomis_Simon
Mini JLI'ler


Alter: 35
Anmeldedatum: 18.08.2006
Beiträge: 12

Medaillen: Keine

BeitragVerfasst am: 19.08.2006, 15:30    Titel: Antworten mit Zitat

Ja ok mach ich
Im grunde soll das nur so eine art moorhun werden wobei ich die sache mit dem backbuffer nur brauche um einen Zoom zu verwirklichen.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 20.08.2006, 20:24    Titel: Antworten mit Zitat

Ich habe mir deinen Code angesehen und so umgeschrieben wie ich es in meinem ersten post beschrieben habe. Backbuffer wird kopiert ohne grossartigen Zeitverlust. Hättest du schon QuadRendering könnte ich dir diesen sogar ausgeben lassen, leider hast du das nicht.
_________________
"I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse."
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Nomis_Simon
Mini JLI'ler


Alter: 35
Anmeldedatum: 18.08.2006
Beiträge: 12

Medaillen: Keine

BeitragVerfasst am: 21.08.2006, 08:43    Titel: Antworten mit Zitat

Danke! kannst du es mir dann auch gleich wider zurück schicken,ich hab nämlich gerade keine Ahnung wie du das gemacht hast.


Und was ist QuadRendering jetzt schon wieder??
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 21.08.2006, 09:53    Titel: Antworten mit Zitat

Mit QuadRendering meinte ich das rendern eines Quadrates oder Rechtecks, also 4 Vertexe welche ein Viereck ergeben. Auf dieses Viereck legt man dann seine Textur.

Mail sollte irgendwann im Laufe des Tages zu dir kommen.
_________________
"I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse."
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum