GUI Design gut?
-
Wenn du uns nicht sagen kannst, was nicht funktioniert, können wir dir auch nicht helfen. PIX zu verwenden und DirectX in den Debug Modus schalten wäre aber mal ne Maßnahme.
-
Ich habe D3D im Debug Modus, jedoch stimmt da alles. Es gibt keine Einzige Warnung, alle Funktionen geben D3D_OK zurück und auch sonst ist alles so wie es ist. Und zu mehr weiß ich die Debug Runtime nicht zu nutzen.
-
So lang du uns nicht zeigst was genau du machst werden wir dir hier kaum helfen können...
-
GUIFreak schrieb:
So, nach einer kleinen Motivationspause, habe ich es mal wieder probiert, jedoch wird einfach gar nichts auf meine Textur gerendert. So wird auch das transparent machen im moment unmöglich.
Mein Code sieht so aus, das Dreieck wird nicht gezeichnet:void Init() { //..... d3dd->CreateTexture(1280, 720, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &pRenderTexture, 0); pRenderTexture->GetSurfaceLevel(0,&pRenderSurface); } void Draw() { d3dd->SetFVF(FORMATEDFVF); d3dd->GetRenderTarget(0,&pBackBuffer); d3dd->SetRenderTarget(0,pRenderSurface); //clear texture d3dd->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,0,0),1.0f,0); d3dd->BeginScene(); FORMATEDVERTEX vertices[3] = {FORMATEDVERTEX(100, 100, D3DCOLOR_ARGB(255,0,255,0)), FORMATEDVERTEX(100,500,D3DCOLOR_ARGB(255,0,255,0)), FORMATEDVERTEX(200,00,D3DCOLOR_ARGB(255,0,255,0))}; d3dd->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 1, vertices, sizeof(FORMATEDVERTEX)); d3dd->EndScene(); d3dd->SetRenderTarget(0,pBackBuffer); //D3DXSaveTextureToFileW(L"test.png",D3DXIFF_PNG,pRenderTexture,0); d3dd->SetFVF(FORMATEDFVF); //d3dd->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE); FORMATEDVERTEX vertex[4] = {FORMATEDVERTEX(0, 0, D3DCOLOR_XRGB(0,0,0)), FORMATEDVERTEX(1280, 0, D3DCOLOR_XRGB(0,0,0)), FORMATEDVERTEX(0, 720, D3DCOLOR_XRGB(0,0,0)), FORMATEDVERTEX(1280, 720, D3DCOLOR_XRGB(0,0,0)) }; d3dd->SetTexture(0,pRenderTexture); d3dd->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP,2,vertex,sizeof(FORMATEDVERTEX)); }
Ich hab das ganze aus diesem Tutorial.
-
Wie genau schaut FORMATEDVERTEX und FORMATEDFVF aus? Ist der Cullmode richtig gesetzt? Denn dein erstes Dreieck ist wohl gegen den Uhrzeigersinn geordnet. Irgendwie vermisse ich den RHW Wert, ist der auch überall auf 1? Liegen die z-Werte auch zwischen near und far-Plane? Verwendest du einen Depthbuffer? Wenn ja, wo wird der gecleared? Oder hast du vergessen den Depth-Test abzuschalten? Warum renderst du zum Schluss ein schwarzes Viereck über alles drüber und warum vor allem tust du das nach EndScene()? Wo genau machst du dein Present()?
Btw: GetRenderTarget() erhöht den Referenzzähler der Surface, da fehlt also ein Release().
-
dot schrieb:
Btw: GetRenderTarget() erhöht den Referenzzähler der Surface, da fehlt also ein Release().
Wo genau fehlt ein Release? Beim Device, beim Surface oder wo?
Wo genau machst du dein Present()?
Ganz am Ende von der Draw Funktion, die diese hier aufruft. Bei mehr als einem Present flackert bei mir alles Pink
Ist der Cullmode richtig gesetzt? Denn dein erstes Dreieck ist wohl gegen den Uhrzeigersinn geordnet. Irgendwie vermisse ich den RHW Wert, ist der auch überall auf 1? Liegen die z-Werte auch zwischen near und far-Plane? Verwendest du einen Depthbuffer? Wenn ja, wo wird der gecleared? Oder hast du vergessen den Depth-Test abzuschalten?
Cullen habe ich erstmal zum testen ausgeschaltet, RHW und Z-Werte wurden im Konstruktor automatisch bestimmt, ist ja alles 2D, Depthtest ist aus.
Ich habe es jetzt so geändert:
const DWORD TEXTUREFVF = (D3DFVF_XYZRHW | D3DFVF_TEX1); struct TEXTUREVERTEX { float x,z,y,rhw,u,v; }; void Draw (LPDIRECT3DDEVICE9 d3dd) { d3dd->SetFVF(FORMATEDFVF); d3dd->GetRenderTarget(0,&pBackBuffer); d3dd->SetRenderTarget(0,pRenderSurface); //clear texture d3dd->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_ARGB(0,0,0,0),1.0f,0); d3dd->BeginScene(); FORMATEDVERTEX vertices[3] = {FORMATEDVERTEX(100, 100, D3DCOLOR_ARGB(255,0,255,0)), FORMATEDVERTEX(200,100,D3DCOLOR_ARGB(255,0,255,0)), FORMATEDVERTEX(100,500,D3DCOLOR_ARGB(255,0,255,0)), }; d3dd->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 1, vertices, sizeof(FORMATEDVERTEX)); d3dd->EndScene(); d3dd->SetRenderTarget(0,pBackBuffer); d3dd->SetTexture(0,pRenderTexture); //D3DXSaveTextureToFileW(L"test.png",D3DXIFF_PNG,pRenderTexture,0); d3dd->SetFVF(TEXTUREFVF); d3dd->BeginScene(); TEXTUREVERTEX vertex[4] = {0,0,0,1,0,0, 1280, 0, 0, 1, 1, 0, 0, 720, 0, 1, 0, 1, 1280, 720, 0, 1, 1, 1 }; d3dd->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP,2,vertex,sizeof(TEXTUREVERTEX)); d3dd->EndScene(); d3dd->SetTexture(0,0); }
Also auf die Textur wird jetzt endlich gerendert, überdeckt aber immer noch alles andere.
d3dd->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
steht in der Init-Funktion, und
D3DXSaveTextureToFileW(L"test.png",D3DXIFF_PNG,pRenderTexture,0);
sagt mir, dass die Textur transparent ist, und das drüberzeichnen von einem transparenten Viereck bringt auch nichts.
Btw.: Ist dieser Error beim schließen des Programmes normal?
Direct3D9: (ERROR) :Memory still allocated! Alloc count = 260
Direct3D9: (ERROR) :Current Process (pid) = 0000115c
Direct3D9: (ERROR) :Memory Address: 005007fc lAllocID=1 dwSize=00004bc4, ReturnAddr=7123d5ea (pid=0000115c)
Direct3D9: (ERROR) :Memory Address: 005053f4 lAllocID=2 dwSize=00000350, ReturnAddr=712402fa (pid=0000115c)
Direct3D9: (ERROR) :Memory Address: 0050577c lAllocID=3 dwSize=00000ef0, ReturnAddr=71246401 (pid=0000115c)
Direct3D9: (ERROR) :Memory Address: 02368484 lAllocID=5 dwSize=000183ec, ReturnAddr=7124e508 (pid=0000115c)
Direct3D9: (ERROR) :Memory Address: 023808a4 lAllocID=6 dwSize=00001b6c, ReturnAddr=7123ec04 (pid=0000115c)
Direct3D9: (ERROR) :Memory Address: 005066a4 lAllocID=7 dwSize=000004e0, ReturnAddr=7123ecd5 (pid=0000115c)
Direct3D9: (ERROR) :Memory Address: 00506bbc lAllocID=8 dwSize=00000014, ReturnAddr=7123ed27 (pid=0000115c)
Direct3D9: (ERROR) :Memory Address: 02350064 lAllocID=12 dwSize=000018e4, ReturnAddr=71233cab (pid=0000115c)
Direct3D9: (ERROR) :Memory Address: 02382444 lAllocID=13 dwSize=000004e0, ReturnAddr=71233cf1 (pid=0000115c)
Direct3D9: (ERROR) :Memory Address: 00506cc4 lAllocID=14 dwSize=00000014, ReturnAddr=71233d3e (pid=0000115c)
Direct3D9: (ERROR) :Memory Address: 00506d0c lAllocID=15 dwSize=00000044, ReturnAddr=7123d5ea (pid=0000115c)
Direct3D9: (ERROR) :Memory Address: 0235197c lAllocID=16 dwSize=00002700, ReturnAddr=71243703 (pid=0000115c)
Direct3D9: (ERROR) :Memory Address: 0238295c lAllocID=17 dwSize=00000350, ReturnAddr=712402fa (pid=0000115c)Die ganze Errormeldung ist ca. fünf mal so lang, wie die hier gepostete
-
GUIFreak schrieb:
Wo genau fehlt ein Release? Beim Device, beim Surface oder wo?
Naja, da du in jedem Frame den Backbuffer neu mit GetRenderTarget() abfrägst fehlt in jedem Frame ein entsprechendes Release()...
GUIFreak schrieb:
Bei mehr als einem Present flackert bei mir alles Pink
das ist klar.
GUIFreak schrieb:
Also auf die Textur wird jetzt endlich gerendert, überdeckt aber immer noch alles andere.
d3dd->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
steht in der Init-Funktion [...]
Da fehlen dann aber noch mindestens die Blend Faktoren (D3DRS_SRCBLEND und D3DRS_DESTBLEND).
GUIFreak schrieb:
Btw.: Ist dieser Error beim schließen des Programmes normal?
Damit zeigt dir die Runtime an dass du vergessen hast Ressourcen freizugeben...
-
dot schrieb:
Da fehlen dann aber noch mindestens die Blend Faktoren (D3DRS_SRCBLEND und D3DRS_DESTBLEND).
Danke, habe es mit
d3dd->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); d3dd->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
jetzt geschafft, sieht alles so aus, wie ich es wollte
dot schrieb:
Damit zeigt dir die Runtime an dass du vergessen hast Ressourcen freizugeben...
Da werd ich mal schaun, wo ich überall nen Release vergessen habe.
-
Eine Frage habe ich noch, es es normal, dass die Polynome auf den Texturen nicht antialiased sind, die anderen aber schon, wenn AA eingeschaltet ist?
-
In Direct3D9 ist es nicht möglich multisampled in eine Textur zu rendern.
-
Hmm, schade.
Zu dem Memory Leak beim schließen der Anwendung.
Mein Projekt ist noch recht klein, und deswegen was es simpel, alle nötigen Release() funktionen zu ergänzen, aber dennoch wird mir gesagt, dass ich 80kB nicht frei lasse. Der Debugger meldet mir immer an der Stelle in der crt0dat.cvoid __cdecl __crtExitProcess ( int status ) { __crtCorExitProcess(status); /* * Either mscoree.dll isn't loaded, * or CorExitProcess isn't exported from mscoree.dll, * or CorExitProcess returned (should never happen). * Just call ExitProcess. */ ExitProcess(status); }
ein Memory Leak.
-
Da dazu anscheinend leider niemand eine Antwort weiß habe ich noch eine Frage.
Wenn ich meine Textur über andere gezeichnete Objekte lege, verformen sich die Objekte auf meiner Textur etwas.
Hier zwei Beispiele
Das ist mein momentaner Code:const DWORD FORMATEDFVF = (D3DFVF_XYZRHW | D3DFVF_DIFFUSE); const DWORD UNFORMATEDFVF = (D3DFVF_XYZ | D3DFVF_DIFFUSE); const DWORD TEXTUREFVF = (D3DFVF_XYZRHW | D3DFVF_TEX1); struct FORMATEDVERTEX { explicit FORMATEDVERTEX(float _x = 0, float _y = 0, DWORD _color = 0) : x(_x), y(_y), z(0.0f), rhw(1.0f), color(_color) {}; float x, y, z, rhw; D3DCOLOR color; }; struct UNFORMATEDVERTEX { float x, y, z; D3DCOLOR color; }; // Dreieck auf Textur void GUI::Draw() { d3dd->SetFVF(FORMATEDFVF); d3dd->SetRenderTarget(0,renderSurface); d3dd->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_ARGB(0,0,0,0),1.0f,0); d3dd->BeginScene(); FORMATEDVERTEX vertices[3] = {FORMATEDVERTEX(100, 100, D3DCOLOR_ARGB(255,0,255,0)), FORMATEDVERTEX(200,100,D3DCOLOR_ARGB(255,0,255,0)), FORMATEDVERTEX(100,500,D3DCOLOR_ARGB(255,0,255,0)), }; d3dd->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 1, vertices, sizeof(FORMATEDVERTEX)); d3dd->EndScene(); d3dd->SetRenderTarget(0,backBuffer); d3dd->SetTexture(0,renderTexture); d3dd->SetFVF(TEXTUREFVF); d3dd->BeginScene(); TEXTUREVERTEX vertex[4] = {0,0,0,1,0,0, 1280, 0, 0, 1, 1, 0, 0, 720, 0, 1, 0, 1, 1280, 720, 0, 1, 1, 1 }; d3dd->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP,2,vertex,sizeof(TEXTUREVERTEX)); d3dd->EndScene(); d3dd->SetTexture(0,0); }; // Dreieck darunter void Draw() { d3dd->Clear(0, 0, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0); d3dd->BeginScene(); d3dd->SetFVF(UNFORMATEDFVF); d3dd->SetStreamSource(0, v_buffer, 0, sizeof(UNFORMATEDVERTEX)); d3dd->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 1); d3dd->EndScene(); ui.Draw(); }
-
Zieh mal von allen Koordinaten 0.5 ab, sonst liegt deine ganze Geometrie 0.5 Pixel "daneben".
Die Fläche des 1. Pixels geht nämlich nicht von (0, 0) bis (1, 1) sondern von (-0.5, -0.5) bis (0.5, 0.5).Was dein Memory Leak angeht: woher sollen wir denn wissen wo du ein Leak eingebaut hast? Wenn dir Visual Studio kein File+Zeilennummer dazu sagen kann, kann ich dir leider auch kein Gratis-Tool empfehlen mit dem man das findet. Bounds-Checker kann das, aber der kostet leider richtig viel $$$.
Noch ein Tip: ungebräuchliche Bezeichnungen wie "unformated" und "formated" (statt "pretransformed") brigen nichts, sondern schaden auf Dauer bloss. Gewöhne dir an die Sprache zu sprechen (und auch in deinen Programmen zu verwenden) die auch von der Community verwendet wird. Alles andere ist Quatsch.
-
hustbaer schrieb:
Zieh mal von allen Koordinaten 0.5 ab, sonst liegt deine ganze Geometrie 0.5 Pixel "daneben".
Die Fläche des 1. Pixels geht nämlich nicht von (0, 0) bis (1, 1) sondern von (-0.5, -0.5) bis (0.5, 0.5).Wieso denn das? Aber auch wenn ich überall 0.5 Pixel abziehe habe ich das gleiche Ergebnis. Aber nur, wenn ich über etwas anderes drübermale.
hustbaer schrieb:
Was dein Memory Leak angeht: woher sollen wir denn wissen wo du ein Leak eingebaut hast? Wenn dir Visual Studio kein File+Zeilennummer dazu sagen kann, kann ich dir leider auch kein Gratis-Tool empfehlen mit dem man das findet. Bounds-Checker kann das, aber der kostet leider richtig viel $$$.
Visual Studio gibt mir garkeine Infos. Aber ich werde mal gucken, ob es eine Testversion von Boundschecker gibt.
hustbaer schrieb:
Noch ein Tip: ungebräuchliche Bezeichnungen wie "unformated" und "formated" (statt "pretransformed") brigen nichts, sondern schaden auf Dauer bloss. Gewöhne dir an die Sprache zu sprechen (und auch in deinen Programmen zu verwenden) die auch von der Community verwendet wird. Alles andere ist Quatsch.
Ich hab das ganze einfach ganz dreist vom allerersten Tutorial zu Direct3D9, welches man bei google findet übernommen :p
Wieso ist dieser Fall denn nicht gebräuchlich?
-
Zum Memoryleak:
Visual Studio nennt dir eine Zahl, in welchem Block das Memory Leak auftritt.
Diese Zahl nehmen und am Programmstart folgendes einfügen:
_CrtSetBreakAlloc(DIE_ZAHL);fertig.
Nun wird Visual Studio an der Stelle aussteigen in den Debugger, wo diese Speicherstelle allokiert wird. Meistens landet man in der malloc.c oder new.cpp.
Dann einfach den Programmstack aufrufen im Debugger und schauen was der letzte Call aus dem eigenen Programm war. Dort ist dann meistens auch das Leck.Mehr hier:
http://msdn.microsoft.com/en-us/library/x98tx3cf.aspx
-
Visual Studio nennt mir leider keine Zahl, sondern die Direct3D Debug Runtime meckert. Daher funktioniert deine Methode auch nicht. Also auftretet tut das ganze ja beim schließen des Programmes, wenn alle Resourcen freigegeben werden. Alles andere steht schon in den vorherigen Posts.
-
Dazu sagte ich dir aber bereits: Nutz Pix^^
-
Oh, an den Post letzt Seite habe ich gar nicht mehr gedacht.
Nur wie genau soll ich das verwenden um ein Memory Leak zu finden? Ich hab das gnaze jetzt mal für den Resourcengebrauch durchlaufen lassen, doch mit den Ergebnissen weiß ich nichts anzufangen
-
Kopier mal bitte die Trace-Meldung die du bekommst hier rein.
Wieso denn das?
Es ist so, weil es so definiert wurde.
Und definiert wurde es vermutlich deswegen so, weil es (vermutlich) für die Grafikkarte am praktischten ist.Aber auch wenn ich überall 0.5 Pixel abziehe habe ich das gleiche Ergebnis. Aber nur, wenn ich über etwas anderes drübermale.
Glaub ich nicht.
Hast du die Koordinaten beim Rendern des Dreiecks auf die Textur UND beim Rendern der Textur auf den Backbuffer angepasst?
-
hustbaer schrieb:
Es ist so, weil es so definiert wurde.
Und definiert wurde es vermutlich deswegen so, weil es (vermutlich) für die Grafikkarte am praktischten ist.Ok, fängt der zweite Pixel denn dann bei 0.5 oder 1 an? Und gilt das nur für Texturen?
hustbaer schrieb:
Glaub ich nicht.
Hast du die Koordinaten beim Rendern des Dreiecks auf die Textur UND beim Rendern der Textur auf den Backbuffer angepasst?Die Koordinaten für die Textur habe ich jetzt auch angepasst und jetzt klappts wirklich
hustbaer schrieb:
Kopier mal bitte die Trace-Meldung die du bekommst hier rein.
Sorry für die Frage, aber welche genau meinst du?