DIRECT3DTEXTURE8-Objekte



  • Hi,
    ich beschäftige mich zur Zeit mit DirectX-Graphics, wobei ich mich erst mal nur auf 2D-Grafik beschränke. Nun habe ich ein paar Fragen zu DIRECT3DTEXTURE8-Objekten:

    1. Wie kopiere ich den Inhalt einer Textur oder einen bzw. mehrere Ausschnitt(e) (RECT) einer Textur in eine andere? So ähnlich wie "CopyRects(..)" für Surfaces, nur möchte ich auch von Effekten wie Skalierung, Rotation und Alpha-Blending Gebrauch machen; deswegen Texturen.

    2. Wie bestimme ich für eine Textur nachträglich einen ColorKey (oder auch andere Einstellungen, wie Größe, Farbformat, Speicherort)?

    3. Müssen meine Texturen, die ich ja nur für 2D-Grafik benutze, immer 2er-Potenzen als Maße haben und quadratisch sein? Für z.B. eine Liniengrafik mit der Größe 100 × 4 eine Bitmap mit 128 × 128 zu erstellen wäre doch Speicherverschwendung, oder?

    Vielen Dank für eure Hilfe!



  • zu 1: CopyRects gibt es immer noch, Du musst nur erstmal die Surfaces der Texturen bekommen. Das geht mit IDirect3DTexture8::GetSurfaceLevel().

    zu 2: Ich würde sie neu laden, bei D3DXLoadTextureFromFileEx kann man das alles einstellen.

    zu 3: Sie müssen nicht quadratisch sein, ich benutze auch andere und es funktioniert. Ich habe aber mal gelesen dass die Höhe und Breite zumindest eine gerade Zahl sein sollte.



  • zu3) Die Texturgröße *sollte* quadratisch sein, und *muss* eine 2er Potenz sein. Wenn deine Texturgröße keine 2er Potenz ist, wird sie von deiner Graka skaliert, und das willst du nicht wirklich, oder ?



  • @Headhunter: Machen das alle Grafikkarten/Chips?

    Und wenn es die Hardware selbst macht, wann macht sie es? Vor jedem Rendern?

    .
    .
    .
    .
    OK hat sich erledigt, ich habe es grade getestet. Anscheinend macht DirectX die Skalierung, weil meine 474x374 Textur im Programm 512x512 groß ist wenn ich es mit GetLevelDesc() teste 😮



  • Danke für eure Hilfe!

    Doch noch was zu zweitens: Angenommen meine Textur besteht nicht aus einem Bitmap, die ich neu laden kann, sondern aus Grafik-Daten, die ich selbst in die Textur geschrieben habe, wie zum Beispiel irgendwelche Linien oder Teile von anderen Grafiken. Gibt es da wirklich keine Möglichkeit ColorKey (u.ä.) beliebig zu definieren und zu entfernen?



  • Doch, du kannst ja einfach die Surface locken und eben in den Alpha-Kanal reinmalen. zB Wenn alles was Rot ist durchsichtig werden soll:

    DWORD pixel; // ein 32Bit Pixel
    
    if( (pixel & 0x00ffffff) == 0xff0000 ) // wenn er rot ist...
         pixel &= 0x00ffffff;              // ... löscht man den Alphakanal.
    

    Sonst weiß ich auch nicht... 😞



  • Hmm, interessant. Ich habe was von einer Methode

    SetPrivateData(...)
    

    (oder so) gelesen. Kann man mit der vielleicht (private) Daten, wie ColorKey u.ä. ändern?


Anmelden zum Antworten