0

3D 三角形メッシュと、メッシュをレンダリングできる OpenGL フレームバッファがあるとします。

レンダリングされたピクセルごとに、そのピクセルにレンダリングされた三角形のリストを作成する必要があります。

これを行う唯一の方法は、メッシュから各三角形を個別にレンダリングし、フレームバッファー内の各ピクセルを調べて、三角形の影響を受けているかどうかを判断することです (深度バッファーまたはユーザー定義のフラグメントシェーダー出力変数を使用) )。次に、フレーム バッファをクリアし、次の三角形に対して同じことを行う必要があります。

これを行うより効率的な方法はありますか?

フラグメント シェーダーの各フラグメントに対して、三角形の識別子を書き出すことを検討しましたが、GLSL では整数のリストを出力できません。

4

1 に答える 1

1

レンダリングされたピクセルごとに、そのピクセルにレンダリングされた三角形のリストを作成する必要があります。

シーン全体でそれを行うことはできません。「リスト」をすべてのピクセルに関連付けることができる構造はありません。

選択バッファを使用して、特定の領域に影響を与えたプリミティブのリストを取得できます (「 」を参照glRenderMode(GL_SELECT))。

ステンシル バッファー手法を使用して、シーン深度の複雑さを得ることができます。

合計 8 つの三角形がある場合、ステンシル バッファーを使用してすべてのピクセルに影響を与えた三角形のリストを取得できます (基本的に、一意の (1 << n) ステンシル値を各三角形に割り当て、すべてのステンシル OP の既存のステンシル バッファー値と OR します)。 )。

しかし、一般的なケースで解決するには、独自のラスタライザーと、ピクセルごとの三角形リストを保存するための大量のメモリが必要です。結局のところ、問題は多層深度バッファと非常によく似ています。

これを行うより効率的な方法はありますか?

実際にはそうですが、ハードウェア アクセラレーションではなく、OpenGL はそれを行うものではありません。ラスタライズされたすべての三角形を OCT ツリーに格納します。テストするすべてのピクセルに対してその OCT ツリーを介して「レイ」を起動し、このレイがヒットする三角形をカウントします。それが衝突検出の問題です。

于 2012-05-04T18:07:52.983 に答える