Problem nach Umstellung auf D3D9



  • Hoi,
    bei mir werden die Texturen nach der Umstellung auf D3D9 nicht mehr richtig dargestellt.
    Link zu Screenshot
    Ganz offensichtlich funktionieren ColorKeying nicht mehr richtig und die Größe stimmt auch nicht.
    Alles was nicht gezeichnet werden soll ist im Bitmap in der Farbe Magenta dargestellt. Das ColorKeying soll diese Farbe schwarz und transparent machen, letzteres funktioniert wohl nicht mehr.
    Außerdem stimmt die Bildgröße nicht, das schwarze Feld von dem blauen Mauszeiger hat fast die doppelte Ausmaße wie der Mauszeiger selber, das ist auch nicht normal.

    Hat das etwas mit den Grafikformaten zu tun? Unter D3D8 hat das alles noch funktioniert, ich habe dergleichen nichts geändert. Ich nutze das ID3DXSprite-Interface um die Grafiken auszugeben.
    Das nutzt ja neuerdings auch einen dreidimensionalen Vektor für die Position, was gibt man da sinnvollerweise als dritte Dimension an? In der MSDN gibt es dazu leider keinerlei Beispiele.



  • Nachtrag: Ein bisschen Sourcecode

    So initialisiere ich ID3DXSprite:

    [...]
    	// Das 16Bit Format der Grafikkarte bestimmen:
    	format = D3DFMT_UNKNOWN;
    	if (SUCCEEDED(lpD3D->CheckDeviceType(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, D3DFMT_R5G6B5, D3DFMT_R5G6B5, false)))
    		format = D3DFMT_R5G6B5;
    	else if(SUCCEEDED(lpD3D->CheckDeviceType(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, D3DFMT_X1R5G5B5, D3DFMT_X1R5G5B5, false)))
    		format = D3DFMT_X1R5G5B5;
    
    	// Kein passendes Format gefunden:
    	if (format == D3DFMT_UNKNOWN)
    	{
    		MessageBox(NULL, _T("16 Bit Grafikformat nicht unterstützt"), _T("Graphics::initD3D()"), 0);
    		return false;
    	}
    [...]
    	// Spriteobjekt erzeugen:
    	if (FAILED(D3DXCreateSprite(lpDevice, &lpSprite)))
    	{
    		MessageBox(NULL, _T("D3DXCreateSprite() fehlgeschlagen"), _T("Graphics::initD3D()"), 0);
    		return false;
    	}
    	lpSprite->OnResetDevice();
    

    So lade ich Texturen:

    // Mauszeiger:
    	if (FAILED(D3DXCreateTextureFromFileEx(lpDevice, _T("Grafik/Cursor/Cursor.bmp"),
    D3DX_DEFAULT, D3DX_DEFAULT, 1, 0, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, D3DX_FILTER_NONE, D3DX_FILTER_NONE,
    0xFFFF00FF, NULL, NULL, &cursorTexture)))
    		return false;
    

    So wird gerendert:

    // Mauscursor zeichnen:
    	lpSprite->Draw(cursorTexture, NULL, NULL, &D3DXVECTOR3((float)Interface::mousePos.x, (float)Interface::mousePos.y, 0.0f),
    0xA0FFFFFF);
    

    Am wenigsten sicher bin ich mir, was die Formate anbelangt (einmal 15/16 Bit, einmal 32 Bit?).
    Ich hab das so in etwa damals aus einem Tutorial für D3D8 und es hat unter D3D8 auch noch funktioniert.

    Danke, falls jemand antwortet. 🙂



  • Letztens war hier im Board irgendwer, der hat genau diese Methode für 2-D Grafik empfohlen. Wäre angeblich ganz einfach und schlägt DDraw um Längen. Der muss davon echt Ahnung gehabt haben, such doch mal seine Posts und maile ihm!

    Ich als alter DDrawler kann dir höchstens den Tipp geben Texturen mit einem Alphakanal zu benutzen und dann auch in den Renderstates die Alpha zu aktivieren.

    Bye, TGGC (Der Held ist zurück)



  • Hallöchen, es ist auch ganz einfach. Das Ganze hat so mit D3D8 auch funktioniert. Jetzt sind halt ein paar Änderungen nötig, weil das Sprite-Interface weiterentwickelt wurde. Dass DDraw gleich bleibt, würde ich nicht als Vorteil ansehen. 🙄

    Die Texturen haben einen Alpha-Kanal, das macht der viertletzte D3DCOLOR-Parameter von D3DXCreateTextureFromFileEx().
    Hast du ne Idee, warum die Größe des schwarzen Bereichs nicht mit der Bitmapgröße übereinstimmt?

    EDIT: das weiss ich jetzt, weil die Textur in eine 2er-Potenz Größe gelegt wird.



  • Mit den Renderstates hast du mich jetzt indirekt auf den richtigen Weg gebracht, jetzt muss ich also auch noch Danke sagen. 😉

    Der Trick ist dieser Funktionsaufruf:

    lpSprite->Begin(D3DXSPRITE_ALPHABLEND);
    

    Der in D3D8 noch ohne Parameter ausgekommen ist.



  • Siehst du, ist doch ganz einfach!

    Bye, TGGC (Der Held ist zurück)



  • Ich habe nie etwas anderes behauptet.
    Und das ID3DXFont Interface ist jetzt mega-optimized *sabber*
    Der Umstieg hat sich gelohnt.



  • Optimizer schrieb:

    Und das ID3DXFont Interface ist jetzt mega-optimized *sabber*

    Was bedeutet das? Werden jetzt keine Windows-Grafikfunktionen mehr benutzt oder was?

    PS: Mach mal schön weiter an Deinem Spiel, ich hatte mal ne Demo davon und fand sie echt gut. Hab sogar gewonnen 😋



  • Ich habe auch nicht behauptet, das du sowas behauptet hättest. Aber was tut das jetzt noch zur Sache? Sei doch froh, das wir dein Probelm gelöst haben!

    Bye, TGGC (Der Held ist zurück)



  • 0x00000001 schrieb:

    Was bedeutet das? Werden jetzt keine Windows-Grafikfunktionen mehr benutzt oder was?

    PS: Mach mal schön weiter an Deinem Spiel, ich hatte mal ne Demo davon und fand sie echt gut. Hab sogar gewonnen 😋

    Die Characters werden jetzt auf Texturen einmalig mit der GDI gezeichnet. Es scheint sogar schneller zu sein wie die Klasse CD3DFont. Und das mit den ganzen genialen Möglichkeiten dieses Interfaces.
    Wenn die Schriftart es unterstützt, kann ich jetzt bei Benutzung von Unicode sogar klingonische Texte ausgeben. 😃



  • Optimizer schrieb:

    Wenn die Schriftart es unterstützt, kann ich jetzt bei Benutzung von Unicode sogar klingonische Texte ausgeben. 😃

    Auf DAS Feature warte ich seit Jahren...!!! 😃 😋 😃 👍



  • Hi Opti !

    Ist das ID3DXSprite Interface auch besser geworden ? Wieviele Sprites kannst du auf dem Screen rendern ? Ich konnte früher 10.000 bei 3/4 Frames rendern.



  • Es ist angeblich auch verbessert worden, aber die Draw-Methode hat jetzt weniger Möglichkeiten. Vielleicht muss man Rotation jetzt anders machen, das muss ich noch rausfinden.
    Also ich hab dort noch keine Verbesserung festgestellt, aber allein wegen dem Font-Interface lohnt sich die Umstellung IMO.



  • Das Font Interface nutzt ich so wieso 😉

    Ich wollte nur wissen ob es besser wäre ID3DXSprite zunehmen oder sich selbst so ein System mit VBs und RHW Verticies aufzubauen ?



  • furbolg schrieb:

    Das Font Interface nutzt ich so wieso 😉

    Dann würde ich sofort auf D3D9 umsteigen, weil das bei mir beträchtlich schneller läuft jetzt.
    Falls du meinst, eine eigene Sprite-Klasse zu schreiben, das musst du selber entscheiden, ob du meinst, dass du es besser kannst. Ich kann es nicht und bin zufrieden.



  • @ Opti:

    Ich nutze schon seit letzes Jahr Sommer (oder wann kam es raus ?) Dx9 😉



  • Dann verstehe ich nicht, warum du frägst, ob das Sprite-Interface verbessert wurde. 😉



  • Weil ich es nie benutzt habe 😃


Anmelden zum Antworten