0

現在、スナップショットを使用してピッキングを行っています。レンダリング コードを変更して、オブジェクト ID をレンダリングし、スナップショットを取得してから、ユーザーがタップしたピクセルの値を取得します。ただし、これは非常に非効率的だと思います-一部のiPadで速度が遅いという報告を受けています(私のミニは問題ありません)。

バックバッファにレンダリングし、glreadpixels の呼び出しを使用して、オブジェクト ID を画面にレンダリングせずに、ユーザーがタップしたピクセルのみを取得することは可能ですか? レンダリングに GLKView を使用しています。現在のコードで glreadpixels を試してみましたが、常に黒を返すようです。GLKView のドキュメントではスナップショットのみを使用することを推奨していることは知っていますが、単一のピクセルのみを取得することを選択する方が効率的であることは確かです。

4

2 に答える 2

1

おっしゃるとおり、オブジェクト ID をバック バッファーにレンダリングし、特定のピクセル (またはピクセルのブロック) を読み戻す方がはるかに優れています。

(多くの選択を行っている場合は、2 つ目のオフスクリーン レンダー バッファーを使用して、単一のレンダー パスでフレームごとにオブジェクト ID を生成することもできます。)

ただし、オフスクリーン レンダー バッファー、深度バッファーなどを割り当てるには、独自のビュー コードを記述する必要があります。GLKView は便利なクラスであり、高レベルのラッパーであり、Apple doco は、基礎となる実装を台無しにしないように明確に述べています。

独自の GL レンダー バッファーを設定することはそれほど難しくなく、サンプル コードが至るところにあります。Apple dev サイトと OpenGL SuperBible のサンプル コードを使用しました。

于 2013-09-25T23:06:31.637 に答える
0

実際、GLKView を使用しても、バックバッファから読み取ることは十分に可能です。ドキュメントには、推奨されていないと記載されていますが、少しいじった後、動作するようになりました。唯一の問題は、glreadpixels が引数として GL_RGBA (GL_RGB ではなく) しか使用できないことです。ピッキング後に glClear が確実に呼び出される限り、オブジェクト ID が画面にレンダリングされることはありません。

スナップショットを使用して iPad mini でピッキングを行うと、アプリの速度が 50% 低下しました。glReadPixels を使用しても、目立った速度低下はまったくありません。追加のフレームバッファを割り当てることでこれを行うことができますが、必要ではないと思います。

于 2013-09-27T06:38:56.183 に答える