OpenGLのグラフィックコードで最も効果的な自動テストをどのように単体テストまたは実行しますか?


17

C ++でOpenGLの上にゲームとそれに付随するグラフィックエンジンを書いています。また、優れたコーディングプロセスと自動テストのファンでもあります。出力は多くの場合視覚のみであるか、非常に視覚指向であるため、グラフィックスコード+テストは非常に混同しにくいようです。

たとえば、画面にバイト単位でレンダリングされる生の画像ストリームを分析することを想像してください-比較するテストデータが必要で、作成/取得が難しく、レンダリングされた画像はしばしば同じではありません異なる時間に実行する場合のバイトレベル-アルゴリズムの小さな変更は、このアプローチを完全に破壊します。

視覚的な単体テストスイートを作成することを考えています。基本的に、さまざまなテストシーンをレンダリングし、シャドウマッピング、アニメーションなどのようなものを表示できます。CIの一部として、これらのシーンはビデオにレンダリングされます異なるメトリックのファイル(または実行可能ファイルとして残すこともできます)。ビデオファイルの手動検査が必要になりますが、少なくともある程度自動化および標準化されます。

どう思いますか?もっと良い方法がありますか?


2
これはいい質問です。gamedev.stackexchange.comでより良い答えを得ることができるかどうか疑問に思っています。
FrustratedWithFormsDesigner

3
OpenGLを使用しているため、KhronosグループがこのAPIの適合性テストを実行する方法を検討することを検討してください。それに対処私の元、プロジェクト内の同僚はそれを取得としてクローズを完璧にテストとしてクロノスグラフィックがあることを私に言った
ブヨ

@FrustratedWithFormsDesignerありがとう、gamedev.stackexchangeを完全に忘れていました...プログラマーをかなり徹底的に検索しましたが、そのプログラマーは検索しませんでした。ユニットテストに関する回答のほとんどは、通常テストされているものに焦点を当てているようですが、おそらくこれは重複ではありません。もう少ししかし、おかげで:)チェックします
マックス・

回答:


8

opencv画像処理ライブラリは、画像を保存して参照画像と比較することでそれを行います -おおよその画像マッチングなどを処理するためのc ++テスト関数とマクロがたくさんあります


自分でもっと詳しく調べてみますが、そのページにはおおよその画像マッチングについては何も書かれていません。フレームを比較する場合に回帰テストで機能するかどうか知っていますか?その後、シーンが初めてレンダリングされたときに視覚的に検査し、参照としてメモすることができます。OpenCVには、使用できるこの機能が用意されていますか?:p
マックス

通常、@ maxには、参照フレームを生成し、テストの作成時に1回実行されるテスト機能の「ゴールド」バージョンがあります。ディストリビューションには、いくつかの「テストイメージ比較」マクロがあります。私は、画像に戻ってOpenGLのバッファを読むための具体的なものがあるとは思わないが、それは簡単で十分だ
マーティン・ベケット

4

テストフレームワークは、テストイメージをバッファーにレンダリングし、レンダリングされたイメージを取得し、その目的で以前に生成された「ゴールデン」参照イメージと比較できます。

これは、テストの結果がまったく同じであるとは予想されない場合にはうまくいきません。ただし、テスト画像と参照画像の差の二乗を計算し、しきい値と比較できます。

パフォーマンスの大幅な低下は別の可能性のある障害モードであるため、パフォーマンスデータのログ記録とチェックを提供することもできます。


4

出力画像を比較できない場合でも、少なくとも、レンダリングが適切に完了したことをテストできます(クラッシュ、長時間の待機などはありません)。もちろん、画像を確認する方法を見つけた方が良いですが、それがなくてもテストから何かを得られます。


2
まさに:私は同様の何かに答えようとしていました(「ビデオファイルをやみくもに生成し、いくつかの些細なテストを行うユニットテストがある場合でも(たとえば、正しい長さ、完全に黒ではなく、完全に白ではない)、それは十分かもしれません多くのリグレッションエラーをキャッチします。特に、単に関数が例外をスローする原因になります。))
user281377
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.