デカールの実装


11

デカールに関する情報を見つけるのに問題があったので、この質問が他の人の役に立つかもしれません。この実装は、フォワードレンダラー用です。

デカールの実装が正しいかどうか誰かが確認できますか?

  • 共通空間での投影ボリュームを定義する任意の次元の立方体を定義します。定義されたキューブとの三角形の交差をチェックして、投影が影響する三角形を受け取ります。
  • これらの三角形をクリップして保存します。
  • 次に、マトリックストリックを使用して、投影するテクスチャを参照する保存された三角形のUV座標を計算します。
  • これを行うには、共通空間での立方体の高さ、幅、奥行きを表すベクトルを取り、左下隅が原点になるようにします。
  • これをi、j、kの単位ベクトルとして行列に入れ、立方体の移動を設定してから、この行列を逆にします。
  • 保存した三角形の頂点にこの行列を掛けます。これにより、UV座標として使用する0から1のサイズの立方体内の座標を取得できます。
  • このようにして、投影している元の三角形があり、それらのUV座標があります(UV座標は、投影しているテクスチャを参照しています)。
  • 次に、保存した三角形をシーンに再レンダリングすると、投影された画像で投影領域が上書きされます。

今、私が答えを見つけることができなかった質問。最後の点は正しいですか?私はソフトウェアクリッピングを行ったことがありませんが、精度に制限があるため、投影されたテクスチャに対してzファイティングが発生する可能性があるため、エラーが発生しやすいようです。また、UV座標を正しく取得する方法はありますか?


ここでは、リンクのリンクは次のとおりです。gamedev.stackexchange.com/questions/24653/...
ルイス・エストラーダ

回答:


5

この記事を見てください:

http://blog.wolfire.com/2009/06/how-to-project-decals/

彼はあなたが使用しているのとまったく同じアプローチを使用しているようです。彼はZファイティングについては触れていませんが、遠距離では間違いなく問題になる可能性があります。

私の提案は、Zファイティングが非常に目立つようになった場合、特定の距離の後でデカールを無効にすることです。


私はこの記事を複数回見たことがありますが、あなたが言ったように、私が尋ねていることについてまったく話していないということです、zファイティングは距離の問題ではありません。 '既存のジオメトリの真上にレンダリングしようとしていますが、精度が限られているため、正確に同じ場所にあるかどうかは
わかりません

1
デカールを描画するときは、デプスバッファ比較関数を常に「より小さい」ではなく「等しい」に設定することで、影響を受ける表面のすぐ上に常にデカールを描画できます。
jmegaffin 2013年

1

Zファイティングを解決するために行ったのは、デカールシェーダーで、頂点のZ値を画面座標に配置した後、少しだけバンプすることでした。

OK .....フィットしたメッシュデカールを使用しています。Yが地形上にあるメッシュnxnを作成します。コードを使用して、地形ポリゴンメッシュのYを見つけます。すべての変換後、既存のジオメトリの上に画面座標で描画しています。デプスバッファーは画面座標にあるため、デカールポリゴンのZを少し画面に向けて移動すると、Zの戦闘が停止します。これを行うことで、フィットしたデカールメッシュを構成するポリゴンの量を半分に減らしました。これは古い120コードです

 vec4 v = gl_ModelViewProjectionMatrix * gl_Vertex;
 v.z -= .03;
 gl_Position = v;

これがそれをよりよく説明することを願っています..(リクエストに応じて)

すべてワイヤーフレーム。

地形のみを配線します。


1
この回答は特に短く、具体的ではないようです。あなたの答えを明確にしてもらえますか?
Gnemlock 2017年

1
理解するのは難しいことではありません。Zの少しだけ頂点を画面空間に向けて移動します。OpenGLでは常に画面空間で正のZを見るので、Zの負を少し動かすとZの戦いが修正されます。ただし、これには問題があります。ズームアウトすると、zがデカールを必要以上に移動する可能性があります。修正は、目による頂点の距離に合わせてシフト量をスケーリングすることです。
Mike O
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.