3

シェーダーを使用してレンダリングされた情報を選択するための最良の方法を見つけようとしています。ウィンドウマネージャバッファ(ウィンドウ)は、レンダリングの出力に使用されます。ユーザーイベントでは、レンダリングされたジオメトリを選択する必要があります。gluPickの使用は簡単ですが、シェーダーのみを使用して選択しようとしています。

シェーダーの柔軟性は、正しい解決策を見つけるのに役立ちません。私は次の解決策を見つけました:

  • システムが提供するバッファを使用したレンダリング(実際には色を使用)。glScissorを使用して特定の領域でのレンダリングを制限し、glReadPixelsを使用して色をフェッチし、ジオメトリ識別子でマップします
  • 別のフレームバッファオブジェクトを使用してレンダリングします。レンダーバッファフォーマットを定義する必要があります。たぶん、名前を付けるために単純な整数を使用できますか?
  • レンダリングとピッキングの両方で、フレームバッファオブジェクトを使用してレンダリングします。レンダリングされた名前を含む追加のrenderbufferオブジェクト。

ウィンドウバッファを変更せず、ジオメトリ名を指定するカスタムの方法を定義できるため、2番目のソリューションが最適のようです。

なにか提案を?

PS:

フラグメントシェーダーでは、フラグメントデータを定義するためにvec4の配列を宣言しているので、サイズの整数の内部形式で格納されたRコンポーネントのみを持つレンダリングバッファーを保持するフレームバッファーを設定するにはどうすればよいですか?

フラグメントシェーダーの出力変数を特定のアタッチされたレンダーバッファーにリンクすることは可能ですか?

4

1 に答える 1

3

シェーダーが実際にここで役立つかどうかはわかりませんが、複数のターゲットにレンダリングして1回のパスでピッキング値とカラー値を生成できる最適化の形式を除いては。

ラスタライズを使用してピッキングを実行している場合は、常にglReadPixels()呼び出しまたは同等のものでスタックし、基本的に、ピッキング値を使用してシーンをある種のバッファーに描画します。

本当にクリエイティブになり、標準から逸脱したい場合は、シェーダーを使用して、シーン内のシェイプと光線の交差を実行してみてください。これには、かなりの特殊なシェーダー開発が必要であり、多くのピッキング(レイトレーサー?)を行わない限り、メリットを確認するのは困難です。

于 2010-02-06T05:28:18.560 に答える