2012-02-11 4 views
13

私はMinobraftのようなエンジンを趣味のプロジェクトとして、現代のハードウェアとOpenGL> = 3のボクセルの地形のコンセプトをどれくらいまで押し込めるかを見ています。したがって、私のすべてのジオメトリは四角形正確。クワッド上の法線の双線形補間を行う方法は?

私はアンビエントオクルージョンを推定するためにレイキャスターを構築し、照明を行うために "ベントノーマル"というテクニックを使用しました。だから、私の法線は四辺に垂直でもなく、単位長もありません。むしろ、最小のオクルージョンが発生している空間におおよそ向いており、クワッドが光を受けていない場合はより短くなっています。この手法の利点は、オクルージョンの1回限りの計算が必要であり、レンダリング時に本質的に自由であることです。

しかし、スムーズなライティングを得るために同じクワッドの異なる頂点に異なる法線を割り当てようとすると、問題に遭遇します。

Diagonal lines visible in the rendered result

問題は、OpenGLが重心使用することである:クワッドを三角形に分割し、線形補間は、各三角形の上に発生しているので、補間の結果は、明らかに醜い対角線アーチファクトとして三角形の存在を示します4つのコーナーのうち3つ以上の加重和である各三角形に対する補間。理想的には、結果を計算する際に4つのコーナーすべてが使用されている双線形補間を使用したいと思います。

私はいくつかの回避策を考えることができます:2x2のRGBテクスチャに法線

  1. スタッフ、およびテクスチャプロセッサはバイリニア補間を行うことができます。これは、フラグメントシェーダのテクスチャルックアップを犠牲にして行われます。私はまた、効率のために、これらのミニテクスチャをすべて大きなものにパックする必要があります。

  2. 頂点属性を使用して、4つの法線すべてを各頂点に付加します。また、テクスチャ座標によく似た、いくつかの[0..1]係数を各頂点に付け、フラグメントシェーダで双線形補間を行います。これは私がこれらの技術の両方を動作させることができると思いますが、彼らははるかに簡単であるべき何かのためクラッジとして私を打つだけではなく、1

のシェーダに4面の法線を渡すのコストで起こります。多分私は法線を何らかの形に変換することができたので、OpenGLの補間によって使用された三角形分割に依存しない結果が得られるでしょう。

は(問題が法線に固有のものではないことに注意してください。それは色やスムーズクワッド間で補間する必要が他の値にも等しく適用可能である。)

を任意のアイデアこの問題にアプローチする方法を他の?そうでない場合は、上記の2つの手法のどちらが最善でしょうか?

答えて

4

明らかに分かるように、GLが行う三角補間は、あなたが望むものではありません。 したがって、通常のデータを頂点データから直接得ることはできません。

私が想像している解決策は、あなたが達成できる最高のものです。そして、あなたが選んだものであっても、頂点からシェーダーに[0..1]係数を渡す必要があります(2x2テクスチャを含みます。テクスチャ座標に必要です)。

プロセスをいくらか簡略化するためにいくつかのやり方がありますが、

  • 頂点IDを使用すると、頂点からフラグメントシェーダ([0..1]値)に渡す頂点「コーナー」を見つけるのに役立ちます。下位2ビットの単純なビットテストでは、実際の頂点データの入力なしで、どのコーナーを通過するかを知ることができます。テクスチャデータをパッキングする場合は、依然としてテクスチャ内に識別子を渡す必要がありますので、これは疑問に思うかもしれません。
  • 補間を許可するために2x2のテクスチャを使用すると、いくつかの問題がありますか?一部のテクスチャインターポレータは、ソースの精度が低い場合、必ずしも高精度の補間を行うとは限りません。これにより、テクスチャデータタイプをより高い精度に変更して、バンディングアーチファクトを回避する必要が生じる場合があります。
0

さて、ベント法法を使用する場合、結果を増やす最も良い方法は、メッシュをあらかじめテッセレーションし、高いテッセレーションを持つメッシュで再計算することです。

もう1つの方法は、ピクセルシェーダ内のいくつかのトリックです...一つの可能​​な方法 - 実際にピクセルシェーダで自分自身でテクスチャを補間できます(内蔵のインターポレータは使用しません)。そして、あなたは双線形補間だけに制限されません、あなたはもっとうまくいくかもしれません、F.e.バイキュービック補間;)

+0

できるだけ多くのブロックをプッシュアウトしようとしているので、メッシュ密度を上げたくありません。私は自分でテクスチャを補間する方法を知っていますが、もし私がそれを助けることができれば、私の法線をテクスチャに保存したくありません。 – Thomas

関連する問題