[OpenGL]Vergeichen, ob zwei Texturen gleich sind
-
Indem du sie Pixel für Pixel durchgehst und vergleichst!?
-
Und wie mach ich das?
-
Wo genau liegt dein Problem!?
-
X.DarkForce.X schrieb:
Und wie mach ich das?
Mit der Tastatur eintippen.
-
TGGC schrieb:
Mit der Tastatur eintippen.
Sorry, war kurz weg. Die haben mich in der Firma noch kurz gebraucht obwohl im mich als frei eingeschrieben habe.Heisst das, dass ich das Bild rendern muss und dann mir glGetPixels analysieren muss?
-
Geh mal mit dem Debugger durch. Arbeitet ihr mit Pixelbuffern?
-
fürs rendern hab ich einzig und allein einen pixelformat descriptor und einen renderingcontex gemacht.
-
Warum rendern, du musst die Texturdaten doch bereits haben oder was übergibst du an glTexImage2D()? Vielleicht gibst du uns auch mal etwas Kontext was genau du eigentlich damit machen willst...
-
Wenn du wirklich wissen willst ob Textur1 == Textur2 dann musst du die Buffer byteweise vergleichen. Kann man evtl mit einer Checksum optimieren. Wenn du verhindern willst, das eine Textur mehrfach geladen wird, mach dir ein Hashmap oder sowas mit Zuordnung Dateiname <-> GL TexturID
...wie gesagt, deine Infos sind ziemlich spartanisch ^^
-
Ich würde ein FBO verwenden:
-Das FBO mit dem Mittelwert füllen. (Also 0.5f bzw. 127 aus Byte Sicht)
-Dann das erste Bild einblenden. Dabei die Deckkraft halbieren (So dass aus dem max. Wert 255 ein 127 wird, z.B. mit einem blend Wert von 0.5f)
-Nun das zweite Bild negativ in das FBO blenden (Siehe: http://wiki.delphigl.com/index.php/glBlendFunc, das ist zwar eine Delphi Seite, aber die haben sehr gut veranschaulicht was die ganzen Modi machen)
Deckkraft natürlich auch halbieren.-dann aus dem FBO eine Textur machen und die Mipmap von OpenGL erstellen lassen. (glGenerateMipmap <-- ist so schön schnell
)
-die Textur jetzt in klein (Je nach dem wie genau du Unterschiede erkennen willst versus wie schnell du es später auslesen willst) in ein FBO rendern.
-Dann diesen FBO-Inhalt in den Ram kopieren und zusammenzählen wie weit jeder Pixelwerte von 127 abweicht.
Wie größer dieser Wert ist, um so Ungleicher sind die Bilder. Und bei 0 handelt es sich um gleiche oder nahezu gleiche Bilder.
PS: Wenn ich es richtig verstanden habe, kann man mittels eines PBO beim auslesen der Textur->Ram nochmal einiges an Geschwindigkeit raus holen. Aber damit habe ich noch nicht gearbeitet.
Es wäre auch einen Versuch wert zu schauen ob man das ganze mit einem floating point FBO machen kann. Dann sollten es relativ genaue Resultate gäben, ohne dass man ein sehr großes Bild von der GPU zum Ram kopieren muss. Das unterstützen aber erst "neuere" Grafikkarten. Wohingegen die anderen Funktionen auch von relativ alten Grafikkarten unterstützt werden.
Das ganze lohnt sich aber nur wenn die Texturen ohnehin in OpenGL herumliegen. Sie dafür extra zur GPU zu senden könnte ohne PBO teurer sein als sie nur auf der CPU zu vergleichen.
Ja, ich habe auch ein kleineres Projekt geplantes wo ich so etwas gebrauchen könnte.