問題タブ [pbo]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
666 参照

c++ - PBOを別のスレッドに割り当てますか?

CPUとGPU間のデータ転送にPBOを使用するマルチスレッドOpenGLアプリケーションがあります。

PBOの割り当てをプールしましたが、プールが空の場合、OpenGLスレッドがバッファーを割り当てることができるポイントに到達するまで(つまり、現在のフレームのレンダリングが終了するまで)、非openglスレッドをしばらくブロックする必要があります。この待機により、特定の状況でラグスパイクが発生しますが、これは避けたいと思います。

「メイン」OpenGLスレッドによって使用される別のスレッドにPBOを割り当てることは可能ですか?

0 投票する
1 に答える
2149 参照

c++ - glMapBufferメモリを読み取り専用として有効に保ちながら、glUnmapBuffer

SSE 4.1 ストリーミング ロードを使用した読み取り専用操作に対して、有効な以前に返されたポインターが指すデータをピクセル バッファー オブジェクトに保持するglUnmapBufferことは可能ですか?GL_STREAM_DRAWglMapBuffer

そうでない場合、これには技術的な理由がありますか? それとも、この「機能」が取り残されただけですか?

0 投票する
1 に答える
2351 参照

opengl - PyOpenGLでテクスチャをpboにコピーするには?

しばらくの間 PyOpenGL を楽しく使用した後、私は真剣に立ち往生しています。私は、GLSL シェーダーと OpenCL プログラムを画像処理に使用できるようにする Python パッケージに取り組んでおり、GLSL シェーダーと OpenCL プログラムにデータを出し入れするための標準化された方法としてテクスチャを使用しています。

テクスチャを pbo (ピクセル バッファ オブジェクト) にコピーできないことを除いて、すべてが機能します。私は pbo を使用してテクスチャ データを OpenCL に出し入れしていますが、PyOpenCL ではうまく高速に動作します。OpenCL 出力を pbo からテクスチャにコピーして表示できます。また、データを CPU からpbo。しかし、GPU に既にあるテクスチャ データで pbo を埋めようとして絶望的に立ち往生しています。これは、GLSL シェーダーによって生成された画像をさらに処理するために OpenCL にロードするために必要なことです。

これを行う 2 つの方法について読みました: バリアント 1 は、pbo をバインドし、テクスチャをバインドし、glGetTexImage() を使用します バリアント 2 は、テクスチャをフレーム バッファ オブジェクトにアタッチし、fbo と pbo をバインドし、glReadPixels() を使用します

また、glReadPixels() と glGetTexImage() の両方の PyOpenGL バージョンには、バインドされた pbo があるときに使用する必要がある「Null」ポインターに問題があることも読みました。そのため、OpenGL.raw.GL バリアントを使用しています。

しかし、どちらの場合も「無効な操作」エラーが発生し、何が間違っているのかわかりません。私の pixelbuffer Python クラスの load_texture() メソッドの 2 つのバージョンの下に、それらを削除しすぎていないことを願っています...

バリアント 1:

バリアント 2:

EDIT(私のpboのエラーと初期化に関するいくつかの情報を追加):

バリアント 1 で得られるエラーは次のとおりです。

そして、私は次のように私のpboを初期化しています:

'self.arraytype' は GL_ARRAY_BUFFER, self.usage 念のためすべての可能性を試しましたが、GL_STREAM_READ が私のタイプの使用には最も論理的であると思われました。私が通常使用しているサイズは 1024 x 1024、4 プレーン、プレーンあたり 1 バイトです。これは unsigned int であるためです。これは、ホストからピクセル データを転送するときに問題なく動作します。

また、GPU に 3Gb のメモリを搭載した NVIDIA GeForce GTX 580 を使用し、独自のドライバー、バージョン 295.33 を使用して、Kubuntu 11.10 を使用しています。

私は何が欠けていますか?

0 投票する
3 に答える
20076 参照

c++ - glPixelStorei(GL_UNPACK_ALIGNMENT, 1) デメリット?

常に1のalginmentを使用することの欠点は何ですか?

最新の gpu のパフォーマンスに影響しますか?

0 投票する
2 に答える
5770 参照

opengl - PBO を使用した非同期 glReadPixels

別の方法でピクセルを読み取るために、2 つの PBO を使用したいと考えています。PBOを使用するとglReadPixelsがすぐに戻り、多くの時間が重複する可能性があるため、PBOの方がはるかに高速になると思いました。

意外とメリットは少ないようです。次のようなコードを検討してください。

結果は

PBO の方法は少し高速ですが、満足のいく即時返品ではありません。</p>

私の質問は:

  • glReadPixels のパフォーマンスに影響を与える要因は何ですか? 場合によっては、10ms に達することもありますが、ここでは 1.3ms です。
  • 即時リターンのコストが 1.2 ミリ秒もかかるのはなぜですか? 大きすぎますか、それとも普通ですか?

