2009-03-17 13 views
2

Ich fange an, d3d10-Unterstützung hinzuzufügen, um mit meinem vorhandenen d3d9 Grafik-Backend zu gehen.Direct3D10: Kein 32-Bit-ARGB-Format?

Das Problem ist der gesamte vorhandene Code (in verschiedenen Anwendungen ...) verwendet ARGB formatierte Farben, aber ich konnte keinen Formatmodus finden, der für d3d10 passt. Unterstützt d3d10 überhaupt keine ARGB-Farbformate oder habe ich gerade etwas verpasst? Wenn ich etwas verpasst habe, was eine gute Möglichkeit ist, zwischen ihnen zu konvertieren, muss nur das erste Byte bis zum Ende bewegt werden, das scheint ein ziemlich einfaches Konzept zu sein, aber ich kann sowieso nichts anderes tun, als die Farbe in seine Komponenten zu zerlegen und Rekonstruieren ... zB:

//unsigned colIn, colOut 
unsigned char 
    a = (colIn & 0xFF000000) >> 24, 
    r = (colIn & 0x00FF0000) >> 16, 
    g = (colIn & 0x0000FF00) >> 8, 
    b = (colIn & 0x000000FF); 
colOut = (r << 24) | (g << 16) | (b << 8) | a; 

Antwort

1

Mit Blick auf die relevanten enum type, I (auch) nicht alle AxRxGxBx Formate zu finden. So scheint es, dass du das Swizzling dann selbst machen musst.

Dies ist sehr geeignet für SSE optimization natürlich, überprüfen Sie, ob Ihr Compiler in der Lage ist, den Code in etwas zu optimieren, das SSE verwendet und Leistung sollte in Ordnung sein.

Denken Sie an Endianness-Probleme, wenn Sie diesen Code machen, es ist einfach, einen Fehler zu machen, und dieser Code ist schwer zu schreiben, ohne sich um Endianness zu kümmern.

+0

Nun, ich habe nur Zielfenster für das d3d-Grafik-Backend, also kann ich von einem kleinen Endian ausgehen, oder? –

+0

Ja, ich denke du kannst das, obwohl ich implizite Endian-Annahmen für das halte, was sie hier einen "Code-Geruch" nennen. Stellen Sie sicher, dass Sie diese Teile des Codes natürlich dokumentieren/kommentieren. – unwind

+0

Sie werden keine Endian-Probleme haben, solange die Daten nicht über Plattformen laufen. – MSN

2

Es sieht für mich so aus, dass das Format verschwunden ist, also müssten Sie Ihre Daten neu bestellen. Wenn Sie jedoch RGBA verwenden möchten, müssen Sie nicht alle Farben trennen, wie in Ihrem Beispiel, da R, G, & B immer noch in der gleichen Reihenfolge hintereinander angeordnet sind. Sie können diese drei Kanäle als einen Block verschieben.

Verwandte Themen