3

マーチングキューブアルゴリズムを使用して生成されたサーフェスに2次元テクスチャ(単純な画像)を適用する必要があるプログラムがあります。私はジオメトリにアクセスでき、比較的簡単にテクスチャ座標を追加できますが、座標を生成する最良の方法は私を避けています。

ボリューム内の各ポイントは単一のデータユニットを表し、データの各ユニットは異なるプロパティを持つ場合があります。物事を単純化するために、私はそれらを「タイプ」に分類し、各タイプにテクスチャ(または単一の大きなテクスチャアトラスの一部)を割り当てることを検討しています。

私の問題は、適切な座標を生成する方法がわからないことです。タイプのテクスチャの場所をタイプクラスに保存して使用することはできますが、シームがひどく引き伸ばされます(2つの隣接するポイントがアトラスの異なる部分を使用している場合)。可能であれば、縫い目のテクスチャをブレンドしたいのですが、それを行うための最善の方法がわかりません。ブレンディングはオプションですが、何らかの方法で頂点にテクスチャを付ける必要があります。ジオメトリをタイプごとにパーツに分割したり、テクスチャリングの目的で頂点を複製したりすることは可能ですが、望ましくありません。

可能であればシェーダーの使用を避けたいのですが、必要に応じて、頂点シェーダーやフラグメントシェーダーを使用して、テクスチャのブレンドを行うことができます。シェーダーを使用する場合、それがテクスチャまたはサンプリングする部分であると判断する最も効率的な方法は何でしょうか。タイプをパラメータに渡すのが最も簡単な方法のようですが、時間がかかる可能性があります。

私のボリュームは比較的小さく、各次元で8〜16ポイントです(生成を高速化するためにボリュームを小さくしていますが、特定の時間に多くの画面が表示されます)。等値面をボリュームの2倍の解像度にすることを簡単に検討したので、各ポイントにはより多くの頂点(理論的には8)があり、テクスチャリングが簡素化される可能性があります。ただし、それによってブレンドが簡単になるとは思えません。

サーフェスを作成するために、OpenGL用の視覚化ライブラリとそのマーチングキューブおよびボリュームシステムを使用しています。ジオメトリをうまく生成しました。テクスチャを作成する方法を理解する必要があります。

これを効率的に行う方法はありますか?もしそうなら、何ですか?そうでない場合、ボリュームのテクスチャリングを処理するためのより良い方法のアイデアを誰かが持っていますか?

編集:注意してください、テクスチャは単に色のグラデーションではありません。それは実際にはテクスチャであり、通常はパターンがあります。したがって、それをマッピングすることの難しさ、グラデーションは些細なことだったでしょう。

編集2:問題を明確にするために、いくつかの例を追加します。彼らは物事を混乱させるかもしれないので、明確な事実以上のすべてを考慮し、可能であればこれらを助けてください。

私のジオメトリは常にキューブになっています(キューブにロード、生成、保存されます)。形状が可能な解決策に影響を与える場合は、それだけです。

地形に対して行われるスプラッティングと同様の手法で、パターンや色(ポイントの「タイプ」に応じて固有のもの)で構成されるテクスチャをジオメトリに適用する必要があります(ただし、これは地形ではないため、同じ手法を使用できるかどうかわからない)。

シェーダーはすばやく簡単な解決策ですが、前述したように、可能であればシェーダーは避けたいと思います。主に互換性と開発時間のわずかな増加のために、固定機能パイプラインで使用できるものが望ましいです。わずかな増加にすぎないため、必要に応じてシェーダーとマルチパスレンダリングを使用します。

他に説明が必要かどうかはわかりませんが、必要に応じて質問を更新します。

4

4 に答える 4

2

質問のテクスチャの組み合わせの部分について:

3Dテクスチャを調べましたか?マーチングキューブについて話しているので、ボリュームテクスチャについては明示的に話しているのではないことをすぐに言う必要があります。代わりに、すべての2Dテクスチャを3Dテクスチャにスタックします。次に、各テクスチャ座標を2D位置にエンコードし、3番目の座標として参照するテクスチャをエンコードします。テクスチャが一般的に、あるタイプのパターンから別のタイプのパターンに移行するために仲介者を経由する必要があるタイプである場合に最適に機能します。

