GUI Design gut?
-
Hab noch eine Frage.
Wenn ich die Textur erstelle ist sie imemr komplett schwrz und übermalt alles. WIe bekomme ich sie transparent?
-
Indem du entsprechende Werte in den Alphakanal schreibst und beim Rendern entsprechendes Blending verwendest?^^
-
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.
-
Vielleicht solltest du nicht Alpha-Blending einschalten, und dann D3DCOLOR_XRGB() für die Vertex-Farbe verwenden.
-
Das Alphablending kam noch von dem Versuch, die Textur transparent zu bekommen, hat aber nichts zur Sache getan. Da gleiche gilt auch für
D3DCOLOR_ARGB()
,
wobei das mit einem Alphawert von 255/0xff ja exakt das Selbe wieD3DCOLOR_XRGB()
ist.
-
Was sagt die D3D-Debug-Runtime? (aktivieren & Trace-Level hochdrehen)
-
Im Debugger sieht alles so aus, wie es sein sollte. Ich finde aber das RanderTarget nicht...
Und wonach soll ich denn sonst noch gucken?
-
Ich bekomms immer noch nicht hin auf eine Textur zu rendern...
Hat irgendjemand ein funktionierendes Beispiel?
-
-
Genau nach dem ersten Link habe ich mich ja gerichtet, nur funkioniert da etwas nicht, und ich habe auch keine Ahnung was, der Debugger hilft da auch nicht weiter.
2. Link bei google ist C#
3. Link ist auch was anderes
4. Link ist irgendwas von NVIDIA
5. Link ist nur eine kurte Forenfrage
6. Link ist DirectX 10
7. Link gleicht ziemlich dem ersten
8. Link ist was anderes zu Texturen
9. Link ist auch was anderes zu Texturen
10. Link ist nur ein kurzer ForenbeitragSoweit dazu.
-
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.