1
  • シーンをレンダリングします (デフォルトのレンダーバッファに)
  • このシーンから長方形を取得し、そこからテクスチャを作成したい
  • glReadPixels() を CPU にダウンさせてから、データを GPU にアップロードすることなく実行したいと思います。
  • これは OpenGL ES 2.0 を使用して可能ですか?
  • PS - 奇妙な形ではなく、画面の POT 領域を使用したい

すでに動作している GPU->CPU->GPU 実装の疑似コード:

// Render stuff here

byte *magData = glReadPixels();

// Bind the already-generated texture object
BindTexture(GL_TEXTURE0, GL_TEXTURE_2D, alias);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, MAGWIDTH, MAGHEIGHT, 0, GL_RGB, GL_UNSIGNED_BYTE, magData);
4

2 に答える 2

4

glCopyTexImage2Dを使用して、バック バッファーからコピーできます。

glBindTexture(GL_TEXTURE_2D, textureID);
glCopyTexImage2D(GL_TEXTURE_2D, level, internalFormat, x, y, width, height, border);

OpenGL ES 2.0 は、常にバック バッファー (またはシングル バッファー構成の場合はフロント バッファー) からコピーします。OpenGL ES 3.0 を使用すると、コピーのソースを次のように指定できます。

glReadBuffer(GL_BACK);

ClayMontgomery の回答 (glCopyTexImage2D遅い)に照らしglCopyTexSubImage2Dて、毎回新しいバッファーを割り当てるのではなく、事前に割り当てられたテクスチャに書き込むため、適切なサイズとフォーマットのテクスチャを使用する方が高速であることがわかる場合があります。それでも遅すぎる場合は、彼の提案に従ってフレーム バッファにレンダリングしてみてください (ただし、同じ結果を得るには、フレーム バッファのテクスチャを使用して画面にクワッドを描画する必要があります)。

于 2013-08-13T09:40:21.510 に答える
1

glCopyTexImage2D() が非常に遅いことがわかります。必要な処理をすばやく実行するには、FBO への添付ファイルとしてテクスチャに直接レンダリングします。これは、OpenGL ES 2.0 または 1.1 (拡張機能付き) で実行できます。この記事では、次のように詳しく説明しています。

http://processors.wiki.ti.com/index.php/Render_to_Texture_with_OpenGL_ES
于 2013-08-14T18:54:15.667 に答える