明らかな使用例は、単純な高さマップへのテクスチャマッピングです。上に雪のテクスチャ、下に岩のテクスチャ、下に草のテクスチャ、下に水のテクスチャがある場合があります。水を参照する頂点が雪を参照する頂点の隣にある場合、ジオメトリの塗りつぶしが岩と草のテクスチャを遷移することは許容されます。

別の方法は、添加剤混合を使用して複数のパスでそれを行うことです。テクスチャごとに、そのテクスチャを使用するすべての面を描画し、あるテクスチャから別のテクスチャに切り替わるすべての面に広がる透明にフェードを描画します。

デプスバッファを完全に描画して準備し(カラーマスクをすべて設定して、カラーバッファへの変更を拒否する)、GL_EQUALデプステストに切り替えて、デプスバッファへの書き込みを無効にして再度描画することをお勧めします。まったく同じ変換でまったく同じジオメトリを描画すると、精度と精度の問題に関係なく、まったく同じ深度値が生成されます。問題がある場合は、glPolygonOffsetを使用してください。

座標部分:

人気のある簡単なマッピングは、円筒形、ボックス、球形です。形状が円柱、ボックス、または球によって囲まれ、サーフェスポイントからテクスチャ位置へのマッピングが明確に定義されていることを概念化します。次に、シェイプの各頂点について、その頂点から開始し、境界ジオメトリにぶつかるまで法線に従います。次に、境界ジオメトリのその位置にあるテクスチャの位置を取得します。

マーチングキューブ法の後で法線が明るくならない傾向があるという潜在的な問題があると思いますが、私よりもその問題についてもっと知っていると思います。

于 2010-11-03T21:48:05.143 に答える
1

これは難しい問題です。

最も簡単な方法は、3Dテクスチャマップを使用して問題を完全に回避することです。特に、等値面ジオメトリにランダムなサーフェスの詳細を追加するだけの場合はそうです。シェーダーに実装されたパーリンノイズベースの手続き型テクスチャは、これに非常に適しています。

難しい方法は、2Dテクスチャ空間とある意味で最適な(歪みが最も少ない)3Dジオメトリの表面との間のマッピングを生成することを目的とした、等角テクスチャマッピング(等角表面パラメータ化とも呼ばれます)のさまざまなアルゴリズムを調べることです。この論文にはいくつかの良い写真があります。ジオメトリのトポロジが非常に重要であることに注意してください。等角写像を生成して、脳のような閉じた表面にテクスチャをマッピングするのは簡単です。カット/ティア/ジョインを導入する必要がある高のオブジェクトでは、かなり複雑になります。

于 2010-11-04T00:46:37.797 に答える
0

BlenderのようなツールでメッシュのUVマップを作成して、それがどのように行われるかを確認することをお勧めします。私があなたの問題を理解しているなら、あなたは固体のボリュームと(連続的な)色を定義する3Dフィールドを持っています。ボリュームからメッシュを作成しました。次に、連続色空間から抽出されたテクセルを使用して、メッシュを2DテクスチャにUVマッピングする必要があります。ツールでは、3Dメッシュに「継ぎ目」を定義します。これを切り離して、メッシュ全体を平らに配置してUVマップを作成できます。継ぎ目のテクスチャにエイリアシングがある可能性があるため、メッシュをレンダリングすると、それらの継ぎ目でも不連続になります(つまり、三角ストリップはテクスチャの不連続であるため、継ぎ目を越えることができません)。

メッシュを平坦化するための形式手法はわかりませんが、継ぎ目に沿ってメッシュを切断し、全体を平面にドロップするばね/拘束システムとして扱うことを想像できます。私はすべて物事を難しい方法で解決することについてです。;-)

于 2010-11-03T20:19:46.320 に答える
0

テクスチャリングの問題と私が持っているいくつかの制約のために、ジオメトリを構築し、サーフェスを生成するときにテクスチャリングを直接処理する別のアルゴリズムを作成することを選択しました。マーチングキューブよりもやや滑らかではありませんが、プロジェクトで機能する方法でtexcoordsを適用できます(少し高速です)。

マーチングキューブのテクスチャリング、またはテクスチャのブレンドに興味がある人にとって、Tommyの答えは非常に興味深いテクニックであり、timdayに投稿されたリンクは、テクスチャリング用のメッシュを平坦化するための優れたリソースです。両方の回答に感謝します。うまくいけば、他の人にも役立つでしょう。:)

于 2010-11-07T19:03:00.537 に答える