1

基本的に、ユーザー入力(システムRAMで開始)からリアルタイムでフレームごとに生成されるデータの配列(流体シミュレーションデータ)があります。流体の密度をアルファ値としてテクスチャに書き込みたい-配列値を補間して、画面のサイズ(グリッドが比較的小さい)の配列を作成し、0〜255の範囲にマップします。これらの値をテクスチャに書き込んで使用するための最も効率的な方法(ogl関数)は何ですか?

他の場所で提案されているもので、使用したくないと思うもの(間違っている場合はお知らせください):

  1. glDrawPixels()-呼び出すたびに割り込みが発生し、特に高解像度では遅くなるという印象を受けています。

  2. シェーダーを使用する-シェーダーが各フレームの配列内のデータの量を受け入れて処理できるとは思いません(受け入れる可能性のあるデータ量の上限が低すぎると他の場所で言及されています)

4

3 に答える 3

2

シェーダーのパフォーマンスが悪いと思う理由は何ですか?シェーダーの全体的な考え方は、大量のデータを非常に高速に処理することです。「汎用GPUコンピューティング」または「GPGPU」という検索フレーズでGoogleを使用してください。

シェーダーはバッファーからのみデータを収集でき、スキャッターは収集できません。しかし、彼らができることは、バッファの値を変更することです。これにより、(フラグメント)シェーダーが* GL_POINT *の位置を書き込み、テクスチャのターゲットピクセルに配置されます。Shader Model 3以降のGPUは、ジオメトリおよび頂点シェーダーステージからテクスチャサンプラーにアクセスすることもできるため、フラグメントシェーダー部分は非常に単純になります。

位置と値の線形ストリームがある場合は、それらを頂点配列を介してOpenGLに送信し、* GL_POINT *を描画します。ターゲットテクスチャは、フレームバッファオブジェクトのカラーアタッチメントです。

于 2011-05-19T10:17:40.513 に答える
2

私があなたの問題を正しく理解していれば、どちらの解決策も問題を過度に複雑にしています。x と y が符号なしバイトで満たされた画面解像度であるサイズ x*y の配列を既に生成していると考えるのは正しいですか?

その場合、このデータをアルファ チャネルとして使用する OpenGL テクスチャが必要な場合は、テクスチャを作成して GL_TEXTURE_2D にバインドし、GL_ALPHA をフォーマットおよび内部フォーマットとして使用し、GL_UNSIGNED_BYTE をタイプとして使用して、データでglTexImage2Dを呼び出します。 (x,y) サイズとして ?

于 2011-05-19T08:25:51.030 に答える
0

これらの値をテクスチャに書き込んで使用する最も効率的な方法 (ogl 関数) は何ですか?

良い方法は、不要な余分なコピーを避けることです。したがって、アドレス空間にマップするPixel Buffer Objectsを使用し、それを使用してデータを直接生成できます。

フレームごとにこのデータを更新する必要があるため、CPU と GPU 間の暗黙的な同期を強制しないように、効率的なバッファー オブジェクト ストリーミングも探す必要があります。シナリオでこれを行う簡単な方法は、フレームごとに進める 3 つの PBO のリング バッファーを使用することです。

他の場所で提案されたもので、使用したくないと思います (間違っている場合はお知らせください):

  1. glDrawPixels() - これを呼び出すたびに割り込みが発生し、特に高解像度では遅くなるという印象を受けました。

ドライバーが行うことは、完全に実装固有です。「毎回割り込みを発生させる」というのは、ここでは有用なイメージではないと思います。GL 実装が背後で行う作業を完全に過小評価しているようです。GL 呼び出しは、GPU に送信される一部のコマンドに対応しません。

しかし、使用しないことglDrawPixelsは依然として良い選択です。これはあまり効率的ではなく、非推奨になり、最新の GL から削除されました。

  1. シェーダーを使用する - シェーダーがフレームごとに配列内のデータ量を受け入れて処理できるとは思わない (受け入れられるデータ量の上限が低すぎると他の場所で言及された)

あなたはこれを完全に間違っています。シェーダーを使用しない方法はありません。自分で作成しない場合 (GL の古い「固定機能パイプライン」を使用するなど)、GPU ドライバーがシェーダーを提供します。これらの以前の固定関数ステージのハードウェア実装は、プログラマブル ユニットによって完全に置き換えられました。したがって、シェーダーで実行できない場合は、GPU で実行できません。また、独自のシェーダーを作成することを強くお勧めします (最新の GL ではこれが唯一のオプションです)。

于 2016-08-13T10:10:39.533 に答える