3
  • GPU アクセラレーションによる 3D レンダリングを画面のリフレッシュ レートよりも高速に実行することは可能ですか?

  • OpenGLでそれを行うことは可能ですか? はいの場合、どのように、そうでない場合、どのツールを使用しますか?

ノート

レンダリングを画面のリフレッシュ レートよりも速くしたいので、画面に出力しなくてもかまいません。実際、出力ウィンドウがないことは利点です。

レンダー出力をプログラムで (glReadPixelsたとえば経由で) 使用するか、人間が後で見るためのビデオとしてファイルに出力します。

なぜ私はこれをしたいのですか

コンピューター ビジョン用のロボットのコンピューター シミュレーションを行いたいです。シミュレートされたロボットには、この世界を見るための仮想カメラがあり、カメラの入力に応じて動作します。したがって、画面のリフレッシュ レートを無視して、できるだけ高速にシミュレーションを実行したいと考えています。

4

2 に答える 2

7

はい、これは OpenGL で確実に可能です。レンダリング レートは画面のリフレッシュ レートとは関係ありません (これが、500 FPS などで実行されているデモを見ることができる理由です)。

メカニズムに関しては、オフスクリーン フレームバッファにレンダリングし、結果のイメージをメイン メモリに読み込むことができます。その後、好きなように処理/分析できます。見る:

于 2013-01-13T12:24:07.950 に答える
1

OpenGLでそれを行うには、コールバック関数glutSwapBuffersの最後にあるを、に置き換える必要がありました。これにより、非常に単純なシーンで60FPSから600FPSになりました。displayglFlush

glutSwapBuffers計算された各フレームが確実に表示されるため、画面が更新されるまでプログラムが停止します。更新されると、画面に表示されるフロントバッファにバックバッファが配置されます。

glFlush一方、シーンが計算されたことを確認し、バックバッファ(画面には表示されない)を新しいシーンで更新するだけです。したがって、新しいシーンの計算は、新しいシーンがレンダリングされるまで停止します。シーンが計算されたことを確認するために、バッファを交換する前にglutSwapBuffers呼び出し ます。glFlush

ノート

私のアプリケーションでは、glReadPixelsがなくてもピクセルを正しく読み取ることができたglutSwapBuffersので、バックバッファーから読み取っています。

ただし、glReadPixels700ピクセルを取得するために呼び出すだけでは、パフォーマンスが大幅に低下します。FPSは200FPSに低下しました。これは、バックバッファがGPUメモリのどこかにある必要があり(これを修正/確認してください)、glReadPixelsGPU->CPU通信を実行しているためだと思います。これは非常にコストがかかります。

つまり、レンダリングの計算速度がどれほど速くても、成長してGPGPUで処理を実行し、そこからバックバッファーにアクセスする方法を学ばない限り、アプリケーションは200FPSでボトルネックになります。

于 2013-01-14T17:32:14.923 に答える