================================================== =========================

デモとの比較によると、2 つの要因が見つかりました。

  • GL_BGRA は GL_RGBA よりも優れており、1.3ms=>1.0ms(PBO なし)、1.2ms=>0.9ms(pbo あり)
  • glutInitDisplayMode(GLUT_RGB|GLUT_ALPHA) ではなく、GLUT_RGBA, 0.9ms=>0.01ms。それが私が望むパフォーマンスです。私のシステムでは、GLUT_RGBA=GLUT_RGB=0 です。GLUT_ALPHA=8

次に、別の 2 つの質問:

  • GL_BGRA が GL_RGBA より優れているのはなぜですか? 特定のプラットフォームだけに当てはまるのか、それともすべてのプラットフォームに当てはまるのか?
  • GLUT_ALPHA が PBO のパフォーマンスに大きく影響するほど重要なのはなぜですか?
0 投票する
1 に答える
612 参照

opengl - glMapBuffer は GPU 時間を占有しますか?

glMapBuffer の一般的な使用法は次のとおりです。

別の方法で動作する 2 つの PBO があります。

ただし、doSomeWork(.) が別のスレッドにある場合もあります。上記のコードが適用される場合、現在のスレッドは doSomeWork() が終了するまで待機する必要があります。別の解決策は次のとおりです。

この場合、同じ PBO の map->unmap 手順は 2 つのフレームにまたがります。

  • PBO のマップされていない状態は、GPU のレンダリングを停止しますか?
  • パフォーマンスへの悪影響はありますか?
0 投票する
1 に答える
3620 参照

c++ - テクスチャアップロード用のOpenGLPBO、1つのことを理解できません

さて、私はここでPBOについてのすべてを読みました:http ://www.opengl.org/wiki/Pixel_Buffer_Object そしてそこにhttp://www.songho.ca/opengl/gl_pbo.html、しかし私はまだ質問があり、私はしません私の場合、PBOから何らかの利益が得られるかどうかはわかりません:

私はビデオストリーミングを行っています。現在、データバッファを3つの異なるテクスチャにコピーする機能があり、フラグメントシェーダーでいくつかの計算を行って、テクスチャを表示しています。

PBOはアップロード時間をCPU->GPUに増やすことができると思いましたが、ここでは、上記の2番目のリンクからこの例を取得したとしましょう。

さて、updatePixels関数の動作が何であれ、マップされたバッファにデータをコピーするためにCPUサイクルを使用していますね。

したがって、PBOをそのような方法で使用したいとします。つまり、関数でフレームピクセルをPBOに更新してから、関数でdisplayglTexSubImage2D(すぐに戻るはずです)を呼び出します...速度はわかりますか-パフォーマンスの面でアップ?なぜ高速になるのかわかりません...glTex*の呼び出し中はもう待機していませんが、フレームをPBOにアップロードする関数の間は待機していますね。

誰かが私のためにそれをクリアしてくれませんか?

ありがとう

0 投票する
1 に答える
67 参照

c++ - cuda_gl_interop 関数を使用してセットアップするときにピクセル バッファを取得することは可能ですか?

私はこの件について読み、並列化されたレイトレーシング エンジンを実装中です (現在は光線と球体の交差のみを使用しています) が、結果を GLUT ウィンドウに表示するか、ファイルに直接書き込むことしかできないようです。どうすればこれを達成できるか途方に暮れています。現在、cudaGraphicsResource をセットアップして、GL ピクセル バッファ オブジェクトにマッピングしています。OpenGL に比較的慣れていないので、CPU でピクセル データを取得する方法がわかりませんでした。

編集:申し訳ありません。私が投稿したように、私は目がくらむほど明白な glReadPixels ルーチンを見つけました。それを調べます。

0 投票する
1 に答える
203 参照

c++ - PBO との競合状態

OpenGL の PBO について読んだところ、競合状態に関する質問がありました。

次の例を見てみましょう。2 つの PBO があり、それらのピクセル データを順番にテクスチャ オブジェクトに転送したいと考えています。そのため、1 つの PBO の非同期ピクセル転送を開始すると、ピクセル データがバックグラウンドで転送されている間に、すぐに CPU で別の処理を実行できます。次に、2 番目の PBO でいくつかのピクセル操作を行います。それが完了したら、ピクセルを 2 番目の PBO からテクスチャ オブジェクトに転送します。しかし、最初の PBO の転送がまだ完了していない場合はどうなるでしょうか? この最初の例のようです: http://www.songho.ca/opengl/gl_pbo.html

glTextSubImage2D() はすぐに戻り、最初の PBO のデータが GPU に転送されている間に 2 番目の PBO の作業を開始できます。最初の転送が完了する前に glTexSubImage() (2 番目の PBO のピクセル データを転送する必要があります) に到達した場合はどうなりますか? CPU ストール サイクルが発生しますか?