GUI Design gut?
-
Nope, bin noch ein ziemlicher Anfängerm hab gedacht nen GUI wäre simpler
Hast du da gute Tutorials? Bei google findet man nur render to texture
-
Render Texturen sind ja Texturen auf die man rendern kann (-> render to texture)
Sind also schon die richtigen Artikel die du da findest.Render Texturen sind Texturen die man einerseits als sog. "Render-Target" verwenden kann (also wo man andere Dinge mit dem 3D-Device "draufmalen" kann, also als "Ziel" verwenden kann), und die man andrerseits als Textur verwenden kann (also als "Quelle" verwenden kann).
D.h. du erzeugst eine grosse Render-Textur. Da malst du dann deine vielen kleinen Dinge rein. Und so lange sich an den vielen kleinen Dingen nix ändert, kannst du einfach diese Textur mit einem einzigen Quad irgendwo anders draufmalen (also auf den Backbuffer oder auf ne andere Render-Textur), ohne die vielen kleinen Render-Calls zu wiederholen.
ps: du kannst natürlich auch ohne Render-Texturen was ähnliches haben, und zwar mit D3DSWAPEFFECT_COPY. Wenn du dein Device damit initialisierst, dann wird der Back-Buffer beim Presen() nicht gelöscht, sondern es bleibt das drinnen was vorher drinnen war. Nach dem Present() kannst du dann auch nur Teile übermalen wenn nicht alles neu gezeichnet werden soll, und wieder Present() aufrufen etc. Ist IMO aber komplizierter handzuhaben. Und D3DSWAPEFFECT verschlechtert im Fullscreen Mode die Performance.
-
Danke, das klingt ja schonmal ziemlich gut. Da werd ch google mal mit quälen
-
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...