2017-12-06 30 views
0

私はすべてのvertsをsin波で動かすシンプルなシェーダを書こうとしています。法線を再計算するには?

v.vertex.y += sin(_Time.y * _Speed + v.vertex.x * _Amount * v.vertex.z) * _Distance; 

問題は、それらを移動した後、法線が間違っているため、リアルタイムの影がないことです。私は多くを検索し、偽の隣人を使って法線を再計算する必要があることを発見しました。 Unity Shaderlabの実装はありませんでしたので、それらをコピー&ペーストするだけで済むわけではありません。シェーダコードの知識はかなり基本的なものなので、私が見つけたものを必要なものに変換することはできません。

頂点を移動した後で法線を再計算する方法と方法を教えてもらえますか?

答えて

-1

これを自分でやっていないのですが、ちょっとやりましたが、法線を逆転させるのに、this shaderが見つかりました。これは、頂点情報を微調整することでこれを行います。

void vert(inout appdata_full v) { 
     v.normal.xyz = v.normal * -1; 
    } 

あなたは他の変更オフに基づいて、法線方向を再計算し、同様の方法でそれを更新するために、あなたのシェーダを微調整することができるはずです。

+0

お試しいただきありがとうございます。しかし、残念ながらそれは私が達成する方法が分からない部分です:( – Al3x

+0

@ Al3xどちらの数値を使うか分かりません。 – Draco18s

1

通常の計算の背後にある計算はクロス積です。

三角形から頂点A、B、Cを取ります。次にベクトルABとACを作成します。 ABxACはあなたに三角形の法線を与えます。 ACxABは逆の法線を与えます(ABxAC = - ACxAB)。

en.wikipedia.org/wiki/Cross_product

あなたはメッシュクラスからメッシュを移動した場合、RecalculateNormalsがあります。しかし、シェーダで作業するときは、ここでは当てはまりません。

+0

正確には、私が失敗する部分はこれらの "偽の"隣人を作り、 幸いなことに、モバイルでは十分な効果と超パフォーマンスを実現できました。私がしたのは、シャドウを完全に破棄してシンプルなテクスチャを作成することでした。それは動くのを見て、それは見事に良いと私は影を扱う必要はありません(私は携帯電話をターゲットにしているので) – Al3x

+0

偽の隣人、私は2つのベクトルと仮定します。あなたが選ぶものではなく、どちらかの頂点が両方のベクトルの開始頂点であることだけが重要です。 – Everts

1

表面の法線ベクトルは、その派生語に関連しています。正弦波の場合、その微分はちょうど余弦波ですcos()です。両方とも、sincos()と呼ばれる1回の操作で効率的に計算できます。

完璧な導入練習:)両方をプロットし、relationshipを観察します。

Evertsによる前回の回答は、通常はシェーダではない隣接する頂点にアクセスするときに機能します(ただし、CPU上では問題ありません)。

関連する問題