問題タブ [glreadpixels]

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 投票する
0 に答える
789 参照

opengl-es - iOS で FBO がクラッシュする glReadPixels

FBO で glReadPixels を呼び出すと、断続的にクラッシュします。現在、ライブ アプリで 1 日あたり 1000 件以上のクラッシュが発生しています。

ピクセルを読み取って FBO を生成するためのコードを以下に含めます。必要に応じて、使用される他のコードを含めることができます。

クラッシュ ログは次のようになります (多少の違いがあります)。

0 投票する
0 に答える
776 参照

android - PBuffer からの読み取り時に glCopyTexImage2D が GL_RGBA で機能しない

OpenGL ES2 を搭載した Android で NDK を使用しています。

  1. 解像度 1024x576 の eglCreatePbufferSurface を使用して PBuffer サーフェスを作成します。GL_RGBA 形式を使用します。色成分ごとに 8 ビット。
  2. ビットマップからテクスチャをロードし、サーフェスにブリットします。glFlush() を呼び出します。
  3. 別のテクスチャを作成し、glCopyTexImage2D を使用してフレーム バッファをこのテクスチャに読み込むよりも。テクスチャの内部フォーマットは GL_RGBA です。
  4. 新しいテクスチャを同じフレーム バッファに再度ブリットします。glFlush() を呼び出します。
  5. 最後に glReadPixels を呼び出してフレーム バッファを読み取り、ビットマップとして保存します。

結果はピクセル化されます。
サンプル画像

すべてのテクスチャには次のパラメータがあります。

また、PBuffer の代わりにウィンドウ サーフェスを使用し、結果を画面に描画すると、正しく、ピクセル化されません。
私が試したもう 1 つのことは、元のテクスチャを PBuffer にレンダリングし、バッファからピクセルをすぐに読み取ることです。glCopyTexImage2D を使用した余分なパスなし。結果も正解。

glCopyTexImage2D 内部フォーマットを GL_RGBA から GL_RGB に変更すると、すべて正常に動作します。私の PBuffer 色空間形式は RGBA です。

更新:私のコードはエミュレータでは正常に動作するようですが、Nexus 7 デバイスでは動作しません。

glCopyTexImage2D を GL_RGBA 形式で使用すると、ピクセル化されるのはなぜですか?

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

opengl - glReadPixels または glCopyTexSubImage2D が遅すぎますか?

N パスを描画する必要があり、パスごとに fbo から 1 ピクセルを読み取りますが、パスごとに 1 ピクセルを読み取るには遅すぎることがわかりました。次に、別のテクスチャ (rectange:N*1) を使用してピクセルをキャッシュします。つまり、パスごとに 1 つのピクセルを結果のテクスチャにコピーします。N パス後、結果のテクスチャを 1 回読み込みます。ただし、TOO SLOW もあります。たとえば、結果のテクスチャ (200*1) を読み取るには、13 ミリ秒かかりました。

この問題を解決する別の方法があるかどうか疑問に思っています。

また、非同期で動作するピクセル バッファ オブジェクトに関するいくつかの投稿も解決しました。ただし、最後のパスが完了した後、すぐに結果テクスチャの結果が必要です。CPU と GPU の両方で動作するものは他にありません。

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

ios - マルチサンプリングを使用した iOS の glReadPixels

マルチサンプリングでフレームバッファからピクセルを取得しようとしています。ゼロのみを返します。ここここで提案されているように glResolveMultisampleFramebufferAPPLE を呼び出しますが、私の場合は何が問題なのかわかりません。

まず最初に、カラー アタッチメントを使用してマルチサンプリングされていないフレーム バッファを作成します。

次に、色と深度が添付されたマルチサンプル フレームバッファを作成します。

次に、フレームバッファをクリアします:

描画を行います (これは Cocos3D 描画コードです):

次にバッファを解決します。

次に、すべてゼロを取得します。

フレームバッファの作成に成功するため、2 つの gl チェックをスキップしました。私のコードのどこにエラーがありますか?

0 投票する
0 に答える
294 参照

opengl - PBO に (そしてそこからファイルに) レンダリングするように既存の opengl アプリケーションを変更しますか?

既存の OpenGL アプリケーションを変更して PBO にレンダリングし、PBO を読み取って、元々画面にレンダリングされる予定だったもののエンコードされたビデオを生成したいと考えています。パフォーマンスが重要であるため、以前のようにバックバッファーから glReadPixels を実行してパイプラインを停止させることはできません。レンダリングされたすべてのものをフレームバッファにリダイレクトし、代わりに PBO に移動させる単純または直接的な方法があるかどうか疑問に思っています。つまり、画面に表示されなくても構いません。実際のところ、画面に何も表示されない方がいいと思います。

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

android - AndroidでOpenGL ES 2.0で大きなテクスチャを(効率的に)保存する方法

これで、glReadPixels() を使用してフレーム バッファー (FBO) のデータを読み取ることで、テクスチャを保存できます。しかし、私は2つの問題に直面しました。

(1) 保存された画質を維持するために、ディメンションは GL_MAX_TEXTURE_SIZE (ほとんどのデバイスは 4096) よりも大きくなります。大きなテクスチャ (例: 4160x3120) を作成すると、glCheckFramebufferStatus() を呼び出すときに GL_FRAMEBUFFER_UNSUPPORTED エラーが発生しました...

(2) 小さなテクスチャ (例: 3648x2736) を作成した場合、glReadPixels() を除くすべての動作が非常に遅くなります....

