三次表面に垂直な表面の向きを決める方法


7

当面の質問は、HLSLでは、UV空間で生成されたサーフェス法線をどのように方向付けて、立方体の面に適用できるようにするかです。

全体的なプロジェクトは、手続き型の惑星ジェネレータを構築しようとしているということです。私は、各面が四分木である球に投影された立方体を使用しています。中間プロジェクトは、地形の法線マップを生成することです。私がこれを行う(そして私が何をしているかを理解する)ための最良の方法は、最初にキューブバージョンの法線を生成し、次に変換を実行してこれらの法線を球にワープすることです。

理想的には、この方法では、私が作業している面に基づいてコードを分岐する必要はありません(つまり、キューブの上面にいる場合、U = XおよびV = Y)。言い換えれば、私が望んでいるのは、「ああ、地形の法線に立方体の面の法線と何とか何とか何とか何とか」のドット積を掛けるだけのような数学の魔法です。

10/9/20 ETA:

平面の法線を計算する方法を知っています。私のその後の問題は2つあります。

  1. 法線マップを回転させて、立方体の各面で正しく方向付けするにはどうすればよいですか?
  2. 球をラップするようにフラット法線マップをワープするにはどうすればよいですか?

ヤコビ行列を使用するソリューション1つ見つけましたが、それを機能させることができません。すべての法線がまっすぐ上を向いている場合(つまり、平面)でも、ヤコビアンを含むHLSLコードは照明を完全に乱雑にします。そのため、ソリューションの実装を信頼できなくなります。


地形の法線に3x3の行列を掛けます。キューブの面ごとに異なりますか?
ムーンシャドー

他の種類のキューブマッピングの場合と同様に、センターからサーフェスへのベクトルを、キューブにぶつかるまで延長しませんか?または、ここで何か不足していますか?
drxzcl

この質問は、直接ゲーム開発に関連していない、あなたが最も可能性の高いスタックオーバーフローで、より良い答えを得るでしょうstackoverflow.com
Ricket

これはゲーム開発の大部分を占めるリアルタイムグラフィックスに関係するので、関連性があると思います。
BigSandwich

それはプログラミングではなくグラフィックです。だからここでいいですね。そして、月影、ラニエリ:彼らは答えとして上手くやらないのですか?
共産主義者の鴨

回答:


3

法線は接線空間にある必要があります。これにより、接線空間を作成できる任意のサーフェスにそれらを適用できます(球の場合は簡単です)。基本的に、法線マップは、法線が表面。接線空間は、おそらくヤコビ行列で取得しようとするものです-球体の場合、点の法線と2つの垂直ベクトルを使用して、任意の点に接線空間座標系を作成できます-それらを一貫して方向付けます(たとえば、uとvに沿って)これで完了です。次に、入射光ベクトルを接線空間(またはその逆)に変換し、新しい法線で照明します。利点は、法線マップが、接線空間とUVマッピングが定義された任意のオブジェクトで機能することです。

立方体では、各面の接線空間は単にその面自体です(つまり、たとえば法線-Zを持つ面があり、接線空間が+ Yの場合、マップする行列を使用してその法線を回転させるだけです) -Zから+ Y)


私は接線空間とは何かの漠然とした半分の概念を持っていますが、私はあなたのアドバイスをどう受け止め、それを使って何をするかわかりません。しかし、それはおそらく完全に私のせいです。2番目の段落については、HLSLで分岐コードを実行しないようにしようとしていました。私のアマチュアの理解では、分岐コードはHLSLで非常に悪いことだと言っているからです。それは避けられないかもしれないようですが。
Klay

分岐はありません。各面に法線マップの立方体があると思います。これで、基本的にこの立方体を球体に展開します。最も簡単な方法は、立方体の中に球体を配置し、立方体に対して光線をトレースして、法線を曲げることです。法線周波数が球面で均一(つまり、立方体面で不均一)であると想定すると、球のすぐに使用できる法線マップが得られます。なぜあなたはその立方体を持っているのかまだ分かりませんが?すぐに球を動かせませんか?
Anteru 2010年

私がキューブマップを使用している理由は、球体の表面自体でLOD計算を行うよりも、球体にマッピングされた6つの四分木を使用して詳細レベルのレンダリングを実行する方がはるかに簡単だからです。
Klay

また、「一貫した方向に向けるだけ」と答える部分は、問題の核心である可能性があります。[if cubeFace == top、then u = x and v = z ...]などに頼らずに、UV座標を6つのキューブ面に一貫して向ける方法がわかりません。これにより、分岐が発生します。 mについて話します。しかし、オールインオールまだプロセス全体を視覚化することはできません。こんなに密度が高くてすみません。
Klay

0

「私は平らな表面の法線を計算する方法を知っています。」正確にどのようにしていますか?私の知る限り、球体サーフェスにUVを正しくマップする以外に、球体にマップするために何もする必要はありません。テクスチャ自体は「フラット」であるため、法線マップは常に「フラット」平面にあります。法線マップを適用するオブジェクトの形状は重要ではありません。


アルゴリズムは、周囲のポイントをサンプリングし、勾配を乗算(または内積?)して、勾配に垂直なベクトルを取得します。少なくとも、それは私の漠然とした記憶です。私は仕事中なので、ATMを確認できません。
Klay

また、あなたを正しく理解している場合、ライティングを正しくするために、球の曲率を法線マップ自体に「焼き付ける」必要があるようです。繰り返しますが、非常に密集していることをお詫び申し上げますが、ある種の図や疑似コードが役立つ場合があります。
クレイ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.