XOR mit D3D
-
Hi.
Hat einer von euch ne Idee wie ich ein XOR mit D3D halbwegs schnell hin bekomme?
Die hardcore variante die mir einfällt ist: ich kopiere den Inhalt des render tagerts in ein anderes surface und gebe das zusammen mit der zu blittenden textur an den PS. Dort mach ich dann ein XOR von render tagert kopie und zu blittende textur und schreibe es ins render target.
Was mir überhaput nicht gefällt ist diese kopie am Anfang... gibt das nicht irgendwo nen verstekcken render/raster state oder so was zum XORen? Suche nach so was wie dem Logical op step nach dem dithering in openGL, nur finde ich nichts ähnliches in DX
-
nein, sowas gibt es nicht.
wenn du uns verraetst was du vorhast, finden wir vielleicht ne ander/bessere loesung

-
Genau das was ich geschrieben haben.

Baue gerade ein ui framework (schon existierend) in D3D nach weil mir dieses alhpa-belding/scaling/filtering/.... auf der CPU tierisch auf den sack geht (die GPU hat das viel besser und vor allem x mal schneller drauf).
Nun gibt es aber leider eine Grapihcs::SetXOR methode in dem Ding die nun wohl oder übel auch nachbauen muss...
-
xor-verknuepfungen zwischen zwei pixeln machen doch eigentlich nur sinn, wenn die resultierenden farbe am ende mit einer palette interpretiert wird.
gezieltes ein-/ausschalten bestimmter bitplanes ist ja eigentlich ein ueberbleibsel aus amiga-zeiten...
aber falls jemand einen tatsaechlich sinnvollen einsatzzweck dafuer weiss, wuerde mich mal interessieren wie der aussieht
-
Interessante Effekte können erzielt werden, wenn man mit setXORMode(Color) den Zeichenmodus ändert. Ist die Hintergrundfarbe gleich der Vordergrundfarbe, wird das Zeichenelement in der Farbe gezeichnet, die setXORMode() als Parameter übergeben wurde. Bei den anderen Farben findet ein Farbwechsel statt, die angezeigte Farbe ist allerdings nicht vorhersehbar.
Ein Zeichenelement, das im XOR-Modus gemalt wird, ist also immer zu sehen: Ein »Untertauchen« eines Zeichenobjekts, weil Vorder- und Hintergrundfarbe gleich gewählt wurden, ist nicht möglich. Auf diese Weise könnte man z. B. bei einem Bildbearbeitungsprogramm die Auswahl eines Bildausschnitts realisieren. Das Rechteck, das den ausgewählten Ausschnitt eingrenzt, ist immer unabhängig von den Farben des Bildes zu sehen.
Benutzt man nun ein Bild statt des einheitlichen Hintergrundes und zeichnet die Schrift im XOR-Modus, erhält man eine Laufschrift, die ständig ihre Farbe wechselt. Bevor das Bild gezeichnet wird, sollte der Zeichenmodus aber wieder mit setPaintMode() in seinen Anfangszustand zurückversetzt werden:
public void paint(Graphics g) {
g.setPaintMode();
g.drawImage(bgImage, 0, 0,
size().width, size().height, this);
g.setXORMode(Color.red);
g.drawString(text, x, y);
}Und bevor jetzt einer "wtf!?!?" schreit, ja es die AWT aus java die gerade aufmotze

(ob wirklich jemand in der realen welt diesen XOR mode verwendet weiß ich nicht, aber ist halt da...)
-
xor hat man frueher verwendet um schnell alphatest zu emulieren, ist heute also kaum mehr von nutzen. das wirst du auf der graka auch kaum emulieren koennen, da du nicht den framebuffer als textur nutzen und gleichzeit reinschreiben kannst.
(btw. die psp hat XOR... und alle anderen binaer verknuepfungen auf der gpu
)
-
Denke irgendwo versteckt findet man das sicher auch noch auf den heuten GPUs, oder mach openGL das in 'software'.
Ich mach mir jetzt ner kopie vom 'dirty rect' im backbuffer, die dann zsuammen mit dem XOR wert durch den PS gejagt wird, der das ganze dann XOR't.
Hab mir das einfacher vorgestellt als es war... ist gar nicht einfach ein binäres XOR mit floats zum machen und das auf max. 64 solts
. Mach es jetzt halt über 3 passes, jeweils für einen R, G und B
Ist aber immer noch dautlich besser als ein GetRenderTargetData und dann wieder den ganzen weg zurück.
-
CMatt schrieb:
Denke irgendwo versteckt findet man das sicher auch noch auf den heuten GPUs, oder mach openGL das in 'software'.
da die hardware nur floats kann, wird oGL das zwangsweise in software machen. (blenden wird wohl zum teil mit int's gemacht, aber da gibt es meines wissens nach selbst bei OGL keine moeglichkeit XOR auszuwaehlen.
die hardware der naechsten generation wird dann aber wieder int koennen

Hab mir das einfacher vorgestellt als es war... ist gar nicht einfach ein binäres XOR mit floats zum machen und das auf max. 64 solts
. Mach es jetzt halt über 3 passes, jeweils für einen R, G und Bstell ich mir auch nicht sehr spassig vor, da es von hardware zu hardware anders laufen kann

-
Logical pixel operations are not applied to RGBA color buffers
und meines wissens nach in direct3d9 nicht existent.
mein vorschlag waere eine 2d-lookup-textur die aus jeweils zwei farb-komponenten das entsprechende xor liefert.
-
rapso schrieb:
stell ich mir auch nicht sehr spassig vor, da es von hardware zu hardware anders laufen kann

Ne echte binäre operation geht natürlich auf keinen fall. Ich 'zerbrösle' das float in an den einzelen bit-werten aus der int darstellung.
So dann ungefähr so aus:// Current XOR argument color component, splitte up in bits, where left bit is // most significant bit. float xorColorBits[8] = {0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0}; // XOR argument color, bits inverted. float xorColorBits_inv[8] = {0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0}; float4 FillTextureNoFilterXOR_passA_PS(v2p_TextureFill In) : COLOR { float4 ft = tex2D(TextureSamplerNoFilter,In.Texcoord); float f1 = ft[0]; float res = 0.0; /// 128-wertiges bit if(f1>=0.5) { f1 -= 0.5019607; res += 0.5019607*xorColorBits_inv[0]; } else { res += 0.5019607*xorColorBits[0]; } /// 64-wertiges bit if(f1>=0.2490196) { f1 -= 0.2509803; res += 0.2509803*xorColorBits_inv[1]; } else { res += 0.5019607*xorColorBits[1]; } /// 32-wertiges bit if(f1>=0.1235294) { f1 -= 0.1254901; res += 0.1254901*xorColorBits_inv[2]; } else { res += 0.5019607*xorColorBits[2]; } .... }Komme gerade so mit 64 slots hin...

Wenn jemand ne besser idee hat, die weniger slots braucht/schnelle ist, nur her damit
-
Vergesst das wieder.. die idee mit dem lookup hellihjb viel besser

So passen alle farbkanäle in einen pass und das auch noch bei texture XOR texture nicht nur bei texture XOR wertDanke!!
