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
|
Verfasst am: 18.08.2006, 16:16 Titel: Wie krieg ich den Backbuffer in ein Surface? Bin verzweifelt |
|
|
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. |
|
Nach oben |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 18.08.2006, 18:04 Titel: |
|
|
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 |
|
|
Nomis_Simon Mini JLI'ler
Alter: 35 Anmeldedatum: 18.08.2006 Beiträge: 12
Medaillen: Keine
|
Verfasst am: 18.08.2006, 19:51 Titel: |
|
|
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 |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 18.08.2006, 19:53 Titel: |
|
|
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 |
|
|
Nomis_Simon Mini JLI'ler
Alter: 35 Anmeldedatum: 18.08.2006 Beiträge: 12
Medaillen: Keine
|
Verfasst am: 18.08.2006, 19:59 Titel: |
|
|
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 |
|
|
Nomis_Simon Mini JLI'ler
Alter: 35 Anmeldedatum: 18.08.2006 Beiträge: 12
Medaillen: Keine
|
Verfasst am: 18.08.2006, 20:15 Titel: |
|
|
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 |
|
|
Nomis_Simon Mini JLI'ler
Alter: 35 Anmeldedatum: 18.08.2006 Beiträge: 12
Medaillen: Keine
|
Verfasst am: 18.08.2006, 20:44 Titel: |
|
|
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 |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 18.08.2006, 21:08 Titel: |
|
|
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 |
|
|
Nomis_Simon Mini JLI'ler
Alter: 35 Anmeldedatum: 18.08.2006 Beiträge: 12
Medaillen: Keine
|
Verfasst am: 19.08.2006, 08:01 Titel: |
|
|
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 |
|
|
Nomis_Simon Mini JLI'ler
Alter: 35 Anmeldedatum: 18.08.2006 Beiträge: 12
Medaillen: Keine
|
Verfasst am: 19.08.2006, 10:43 Titel: |
|
|
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 |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 19.08.2006, 13:11 Titel: |
|
|
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 |
|
|
Nomis_Simon Mini JLI'ler
Alter: 35 Anmeldedatum: 18.08.2006 Beiträge: 12
Medaillen: Keine
|
Verfasst am: 19.08.2006, 15:30 Titel: |
|
|
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 |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 20.08.2006, 20:24 Titel: |
|
|
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 |
|
|
Nomis_Simon Mini JLI'ler
Alter: 35 Anmeldedatum: 18.08.2006 Beiträge: 12
Medaillen: Keine
|
Verfasst am: 21.08.2006, 08:43 Titel: |
|
|
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 |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 21.08.2006, 09:53 Titel: |
|
|
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 |
|
|
|