もんしょの巣穴blog

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
  1. --/--/--(--) --:--:--|
  2. スポンサー広告

[UE4] マテリアルノードの解説 補足の1

今回はちょっとした補足説明です。
まあ、単純に自分がはまった部分と、ちょっとした便利機能紹介です。

前回、VertexNormalWSとPixelNormalWSは基本的に同じである、と解説しました。
…あれは嘘だ。
いやまあ、嘘というとちょっと語弊があるんですが、以下の画像をご覧ください。

ue134.jpg

このマテリアルはフレネル反射をEmissive Colorとして出力するだけのマテリアルです。
フレネル反射というのは視線と法線が直角に近いほど1.0に、水平に近いほど0.0になるような値を求める計算式です。
まあ、実際にはそういう意味ではないのですが、とりあえずそんな感じのものとここでは認識しておいていただければOKかなと。
上の画像では計算する際の法線をPixelNormalWSで行っています。

では、以下の画像はどうでしょう?

ue135.jpg

この画像ではVertexNormalWSを使っていますが、プレビューではポリゴンの境目が見えてしまってガタガタしているようになってしまっています。

なぜこのようになるのかというと、VertexNormalWSは空間中の頂点法線ではあるのですが、ピクセルシェーダで取得する際に正規化が行われていないのです。
頂点シェーダで変換された頂点法線はピクセルシェーダに入ってきた際に補間されることになるのですが、ピクセルシェーダに入る際の3次元ベクトルの補間は単純な数値の補間になってしまいます。
例えば、ある頂点の法線が(1.0, 0.0, 0.0)で、もう1つの頂点の法線が(0.0, 1.0, 0.0)だとします。
この2つの中間の法線ベクトルは(0.7071, 0.7071, 0.0)が正しいのですが、単純な数値の補間では(0.5, 0.5, 0.0)になってしまうのです。
これでは長さ1.0のベクトルにはならないので、計算結果が変わってしまうのは仕方ないんですね。

ではどうすればいいか、というと、答えは簡単で頂点法線を正規化すればいいのです。

ue136.jpg

これで結果がPixelNormalWSの時と同じになりましたね。

続きにはちょっとした便利機能の紹介ですが、割とマジで便利なので覚えておいて損はありません。

[[UE4] マテリアルノードの解説 補足の1]の続きを読む
スポンサーサイト
  1. 2014/07/19(土) 01:19:31|
  2. UE4
  3. | トラックバック:0
  4. | コメント:0

[UE4] マテリアルノードの解説 その2

マテリアルノード解説第2弾はテクスチャ関係をやりましょう。
カテゴリとしては、Coordinates、Textureと他一部って感じです。

前回やったMathカテゴリと併せて利用すれば、大半の表現はできるようになると思います。
テクスチャをサンプリング(UV座標からテクスチャのカラーなどを取得する行為。テクスチャフェッチなどとも)するのはマテリアルの基本です。
Playstation、SegaSaturnなどの時代ではまだテクスチャを貼らずにポリゴンカラーだけで表現されるゲームもありましたが、PS2時代にはさすがに全滅していた…と思います。
PS時代ですらほとんどなかったはずですが、確か有名な『修羅の門』ではキャラクタにテクスチャが貼られてなかった記憶があります。

では、進めていきましょう。

[[UE4] マテリアルノードの解説 その2]の続きを読む
  1. 2014/07/13(日) 14:42:02|
  2. UE4
  3. | トラックバック:0
  4. | コメント:0

[UE4] マテリアルノードの解説 その1

微妙に需要がありそうなので今回から何回かに分けてマテリアルノードの解説を行っていこうと思います。
特によく使うマテリアルノードの解説を行いますので、あまり使わないものは軽い解説で済ませるか、悪い場合はスルーします。

各ノード解説の前に、少しばかりわかりにくい部分を少しでも明確にしておこうと思います。
それは、マテリアルで利用する数値です。
Blueprintでは数値は整数、小数点数、ベクトルなどがそれぞれ明確に別の型として存在しています。

ue113.jpg

出力ピンの色が明確に違うのがわかりますよね。
しかし、マテリアルノードではこのような違いが存在しません。

ue114.jpg 

マテリアルによって生成されるシェーダは、この辺の処理が明確な場合はコンパイラが勝手にそれっぽい計算をしてしまいます。
例えば、float4のvectorValueとfloatのfloatValueがあったと仮定し、これを加算した場合、結果は以下のようになります。

resultValue = {vectorValue.x + floatValue, vectorValue.y + floatValue, vectorValue.z + floatValue, vectorValue.w + floatValue};

ちなみに、明確でない場合はコンパイラがエラーを返します。
実際、UE4のマテリアルでも明確ではないと判断されるものについてはエラーが出ることがあるようですね。
LinearInterpolateのAlphaピンにfloat4を入力したりするとエラーが出ますね。

まあ、この辺は慣れないとほんとにわかりにくいかと思います。
シェーダに慣れてない方は、とにかくやってみてエラーが出たらエラーの内容に従って修正を行う、という形で対応するしかないように感じます。
これを機にシェーダコードを書いてみる、ってのもありかとは思いますが。

では、本題のノード解説に進もうと思います。
今回はMathカテゴリのノードの中で、特によく使うものを解説しようと思います。


[[UE4] マテリアルノードの解説 その1]の続きを読む
  1. 2014/07/09(水) 21:37:50|
  2. UE4
  3. | トラックバック:0
  4. | コメント:0

プロフィール

monsho

Author:monsho
ゲームプログラマ?

最近の記事

最近のコメント

最近のトラックバック

月別アーカイブ

カテゴリー

ブロとも申請フォーム

この人とブロともになる

ブログ内検索

RSSフィード

リンク

このブログをリンクに追加する

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。