Linie auf Sprite?
-
Hi again,
ich habe das nun mal ausprobiert, komme aber nicht wirklich auf ein Ergebnis. Das Problem ist (für mich) das am LPD3DXLINE Objekt keine Methode SetRenderTarget ist. Also der Ablauf ist wie folgt:Erstellen
D3DXCreateLine(device, &line);..
Linien basteln
for(int i=0; i<linecount; i++) { lines[i] = D3DXVECTOR2(points[i].getX(), points[i].getY()); }..
Linien zeichnen
line->Begin(); line->Draw(lines, linecount, 0xFFFFFFFF); line->End();Soweit sogut.. ich habe nun aber ein Sprite auf dem ich diese Linien haben möchte. Und da finde ich nicht wirklich etwas was mir weiterhilft.
Wie zeichnet ich für gewöhnlich stinknormale Linien? LPD3DXLINE ist doch sicherlich nichts anderes als ein Wrapper, oder?
-
personenkult schrieb:
Das Problem ist (für mich) das am LPD3DXLINE Objekt keine Methode SetRenderTarget ist.
Einfach das Render-Target selber setzen, vor dem Zeichnen der Linien.
personenkult schrieb:
Wie zeichnet ich für gewöhnlich stinknormale Linien? LPD3DXLINE ist doch sicherlich nichts anderes als ein Wrapper, oder?
ID3DXLine ist kein Wrapper. Es ist viel flexibler als "stinknormale Linien".
Doku: "The ID3DXLine interface implements line drawing using textured triangles"Stinknormale Linien zeichnest du mit D3DPT_LINELIST oder D3DPT_LINESTRIP.
-
Hi,
sowas in der Art?LPDIRECT3DSURFACE9 oldRenderTarget=0; device->GetRenderTarget(0, &oldRenderTarget); device->SetRenderTarget(0, (LPDIRECT3DSURFACE9)sprite); line->Begin(); line->Draw(lines, linecount, 0xFFFFFFFF); line->End(); device->SetRenderTarget(0, oldRenderTarget);Bisher sehe ich keine Linien, aber wenn das der übliche Weg ist bin ich erstmal froh und weiß wo ich ansetzen muss

-
So ungefähr.
Aber was ist "sprite" bei dir überhaupt? ID3DXSprite*? Wenn ja, dann ist der Cast natürlich tödlich. ID3DXSprite besitzt auch gar keine Surface, wo drauf gerendert wird.Und die Surface, die du als Render-Target einsetzt, muss auch als Render-Target erstellt worden sein, sonst geht das nicht. Schau dir die Debug-Ausgabe an (DirectX Control Panel => D3D auf Debug stellen).
-
(LPDIRECT3DSURFACE9)sprite
Du darfst doch nicht einfach ein ID3DXSprite* zu einem ID3DSurface9* castenIch wusste das du das bemängeln wirst

Außerdem gibt es noch ein generelles Problem. Du gehst davon aus, dass ID3DXSprite irgendeine Surface hat, wo drauf gerendert wird. Das ist aber nicht der Fall. Man kann also überhaupt nicht "auf ein ID3DXSprite rendern".
Damit hast du natürlich recht. Das war nur der erste Gedanke wie ich meine garstigen Linien auf ein Sprite bzw. auf die Textur bekomme. Also das ich das RenderTarget setzen muss ist mir klar, wie ich genau mit dem Sprite umzugehen habe ist mir noch nicht klar. Irgendwie hilft mir die Doku da auch nicht viel weiter. Naja ich werde mal weiter in den Tiefen des Internets stöbern..
EDIT: du hast geschummelt und dein Beitrag editiert..
ich lese es mir nochmal durch. Moment..
-
Ja LPD3DXSPRITE. Also habe ich quasi alles falsch gemacht .. wie erfreulich

Gibt es eine Möglichkeit diese lustigen Linien auf "ein LPD3DXSPRITE" zu bekommen? Ich orientier mich an der D3DX Reference..
-
ID3DXSprite ist wie ID3DXLine nur ein "Helfer", der dir Sprites bzw. Linien malt.
Aber irgendwo wirst du ja dein eigentliches Sprite, also das Bild, als Textur haben. Du musst diese Textur nun einfach (beim Laden) mit D3DUSAGE_RENDERTARGET erstellen. Dann kannst du dir die Level-0-Surface dieser Textur holen (IDirect3DTexture9::GetSurfaceLevel) und die als Render-Target benutzen, um dann dort deine Linien draufzumalen.
Alternativ könntest du die Textur/Surface manuell sperren (LockRect, UnlockRect) und die Linien per Hand draufmalen, indem du die einzelnen Pixel setzt.
-
Das klingt alles sehr gut. Ich werde es heute Abend direkt ausprobieren und meinen (hoffentlich) Erfolg hier posten. Danke schonmal für deine Hilfe!
-
Hello again,
funktioniert wunderbar! Ist es sinnvoll nicht jede Texture mit dem Flag D3DUSAGE_RENDERTARGET zu laden? In der Doku steht, dass dies auch von der Grafikkarte unterstützt werden muss. Gilt es noch weitere Punkte zu beachten? Wie z.B. langsamer, Speicherverbrauch .. usw.?
-
Schön, dass es klappt. Ich würde es nur da machen, wo es auch gebraucht wird. Ich weiß nicht, wie das mit dem Speicher aussieht, aber so kannst du jedenfalls nichts falsch machen.