0

私は現在、プロジェクトにシルエットアルゴリズムを実装しようとしています(Open GLESを使用して、モバイルデバイス、現在は主にiPhone用です)。要件の1つは、3D線のセットを描画することです。デフォルトのOpenGLラインの問題は、太い場合(ギャップが表示される)に角度を付けて接続できないことです。他の微妙なアーティファクトも明らかであり、線の視覚的な魅力を損ないます。

今、私はこれの代わりにある種のクワッドストリップを使用することを検討しました。ただし、画面スペースにクワッドストリップを描画するには、何らかの可視性の検出が必要です。実際の3Dワールドで隠されている線は表示されないはずです。

この問題には多くのアプローチがあります。つまり、定量的な不可視性です。しかし、このようなアプローチは、特に処理能力が制限されたモバイルデバイスでは、レイキャスティングを採用する必要があることを考えると、効率的に実装するのは困難です。もう少し見てみると、この論文を見つけました。この論文では、このような効果を実現するためにzバッファサンプリングを使用するためのいくつかの方法について説明しています。しかし、私はこの分野の専門家ではなく、技術の背後にある理論はある程度理解していますが、実際の実装方法がわかりません。OpenGLES側で、誰かが私をもっと技術的なレベルでここに案内してくれるかどうか疑問に思っていました。また、一般的な3Dラインの可視性に関する提案も受け付けています。

4

2 に答える 2

0

私はiPhone4Sでうまく機能するソリューションを考案しました(他のデバイスではテストされていません)。これは、ワールドスペースクワッドをレンダリングするというアイデアに基づいて構築されており、すべてGPUでシルエット検出を実行します。それはこれらの線に沿って機能します(しゃれは意図されていません):

  • エッジ情報を生成します。これは、メッシュ内のエッジ/「ライン」のリストで構成され、それぞれについて、エッジの両側のトリスを表す2つの法線を関連付けます。
  • これは、GPUにアップロードされるクワッドのセットに処理されます。各クワッドはエッジを表します。各クワッドの各頂点には、3つの属性(vec3)、つまりエッジ方向ベクトルと2つの隣接する3つの法線が付随しています。すべてのクワッドは「厚さ」なしで渡されます。つまり、両端の頂点は同じ位置にあります。ただし、エッジ方向ベクトルは、同じ位置にある各頂点で反対になります。これは、必要に応じて、それらが反対方向に押し出されてクワッドを形成することを意味します。
  • 各トライノルムとビューベクトルの間で2つの内積を実行し、それらが反対の符号を持っているかどうかを確認することにより、頂点が頂点シェーダーの可視エッジの一部であるかどうかを判断します。(詳細については、ネット周辺の標準的なシルエットアルゴリズムを参照してください)
  • 可視エッジの一部である頂点の場合、エッジ方向ベクトルとビューベクトルの外積を取り、画面指向の「押し出し」ベクトルを取得します。このベクトルを頂点に追加しますが、一定の厚さのクワッドを作成するために、投影された頂点のw値で除算します。

これは、隣接するエッジ間に表示される可能性のあるギャップを直接解決するものではありませんが、これに対抗する場合ははるかに柔軟です。1つの解決策には、大きな角度の付いた線の間の頂点を別のクワッドでブリッジすることが含まれる場合があります。これについては、現在調査中です。

于 2012-10-04T04:12:17.157 に答える
0

Zバッファを使用する手法は、iOSデバイスには複雑すぎます。重いピクセルシェーダーが必要であり、(IMHO)視覚的なアーティファクトが発生します。

モデルが複雑でない場合は、実行時に幾何学的なシルエットを見つけることができます。たとえば、ポリゴンの法線を共通のエッジと比較することで、ビュースペースの方向のz値の符号が異なる場合(1つの法線がカメラに向けられ、もう1つがカメラからのもの)。このエッジはシルエットに使用する必要があります。

もう1つのアプローチは、より「FPSフレンドリー」です。モデルの押し出しバージョンを維持します。そして、最初に押し出されたモデルをシルエットの色(テクスチャと照明なし)でレンダリングし、その上に通常のモデルをレンダリングします。頂点用により多くのメモリが必要になりますが、リアルタイムの計算は必要ありません。

PS:すべてのゲームで、シルエットは幾何学的でした。

于 2012-06-26T06:28:37.720 に答える