1

2D ジオメトリの輪郭を描くシェーダーを作成したいと考えています。OpenGL ES2.0 を使用しています。アウトラインはテクスチャに依存せず、遅すぎるため、コンボリューション フィルタを使用したくありません (テクスチャ ジオメトリを別のテクスチャにレンダリングしてから、コンボリューション シェーダで描画しようとしました)。また、2 つのパスを実行してみました。最初は 1 つの色でオーバースケールされたジオメトリを使用して oultine を表し、次に通常の描画を上に行いましたが、これにより太さが異なるか、アウトラインが整列しなくなります。セルシェーディングのシルエットがどのように行われるかを調べましたが、それらはすべて法線とライトを使用して計算されており、まったく使用していません。

私は物理学にBox2Dを使用しており、複数のフィクスチャを持つ「破壊可能な」オブジェクトを持っています。いつでもオブジェクトを分割 (フィクスチャを削除) することができ、アウトラインを新しいアウトター カウンターに合わせたいと考えています。フィクスチャの頂点、プリセット テクスチャ座標、および三角形を描画するためのインデックスに一致する頂点バッファーを使用して描画を行っています。フィクスチャが削除されると、インデックス バッファ内の関連付けられたインデックスが 0 に設定されるため、そこに三角形が描画されなくなります。次の図は、1 つのオブジェクトが完全に無傷の場合にどのように見えるかを示しています。赤い点は頂点の位置 (テクスチャリングは表示されていません)、黒い線はフィクスチャ、青い線は三角形の描画方法の分離を示しています。灰色のアウトラインは、どのような場合でもアウトラインをどのように見せたいかです。

1

この画像は、いくつかのフィクスチャを取り外した同じオブジェクトを示しています。

2

これを頂点シェーダーで (または他の単純な方法と組み合わせて) 行うことは可能ですか? どんな助けでも大歓迎です。

ありがとう :)

4

1 に答える 1

0

コーナーからわずかに差し込まれたこれらの厄介なポイントについて何かできると仮定します (たとえば、英語の読み順でポイントに番号を付け、最初が「1」である場合、ポイント 6 は 1 になります)...

ポイントが内部にある場合、それに接続されているすべてのポリゴン エッジを時計回りの順序でリストすると、シーケンス内のエッジの各ペアには共通のポリゴンがあります。2 つのエッジに共通のポリゴンがない場合、それは外部ポイントです。

任意の外部ポイントから始めて、最初に任意の方向に歩き、次にまだ訪れていない外部ポイントに接続するエッジに沿って全体のアウトラインを取得できます (または、それはちょうど歩いたエッジではありません)。今)。

既存のアウトラインから開始していくつかのパーツを削除すると、明らかに、以前は別の外部ポイントに接続されていたが、もう接続されていない外部ポイントから開始し、そこから別のポイントに到達するまで歩くことができます。

接続情報を取得できないため、ES のシェーダーでこのような処理を行うことはできません。


シェーダーでできる最善の方法は、サーフェスの法線に沿って頂点を外側に押し出してジオメトリを拡張することだと思います。データ構造が長方形のリストであり、それぞれが中心、幅、高さなどで記述されていると仮定すると、同じ中心でそれぞれを描画することで同じことを実現できますが、幅と高さにわずかな量が追加されます.

完全に一般化するには、頂点に法線を保存する必要がありますが、ジオメトリが削除されたときに法線を更新する必要もあります。そのため、CPU から新しい情報がプッシュされることもありますが、それは比較的限られています。

于 2012-10-12T02:51:55.027 に答える