2012-02-27 8 views
4

PowerVR SGXハードウェアでARMデバイスのテクスチャにオフスクリーンレンダリングを実装する必要があります。ユーザ空間メモリへのOpenGL ESレンダリング

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

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

私はPowerVRハードウェアのためだけに働く普遍的なソリューションは必要ありません。

更新: 'slow function glReadPixels'に関するさらに詳しい情報です。 CPUのメモリへのコピー512×512 RGBのテクスチャデータ:

  • glReadPixels(0, 0, WIDTH, HEIGHT, GL_RGBA, GL_UNSIGNED_BYTE, &arr)は210ミリ秒かかり、
  • glReadPixels(0, 0, WIDTH, HEIGHT, GL_BGRA, GL_UNSIGNED_BYTE, &arr)
  • memcpy(&arr, &arr2, WIDTH * HEIGHT * 4)が5ミリ秒
をとり、24ミリ秒( GL_BGRAがglReadPixelsための標準ではない、それはPoverVR拡張子だ)かかり

テクスチャが大きい場合は、違いが大きくなります。

+0

クライアント空間のテクスチャに必要なものは何か質問できますか?おそらくGPUメモリを残すためにテクスチャを必要としないかもしれません。うまくテクスチャリングするためにテクスチャを使用したいときは、[FBOs](http://www.songho.ca/opengl/gl_fbo.html)を使用してGPUテクスチャに直接レンダリングすることができますあなたの全面的な問題は時代遅れです。 –

+0

いいえ、私は本当にそれが必要です。レンダリングされたイメージは、デバイスの作業の結果としてネットワークを介して送信する必要があります。 – qehgt

答えて

4

解決済み。

ユーザーに割り当てられたメモリへのレンダリングOpenVRハードウェアを強制的にどのような方法:私は速いのようにレンダリングされた画像を得ることができます https://gforge.ti.com/gf/project/gleslayer/

を、このすべての後: http://processors.wiki.ti.com/index.php/Render_to_Texture_with_OpenGL_ES#Pixmaps

の例では、どのようにそれを使用します5ms。

+0

qehgt私はこれを読んできました... CMemを使ってユーザ空間バッファを割り当て、EGLImageKHRを使用する主なトリックですか? – Constantin

+0

CMEM - はい、EGLImageKHR - わかりません。 CMEMメモリに "native pixmap"を割り当てる必要があります。その後、このピクスマップを非常に素早く読み書きできます。詳細については、gleslayerアプリケーションのsgxsink_main.cppファイルの 'common_create_native_pixmap'関数を見てください。 – qehgt

+0

これはまさに私が私の例として使っているものです。最後の簡単な質問ですが、この例では実際には "読み込み"はコメントしていませんが、返されたアドレスcmem_alloc(lAddress、pvAddressではなく)のメモリにアクセスできると仮定しています。ここから私たちはどこに行きたいのですか? – Constantin

0

opengl関数を呼び出すと、レンダリングキューにコマンドがキューイングされます。これらのコマンドは、GPUによって非同期に実行されます。 glReadPixelsを呼び出すと、CPUはレンダリングを終了するまでGPUを待機する必要があります。その呼出しは、そのドローが終了するのを待っているかもしれません。ほとんどのハードウェア(少なくとも私が作業しているもの)では、メモリはCPUとGPUで共有されているので、読み込みピクセルはレンダリングが行われると遅くなるべきではありません。

あなたは結果を待つか、次のフレームにそれを延期することができた場合は、その遅延が表示されない場合がありますもう

+1

私は 'glReadPixels'の前に' glFinish'を呼び出しましたので、問題ではないと確信しています。また、このシナリオでは、イメージをレンダリングし、 'glFinish'を呼び出し、' glReadPixels'コールを測定し、 'glReadPixels'コールを測定し、' glReadPixels'コールを測定します。 'glReadPixels'の呼び出しはすべて遅いです。 – qehgt

0

Frame buffer objectsは、あなたが探しているものです。 OpenGL ESおよびPowerVr-SGXでサポートされています

EDIT: GPU/CPUハードウェアは、CPU側からGPU側へ一方向にデータを移動するために非常に最適化されています。 GPUからCPUへのバックパスは、しばしばはるかに低速です(ハードウェアリソースを使用する優先順位ではありません)。だから、これまでに使っていた技術(FBO/getTexImageなど)は、この限界に対して実行しようとしています。

+0

私はFBOにレンダリングできます。しかし、FBOからレンダリングされたイメージを取得する方法はありますか?唯一の方法は(私が見るように) 'glReadPixels'を呼び出すことです。私が間違っている? – qehgt

+0

glReadPixelsはディスプレイから読み取ります。 glGetTexImageを使用して、テクスチャのデータをfboにカラーアタッチメントとして添付する必要があります。 –

+0

@MārtiņšMožeiko幸いにも、OpenGL ESにはglGetTexImageがありません。 –

関連する問題