私の質問に戻りますが、最大テクスチャ サイズの制限を克服して効率的に保存することは可能ですか? ありがとう。

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

android - 一部の Android デバイスで PBuffers を使用すると glReadPixels が失敗する

一部のopengl ESドライバーで問題に直面しています。Pbufferに対してglReadPixelsを呼び出すと、一部のデバイスはメッセージなしでアプリを強制終了します。他の人は私に次のトレースを提供し、アプリを強制終了する前に約 10 秒間フリーズします。

これまでのところ、問題が再現可能な影響を受けるデバイスは次のとおりです。

また、次のデバイスでコードをテストしましたが、期待どおりに正しく動作し、まったく問題はありません。

問題を再現する簡単なテスト機能をまとめました。多分誰かが問題を見つけることができます。これは単なるテスト方法です。バグをテストできるようにまとめただけなので、レビューは必要ありません。何か見逃した場合はお知らせください。

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

c++ - glreadpixels ステンシル バッファが常に GL_INVALID_OPERATION をスローする

ステンシルについて調べてみました。現在、ステンシル値でいくつかのボックスを描画し、値を読み取っています。GL_STENCIL_INDEX で glReadPixels を呼び出すたびに、GL_INVALID_OPERATION が返されます。問題のコードは次のとおりです。

5 つの異なるデータ形式、3 つの異なる glPixelStore モードを試し、glReadPixel エラーのリストを7 回確認しました。(はい、OGL 2.1) STENCIL_INDEX を DEPTH_COMPONENT に変更すると、正常に動作します。確認できないのは、ステンシル バッファーがあるかどうかだけです。不足している初期化や、それを確認するための glGet はありますか?

関連する可能性のある情報: Win7 x64 SP1 | ASUS GTX650Ti | VS2012 アルティメット

原因となっている場合に備えて、ボックスを描画する関数のコードを次に示します。

OGL が明らかな理由もなく間違ったことをしたのはこれが初めてではありませんが、これはインターフェースをコーディングするという私の計画を破ります。

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

android - android - Karthik の方法 (glReadPixels のハッキーな代替手段) により、adreno GPU で GraphicBuffer からピクセルを読み取ることができません。

7 月から、.avi、.flv などのビデオ ファイルを編集する Android アプリケーションを開発しました。FFMPEG と OpenGL ES 2.0 を使用して、このアプリケーションを実装しています。

「ぼかし」などのフィルター効果を CPU で実行するには計算量が多すぎるため、GPU と Shader を使用してビデオのフレームにフィルター効果を適用するために OpenGl ES 2.0 を使用することにしました。

私がやろうとしているのは、「シェーダーを使用してビデオのフレームにフィルター効果を適用し、フレーム バッファーに格納されているピクセルを取得する」ことです。

そのため、FrameBuffer からピクセルを取得するために使用できる glReadPixels のみの OpenGl ES 2.0 メソッドを使用する必要があります。しかし、多くの GPU 開発ガイドによると、glReadPixels の使用は推奨されておらず、ガイド ブックは glReadPixels を使用する場合の潜在的なリスクを警告しています。また、glReadPixels のパフォーマンスは、GPU のバージョンとベンダーによって異なります。glReadPixels を使用することを具体的に決定することはできず、GPU 計算の結果であるピクセルを取得するための他の方法を見つけようとしました。

数日後、Android GraphicBuffer を使用してピクセル データを取得するハックな方法を見つけました。

ここにリンクがあります。

このリンクから、Karthik の方法を自分のコードに試してみました。

唯一の違いは次のとおりです。

テクスチャとレンダー フレームを使用して Buffer を埋めます。私は 2 台のテスト用電話を持っています。1 台は Samsung Galaxy S 2 で、レンダラーは Mali-400MP です。もう 1 つは LG Optimus G Pro で、レンダラーは Adreno(TM) 320 です。Galaxy S2 は上記のコードと Karthik の方法でうまく動作します。しかし、LGスマートフォンの場合、いくつかの問題があります。

このリンクによると、

Android 4.2 より前の Qualcomm ハードウェアでは、Genlock という名前の Qualcomm 固有のメカニズムが使用されます。

GenLock に関連するエラーが表示されたのは私だけだったので、GraphicBuffer と Qualcomm GPU の間の問題を注意深く推測しました。その後、Gralloc.cpp、GraphicBufferMapper.cpp、GraphicBuffer.cpp、*.h のコードを検索して読み、これらのエラーの原因を見つけましたが、失敗しました。

私の質問は次のとおりです。

  1. GPU計算からフィルター効果を得るのは正しいアプローチですか? そうでない場合、非常に多くの計算を必要とする「ぼかし」のようなフィルター効果を取得するにはどうすればよいですか?

  2. Karthik の方法は Qualcomm GPU では機能しませんか? これらのエラーが Qualcomm GPU、Adreno でのみ発生した理由を知りたいです。

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

ios - glReadPixels を使用して Tap Point の値を読み取りますか? OpenGL 2.0 iOS

次のように定義された正方形があるとします。

そして、次の射影とモデルビューの行列を適用しています:

ユーザーが画面をタップしたオブジェクトのピクセルの色を読みたいと思います。次のように glReadPixels と組み合わせて glkMathUnproject を試していますが、glReadPixels はタップ ポイントに対して正しくない色の値を返します。

ピクセルの色を正確に取得する方法を教えてもらえますか?