Wie würden Sie den effektivsten automatisierten Test für Grafikcode für OpenGL in einem Unit-Test durchführen?

17

Ich schreibe ein Spiel und die dazugehörige Grafik-Engine auf OpenGL in C ++. Ich bin auch ein Fan von guten Codierungsprozessen und automatisierten Tests. Grafikcode + Testen scheint ziemlich nicht mischbar zu sein, da die Ausgabe oft nur visuell oder sehr stark visuell orientiert ist.

Stellen Sie sich zum Beispiel vor, Sie analysieren den rohen Bildstrom, der Byte für Byte auf dem Bildschirm gerendert wird. Sie benötigen Testdaten zum Vergleichen, die schwer zu erstellen / zu erhalten sind, und oft sind die gerenderten Bilder auf einem nicht identisch Byte-Ebene, wenn zu verschiedenen Zeiten ausgeführt - kleine Änderungen in den Algorithmen werden diesen Ansatz vollständig zunichte machen.

Ich denke darüber nach, eine visuelle Unit-Testsuite zu erstellen, in der ich im Grunde genommen verschiedene Testszenen rendern und Dinge wie Shadow Mapping, Animation usw. usw. zeigen kann. Im Rahmen von CI würden diese Szenen dann zu einem Video gerendert Datei (oder möglicherweise als ausführbare Datei belassen) mit unterschiedlichen Metriken. Dies würde immer noch eine manuelle Überprüfung der Videodatei erfordern, aber zumindest würde dies etwas automatisiert und standardisiert sein.

Was denkst du? Ich hoffe, es gibt bessere Wege?

Max
quelle
2
Dies ist eine gute Frage, ich frage mich , wenn Sie bessere Antworten auf bekommen gamedev.stackexchange.com da vielleicht mehr Leute da sein , die vor dem mit dieser behandelt haben.
FrustratedWithFormsDesigner
3
Da Sie OpenGL verwenden, sollten Sie untersuchen, wie die Khronos-Gruppe Konformitätstests für diese API durchführt. Kollegen in meinem Ex-Projekt, die damit behandelt haben mir gesagt , dass Grafiken Khronos testen, so nah an der Perfektion wie es geht
gnat
@FrustratedWithFormsDesigner Danke, ich habe gamedev.stackexchange komplett vergessen ... Ich habe Programmierer gründlich gesucht, aber nicht diese. Es scheint, dass sich die meisten Antworten auf Unit-Tests dort auf die normalerweise getesteten Dinge konzentrieren. Vielleicht ist dies also kein Duplikat. Werde aber noch ein bisschen nachsehen, danke :)
Max

Antworten:

8

Die opencv-Bildbearbeitungsbibliothek speichert das Bild und vergleicht es mit einem Referenzbild. Sie verfügt über eine Reihe von c ++ - Testfunktionen und Makros für die ungefähre Bildanpassung usw.

Martin Beckett
quelle
Ich werde versuchen, es selbst genauer zu untersuchen, aber diese Seite sagt nichts über die ungefähre Bildübereinstimmung aus. Wissen Sie, ob es für Regressionstests beim Vergleichen von Frames funktionieren würde? Dann könnte ich das erste Mal, wenn eine Szene gerendert wird, visuell untersuchen und als Referenz notieren. Hat OpenCV fertige Funktionen dafür, die ich verwenden könnte? : p
Max
@max Im Allgemeinen gibt es eine "goldene" Version der Testfunktion, die den Referenzrahmen generiert und beim Erstellen des Tests einmal ausgeführt wird. In der Distribution gibt es ein paar "Testbildvergleich" -Makros. Ich glaube nicht, dass es etwas Spezifisches gibt, um openGL-Puffer zu einem Bild zurückzulesen, aber das ist einfach genug
Martin Beckett
4

Ihr Testframework kann das Testbild in einen Puffer rendern, das gerenderte Bild abrufen und es mit einem "goldenen" Referenzbild vergleichen, das zuvor für diesen Zweck generiert wurde.

Dies funktioniert auch nicht in Fällen, in denen nicht erwartet wird, dass die Ergebnisse Ihres Tests exakt gleich bleiben . Sie können jedoch die quadratische Differenz der Test- und Referenzbilder berechnen und mit einem Schwellenwert vergleichen.

Möglicherweise möchten Sie auch die Protokollierung und Überprüfung von Leistungsdaten bereitstellen, da ein starker Leistungsrückgang ein weiterer möglicher Fehlermodus ist.

kommendes Gewitter
quelle
4

Auch wenn Sie die Ausgabebilder nicht vergleichen können, können Sie zumindest testen, ob Ihre Rendervorgänge ordnungsgemäß ausgeführt wurden (keine Abstürze, lange Wartezeiten usw. usw.). Es ist natürlich besser, einen Weg zu finden, um die Bilder zu überprüfen, aber auch ohne diesen Weg haben Sie durch die Tests etwas gewonnen.

Michael Kohne
quelle
2
Genau: Ich wollte etwas Ähnliches beantworten ("Auch wenn Sie einen Unit-Test haben, der die Videodatei nur blind generiert und einige triviale Tests durchführt (z. B. hat die richtige Länge, nicht vollständig schwarz, nicht vollständig weiß), könnte dies ausreichen um viele Regressionsfehler abzufangen. Insbesondere solche, die einfach dazu führen, dass Ihre Funktionen eine Ausnahme auslösen. ") Eine zweite ähnliche Antwort ist jedoch nicht erforderlich. Deshalb lasse ich sie hier nur als Kommentar.
user281377