しゅみぷろ読者になるしゅみぷろプログラミングとかこの広告は、90日以上更新していないブログに表示しています。Graphicsはじめにesprog.hatenablog.com以前の記事で、ハイトマップを参照して動的に変形するオブジェクトのサンプルを作りました。サンプルでは、シェーディング計算が適当でしたが、今回はちゃんとシェーディングを行うために必要になる法線情報を計算してみます。計算が必要なのか以前の例ではハイトマップに高さの情報を書き込みそれを元にして頂点を移動させていますが、シェーダー内で変形させているだけで、頂点の持つ法線方向には書き込みを行っているわけではありません。変形させているにも関わらずCPUから送られてくる法線データには変化がありません。法線データへの書き込みが必要なら、ハイトマップの変更のときに法線マップにも変更を加える・・・というちょっと面倒な手順を踏む必要があります。今回は、ハイトマップから法線がどの方向を向いているのかを計算させることにします。この方法であれば法線マップが必要なくなる上、計算ミスなどによるデータの齟齬も防げます。形状の変形と、それによる法線の変化をテストした例です(本来なら青っぽい色が表示されるのですが、目に優しくないのでちょっといじってます...ということにしておいてください...)。元々の形状はただのPlane(板)ですが、とりあえずハイトマップだけ与えて変形させ、黒い四角形(プレイヤーの操作するキャラクターを模したもの)の歩いた場所を凹ませています。形状が変化しても法線情報が正しく得られているかと思います。計算方法ハイトマップのテクスチャ座標のx,yに関する高さの偏微分を取ることで、接ベクトルを求めます。求めた接ベクトルの外積の方向ベクトルが法線になります。コードはこんな感じになります。0.5;_ParallaxMapがハイトマップ、_ParallaxMap_TexelSizeのx、yはそれぞれハイトマップのテクスチャサイズの横、縦サイズの逆数。_ParallaxScaleはハイトマップによる変位の係数、_NormalScaleFactorは法線方向を計算するのに使用する係数です。今回はハイトマップのx(赤色成分)から計算していますが、たとえば以下のような感じでrgbからいい感じにモノクロ抽出してそれを高さとして取ったほうが良いかもしれません。b;法線さえしっかり取れていると、テッセレーションなしでも割りとそれっぽく見えます。ちなみに法線を取ってきて、その法線情報を法線マップに書き込む場合、Textureの形式が問題になる場合があります。normal.x);#endif}といった感じで、書き込むための法線情報を変換する必要がありそうです。全部Uniteのせい。サンプルは上のリンクから。液垂れ表現についてです。雪が積もって高さがもとに戻っていくやつ書いた。)はてなブログをはじめよう!es_programさんは、はてなブログを使っています。ブログを報告する引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。