4

PowerVR SGX ハードウェアを搭載した ARM デバイスのテクスチャにオフスクリーン レンダリングを実装する必要があります。

すべてが完了しました (ピクセルバッファと OpenGL ES 2.0 API が使用されました)。未解決の唯一の問題は、機能が非常に遅い glReadPixelsことです。

私は OpenGL ES の専門家ではないので、コミュニティに質問しています: テクスチャをユーザー空間メモリに直接レンダリングすることは可能ですか? または、テクスチャのメモリ領域のハードウェア アドレスを取得する方法があるのでしょうか? 他の手法 (EGL 拡張機能) はありますか?

ユニバーサル ソリューションは必要ありません。PowerVR ハードウェア用に機能するだけです。

更新:「遅い関数」に関するもう少しの情報glReadPixels。512x512 RGB テクスチャ データを CPU のメモリにコピーします。

  • glReadPixels(0, 0, WIDTH, HEIGHT, GL_RGBA, GL_UNSIGNED_BYTE, &arr)210ミリ秒かかり、
  • glReadPixels(0, 0, WIDTH, HEIGHT, GL_BGRA, GL_UNSIGNED_BYTE, &arr)24 ミリ秒かかります ( GL_BGRAglReadPixels の標準ではなく、PoverVR 拡張機能です)。
  • memcpy(&arr, &arr2, WIDTH * HEIGHT * 4)5ミリ秒かかります

テクスチャが大きいほど、差も大きくなります。

4

3 に答える 3

4

解決しました。

OpenVR ハードウェア レンダリングをユーザー割り当てメモリに強制する方法: http://processors.wiki.ti.com/index.php/Render_to_Texture_with_OpenGL_ES#Pixmaps

例、使用方法: https://gforge.ti.com/gf/project/gleslayer/

このすべての後、レンダリングされた画像を 5 ミリ秒もの速さで取得できます。

于 2012-02-29T14:34:39.573 に答える
0

opengl関数を呼び出すと、レンダリングキューでコマンドをキューに入れることになります。これらのコマンドは、GPUによって非同期的に実行されます。glReadPixelsを呼び出す場合、CPUはGPUがレンダリングを終了するのを待つ必要があります。したがって、コールはその抽選が終了するのを待っている可能性があります。ほとんどのハードウェア(少なくとも私が作業しているハードウェア)では、メモリはcpuとgpuによって共有されるため、レンダリングが行われる場合、読み取りピクセルはそれほど遅くならないはずです。

結果を待つか、次のフレームに延期できる場合は、その遅延が表示されなくなる可能性があります

于 2012-02-27T21:10:37.423 に答える
0

フレームバッファオブジェクトはあなたが探しているものです。これらは、OpenGLESおよびPowerVr-SGXでサポートされています

編集:GPU / CPUハードウェアは、CPU側からGPU側への一方向にデータを移動するために非常に最適化されていることに注意してください。GPUからCPUへのバックパスは、多くの場合、はるかに低速です(ハードウェアリソースを費やす優先順位ではありません)。したがって、どのような手法(FBO / getTexImageなど)を使用しても、この制限に対して実行することになります。

于 2012-02-27T21:11:44.340 に答える