Paar Fragen zu D3D(X)



  • Nabend..
    Ich hab gleich mehrere Fragen zu D3D, und D3DX..
    Und zwar benutze ich D3DXSprite um 2d Grafiken in DX9 darzustellen.

    1. Gibts ne Möglichkeit um direkt an die Pixeldaten einer Textur ranzukommen?
    Bzw. sie auch zu verändern? Z.B. wenn man eigene Grafikformate laden will?
    Ich denke da an GetSurfaceLevel, und dann halt wieder bei der Surface->Lock bzw. Unlock. Oder gibts andere/bessere Möglichkeiten?

    2. Der ominöse Alphawert bei den Farbwerten mit Alpha...also z.B. bei D3DCOLOR_ARGB in Verbindung mit D3dDevice->ColorFill. Wenn ich Colorfill eine Farbe mit Alphawert übergeb wird dieser überhaupt nicht beachtet, auch nicht wenn ich über die RenderStates Alphablending einschalte. Ist das normal das diese Methode einfach kein Alphablending kann bzw. die Alphawerte nicht beachtet, oder mach ich da einen Fehler?

    3. Gibts ne Möglichkeit den Colorkey nach dem laden der Textur zu verändern? Bzw. was passiert überhaupt beim laden wenn ich Colorkey benutze (D3DXCreateTextureFromFileEx)? Wird irgendein Renderstate geändert, oder wird das Format der Textur in ein Format mit Alpha konvertiert, und dann einfach die Alphawerte bei diesen Pixeln gesetzt?

    4. Gibts ne Möglichkeit um von einer Textur direkt auf eine andere zu Rendern?
    Oder muss man das wieder auf Surfacelevel machen? Bzw. gehts überhaupt noch auf Surfacelevel (also mit so ner Art Blit, wie bei DDraw), oder muss ich dazu wieder locken?

    so, ich hoffe mal auf ein paar Antworten, und schonmal danke für dieselben.



  • Und zwar benutze ich D3DXSprite um 2d Grafiken in DX9 darzustellen.

    klick mich!

    der artikel is allerdings nicht mehr ganz up to date, ka ahnung ob das schon gefixed wurde.

    zu 1.

    Oder gibts andere/bessere Möglichkeiten?

    IDirect3DTexture9::LockRect()

    zu 3.

    Bzw. was passiert überhaupt beim laden wenn ich Colorkey benutze (D3DXCreateTextureFromFileEx)?

    Die Pixel mit der farbe des ColorKey werden einfach auf transparentes schwarz gesetzt ( 0x00000000, schwarz mit alpha wert 0 )

    zu 4. die frage check ich nicht ganz, evtl. is IDirect3DDevice9::SetRenderTarget() das was du suchst



  • Ah 😉 ne Antwort...

    danke für den Tip, aber den Artikel kenn ich schon.

    Die Pixel mit der farbe des ColorKey werden einfach auf transparentes schwarz gesetzt ( 0x00000000, schwarz mit alpha wert 0 )

    ja, klar, aber wenn ich z.B. ne BMP lad hat die ja (wenns ne 24bit is) D3D_FMT_R8G8B8 also wird das dann in D3D_FMT_A8R8G8B8 konvertiert?
    weil sonst gibts ja kein Alphawert. Oder versteh ich da was nicht?

    bzw. was ist wenn der BackBuffer kein Alpha hat, z.B. beim 16bit D3D_FMT_R5G6B5?
    oder konvertiert DirectX da intern so um das es dann doch Alpha gibt? Wenn ja, wozu braucht man dann noch die Formate mit Alphawert? Das sind so Dinge die versteh ich einfach nicht...jedenfalls nicht wenn ich mir die SDK-Hilfe anseh.



  • ja, klar, aber wenn ich z.B. ne BMP lad hat die ja (wenns ne 24bit is) D3D_FMT_R8G8B8 also wird das dann in D3D_FMT_A8R8G8B8 konvertiert?
    weil sonst gibts ja kein Alphawert. Oder versteh ich da was nicht?

    gute frage, ausprobiern...

    ich schätz mal es wird konvertiert

    abgesehen davon dass ich praktisch kein 2d mach, verwend ich eigentlich das *.tga format für alle texturen... und das kann alpha werte speichern

    bzw. was ist wenn der BackBuffer kein Alpha hat, z.B. beim 16bit D3D_FMT_R5G6B5?
    oder konvertiert DirectX da intern so um das es dann doch Alpha gibt? Wenn ja, wozu braucht man dann noch die Formate mit Alphawert? Das sind so Dinge die versteh ich einfach nicht...jedenfalls nicht wenn ich mir die SDK-Hilfe anseh.

    der backbuffer hat normalerweise keinen alpha wert ( das unterstützen nur neuere grakas, meine z.b. nicht <- Gainward GeForce 4 MX 440 ).
    wenn du davon ausgehst, dass der alpha wert angibt wie stark der pixel der texture mit dem im backbuffer befindlichen ( also bereits gerenderten ) pixel kombiniert wird, dann is der alpha wert vom backbuffer 1 - alpha von der texture.

    schau dir mal die Renderstates D3DRS_ALPHABLENDENABLE, D3DRS_DESTBLEND und D3DRS_SRCBLEND an.

    das is im prinzip alles was du für alphablending brauchst.


Anmelden zum Antworten