Sprite3d Blending mode

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
hagu
Beiträge: 8
Registriert: 30.09.2004 13:09

Sprite3d Blending mode

Beitrag von hagu »

Hallo

Ich suche schon lange nach einer Möglichkeit zwei Bilder(oder sprites) im XOR Modus übereinander zu blenden.

Das heisst, ich habe ein Bild, darüber möchte ich ein anderes Bild so legen, dass die Unterschiede der beiden Sprites sichtbar werden.
Wenn also ein Pixel genau den gleichen Farbwert hat wie auf dem hinteren Bild, sollte das Pixel schwarz sein, andernfalls sollte das Pixel grau sein (je nach differenz der beiden Bilder)
Oder anders gesagt ein logisches XOR zwischen den beiden Bilder.

Wenn ich in einem Grafikprogramm z.B. Photo-Paint ein Bild über das andere lege, und als Überblendung XOR einstelle, klappt dies wunderbar.
Ich habe schon alle Werte in Sprite3DBlendingMode() ausprobiert, doch damit scheint es nicht möglich zu sein.

Wichtig ist mir dabei, dass diese Überblendung saumässig schnell ist, deshalb möchte ich wenn möglich die Power der Grafikkarte ausnützen. Wenn ich also jedes Pixel einzel auslese und vergleiche wirds viel zu langsam.

Hat da jemand einen Lösungsvorschlag?
Ich bin schon fast am verzweifeln.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

hm....
mal so ins blaue:
probiers mal mit DrawImage...
den DrawingMode kannst du auf XOR stellen...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Kekskiller
Beiträge: 752
Registriert: 14.09.2004 21:39
Kontaktdaten:

Beitrag von Kekskiller »

Die Blending Modes kannst dabei vollkommen vergessen, es gibt meines Wissens keine Möglichkeit das mit Blending Modes zu machen, wahrscheinlich da solche Berechnungen anscheinend zu hoch für D3D sind :mrgreen: .

Eine kleine Liste aller Blending Modes:
http://www.math.uni-leipzig.de/pool/tut ... blend.html

Die Erklärung ist leicht zu verstehen, die Werte in runden Klammern mit Kommas getrennt stellt die, ich sag jetzt mal "Sättigung" der einzelnen Farbkanäle da (Rot, Grün, Blau, Alpha). Also nichts verwertbares für dein Unternehmen.
hagu
Beiträge: 8
Registriert: 30.09.2004 13:09

Beitrag von hagu »

Besten Dank für eure Antworten.

Hmm, habs mit DrawImage probiert, aber da erhalte ich irgendwie ein komisches ergebnis. Ist das wirklich XOR? in meinem Grafikprogramm passiert bei XOR was anderes!
Oder ist es nicht XOR was ich brauche?
Ich möchte eigentlich nur die unterschiede der Pixel vom oberen und unteren Bild sichtbar machen


Hmm, ja die Liste mit den BlendingModes kenne ich bereits, aber da habe ich auf SelfDXD gerade noch was anderes gefunden
und zwar D3DBLENDOP
Kann man diesen Befehl in PB nicht benutzen?

http://www.math.uni-leipzig.de/pool/tut ... endop.html
Benutzeravatar
dige
Beiträge: 1239
Registriert: 08.09.2004 08:53

Beitrag von dige »

"Papa, ich laufe schneller - dann ist es nicht so weit."
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

@dige

hm... vielleicht n bissel oversized?

@hagu
wie hast du das XOR denn verwendet?
du musst zuerst Image 1 in normaler darstellung auf den screen bringen,
dann Image 2 in XOR drüber....
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
hagu
Beiträge: 8
Registriert: 30.09.2004 13:09

Beitrag von hagu »

Hmm, das erste Bild lege ich auch im normalen Modus auf den Hintergrund, und dann das obere Bild mit XOR darüber.

Code: Alles auswählen

InitSprite() 
InitSprite3D() 
InitKeyboard() 
InitMouse()
UseJPEGImageDecoder()

OpenScreen(1024, 768, 32, "Blending")

LoadImage(0,"2.jpg")

LoadImage(1,"1.jpg")

Repeat
  ExamineMouse()
  ExamineKeyboard()
  x = MouseX()
  y = MouseY()
  ClearScreen(RGB(0,0,0))
  StartDrawing(ScreenOutput())
  DrawingMode(#PB_2DDrawing_Default)
  DrawImage(ImageID(0), 0, 0) 
  DrawingMode(#PB_2DDrawing_XOr)
  DrawImage(ImageID(1), x, y) 
  StopDrawing()
  FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape)
End
Falls ich zwei identische Bilder benutze, sollte dann nicht "schwarz" angezeigt werden? Oder bin ich da falsch?
Antworten