Linie auf Sprite?



  • gibt es da eine Möglichkeit ?
    Ich habe mit LPD3DXLINE rumprobiert, aber auf einem Sprite kann man damit nicht zeichnen.

    Danke danke



  • Guk ma in der doku unter "SetRenderTarget", der methode übergibste deine sprite-textur, und malst druf was du möchtest...

    ähm, wie das jedoch mit den ganzen "LPD3DXLINE"-teilen genau geht, weis ich auch nich..🙄



  • wobei es vermutlich schneller ist, einfach erst das sprite und dann die linie drüber zu rendern...

    was genau willst du damit erreichen?



  • wobei es vermutlich schneller ist, einfach erst das sprite und dann die linie drüber zu rendern

    Das hängt echt davon ab, wie sich die linie zum sprite verhalten soll (ob die linie zB zusammen mit dem sprite beleuchtet werden soll) und wie oft die linie neugezeichnet werden muss (einmal im ganzen programm? einmal pro frame?)
    was willst du denn da genau habn -personenkult-?



  • Hi, ich habe ein Sprite welches recht groß ist und auch über den Bildschirm verschoben wird. Ich möchte mit diesen Linien nur zu Testzwecken Bereiche sichtbar machen. Damit diese auch bei der Verschiebung mitverschoben werden, will ich sie direkt auf das Sprite zeichnen. Ich werds mal testen und meld mich dann wieder, vielen Dank schonmal 🙂



  • 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* casten

    Ich 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.


Anmelden zum Antworten