Jak przetestowałbyś jednostkę lub przeprowadziłbyś najbardziej efektywne automatyczne testowanie kodu graficznego dla OpenGL?

17

Piszę grę i towarzyszący jej silnik graficzny na OpenGL w C ++. Jestem także fanem dobrych procesów kodowania i automatycznych testów. Testowanie kodu graficznego + wydaje się dość niemieszalne, ponieważ dane wyjściowe są często tylko wizualne lub bardzo mocno zorientowane wizualnie.

Na przykład wyobraź sobie analizę surowego strumienia obrazu renderowanego bajt po bajcie - potrzebujesz danych testowych do porównania, które są trudne do utworzenia / uzyskania, a często renderowane obrazy nie są identyczne poziom bajtów podczas uruchamiania w różnych momentach - niewielkie zmiany w algorytmach całkowicie zniszczą to podejście.

Zastanawiam się nad stworzeniem wizualnego pakietu testów jednostkowych, w którym mogę w zasadzie renderować różne sceny testowe, pokazując takie rzeczy jak mapowanie cieni, animacje itp. Itp. W ramach CI te sceny byłyby następnie renderowane do wideo plik (lub ewentualnie pozostaw go jako plik wykonywalny) z różnymi wskaźnikami. Wciąż wymagałoby to ręcznej kontroli pliku wideo, ale przynajmniej byłby nieco zautomatyzowany i znormalizowany.

Co myślisz? Mam nadzieję, że są lepsze sposoby?

Max
źródło
2
To dobre pytanie, zastanawiam się, czy uzyskałbyś lepsze odpowiedzi na stronie gamedev.stackexchange.com, ponieważ może być więcej osób, które zajmowały się tym wcześniej.
FrustratedWithFormsDesigner
3
Ponieważ używasz OpenGL, zastanów się, w jaki sposób grupa Khronos przeprowadza testy zgodności dla tego interfejsu API. Koledzy z mojego byłego projektu, którzy się tym zajmowali, powiedzieli mi, że testowanie grafiki w Khronos jest tak idealne, jak to tylko możliwe
gnat
@FrustratedWithFormsDesigner Dzięki, zupełnie zapomniałem o gamedev.stackexchange ... Dość dokładnie przeszukałem programistów, ale nie tego. Wydaje się, że większość odpowiedzi na temat testów jednostkowych koncentruje się na zwykle testowanych rzeczach, więc może to nie jest duplikat. Jeszcze sprawdzę, dziękuję :)
Max

Odpowiedzi:

8

Biblioteka przetwarzania obrazu opencv robi to, zapisując obraz i porównując go z obrazem referencyjnym - ma kilka funkcji testowych c ++ i makr do obsługi przybliżonego dopasowania obrazu itp.

Martin Beckett
źródło
Spróbuję to dokładniej sprawdzić, ale ta strona nie mówi nic o przybliżonym dopasowaniu obrazu. Czy wiesz, czy zadziałałoby to w przypadku testów regresji w przypadku porównywania ramek? Następnie mógłbym wizualnie sprawdzić, kiedy scena jest renderowana po raz pierwszy, zanotować ją jako odniesienie i tak dalej. Czy OpenCV ma gotowe do tego funkcje? : p
Maks
@max na ogół istnieje „złota” wersja funkcji testowej, która generuje ramkę odniesienia i jest uruchamiana raz podczas tworzenia testu. W dystrybucji znajduje się kilka makr „porównujących obraz testowy”. Nie sądzę, żeby było coś konkretnego do odczytywania buforów openGL do obrazu, ale to dość proste
Martin Beckett
4

Struktura testowa może renderować obraz testowy w buforze, pobierać renderowany obraz i porównywać go ze „złotym” obrazem referencyjnym, który został wcześniej wygenerowany w tym celu.

To nie zadziała tak dobrze w przypadkach, w których nie oczekuje się, że wyniki testu pozostaną dokładnie takie same. Można jednak obliczyć kwadratową różnicę między obrazem testowym i referencyjnym oraz porównać go z wartością progową.

Możesz także chcieć zapewnić rejestrowanie i sprawdzanie danych dotyczących wydajności, ponieważ głównym regresem wydajności jest inny możliwy tryb awarii.

nadchodząca burza
źródło
4

Nawet jeśli nie możesz porównać obrazów wyjściowych, przynajmniej będziesz w stanie przetestować, czy Twoje rendery są odpowiednio ukończone (bez awarii, długich oczekiwań itp.). Znalezienie sposobu na sprawdzenie obrazów jest oczywiście lepsze, ale nawet bez niego zyskasz coś z testów.

Michael Kohne
źródło
2
Dokładnie: miałem zamiar odpowiedzieć na coś podobnego („Nawet jeśli masz test jednostkowy, który po prostu ślepo generuje plik wideo i wykonuje trywialne testy (np. Ma odpowiednią długość, nie jest całkowicie czarny, nie jest całkowicie biały), może to wystarczyć aby złapać wiele błędów regresji. Zwłaszcza te, które powodują, że twoje funkcje zgłaszają wyjątek. ”), ale nie ma potrzeby drugiej podobnej odpowiedzi, więc zostawiam to tutaj jako komentarz.
user281377