<< TOP



XSI ICE活用 頂点カラー
:03 頂点カラーでランバート
このドキュメントは


  • XSIはそこそこ触れる
  • ICEというものがどういうものか大体わかる
  • ICEが気になっているのだけど、どこから入ったら良いかわからない
    といったアーティスト、デザイナさん向けに作られています。



頂点カラーでランバート編
最後にRTシェーダそのものを頂点シェーダに限ってしまうのですが、ICEを使って作ってしまおう編です。
注意が必要なのは、結局RTシェーダのGPUで処理している部分をICEにするとCPUでの処理になりますので、ほとんどの確立でGPUに比べ重いです。
RTシェーダの研究、勉強だったり、ICEの習熟のために試してみる程度をお勧めします。
ここでは拡散反射光の輝度計算に使われるランバートを構成していきます。

 1.データの準備
今回も頂点カラーを割り当てた球を用意します。
頂点も少し多めに割っておくと、シェーディングがきれいに見えて良いと思います。

Float(4バイト)に設定した頂点カラーをSet Dataで適用できる形のシーンを用意します。
 060


 2.ランバートシェーダ
RTシェーダにおけるランバートシェーダのディフューズ の輝度は、法線ベクトルとライトベクトルの内積によって求められます。
 061

計算式だと
L・N=|N||L|cosα
とあらわされますが、今回は特にこれは重要ではなく、
L・ N(エルドットエヌ)という計算が内積計算になるということです。
ドットというだけあって、ICEノードに実は Dot Product というものがあります。
たとえばCgシェーダでも内積は dot(
NormalVector,LightVector); と表記しますように、Dot Productノードは 2つの入力値間の内積を求めるためのノードです。
Math>Vector>Dot Product ・・・とたどります。
 062
そして、これに法線ベクトルと、ライトベクトルを接続していきます。

法線ベクトルは要はPointNormalのことなので、GetDataを使用して、今までの要領でPointNormalを直に接続できます。
※前のページまでにあるように、GlobalSRTをかけてワールド化しておくのを忘れないでおきましょう~。
 063

問題なのが、ライトベクトルです。
とりあえずシーンに最初から存在するInfiniteLightを使用しますが、このライトのRotationを取得してもそれはベクトルデータではあり ません。
※RTシェーダを書くときはLightからダイレクトにベクトルデータが取れるのに、ICEはここが少し不便です。

ここで、Conversion>4x4 Matrix to Vector に注目しました。
マトリクスをベクトルに変換できるノードがあるのなら、とりあえずライトのRotationをマトリクスまで変換できれば良いかも!と。
少し特殊なやり方になりますが、ノードの逆算方です。
ここからしばらくConversionグループ続きです。

4x4 Matrix to Vector に Conversion>SRT to Matrix をつなぎます。
このノードがSRTをMatrixに変換してくれます。
 064
次にRotationの値がほしいのですが、GetDataは素直にRotationを取得してくれませんので・・・(オイラーかクオータニオンのみ)
Quaternion to Rotation をRotationにつなぎます。(ScalingとTranslationは必要ないのでそのまま・・・)
 065
これでやっと、GetDataをつなぐことが出来ます。
Get Dataノード>Explorerボタンをクリック。
Light>Kinematics>GlobalTransformation>Ori>Quat(クオータニオン回転)と選択すると、 light.kine.global.quatとテキストボックスに入力されます。
※Euler to Rotationというノードもあるのですが、GetDataにEulerを設定しても
Euler to Rotationにつなげないのは私の気のせいでしょうか・・・。
 066
ここまででライトの回転をベクターに変換することが出来ました。
さて、今度
4x4 Matrix to Vectorから4つのポートが出力できることになっているのに気づいて、どうしたら良いかわからなくなります。
シェーダを普段から書いている人は4x4のマトリクスといえばおなじみですが、解説が長くなるのでマトリクスに関するリンクを以下にリストして置きます。
3D 基礎知識
変 形を伴わない回転(東京工科大学 メディア学部 クリエイティブラボ サイトへ)

4x4 Matrix to Vectorは出力ベクトルを列で取るか行で取るかを決めれます。
今回は列(Row)で取得します。
 067
概念で考えると結構混乱するものですので、ここは特殊な(でも案外なるほどな)選び方をして見ましょう。
Debugging>Log Value を呼び出し、Vector一つ一つに順番につないでログを見ていく方法です。
ここでLightの回転値を0にしておきます。ライトを作成した瞬間の向きになると思いますが、-Zの方向を向いています。
 068
そして
Log Valueをつなぐのですが、一旦Dot Productノードのことは忘れて、適当にICETreeまで繋がる構成をします。
(例(下図):LogValueのOutを
Conversionの 4D Vector to ScalarとRGBA to Colorを使ってSetDataに仮繋ぎをしています。
※こうしないとログが表示されないのが不便です。
 069
Script EditorをAlt+4で開き、ログをみながらVectorポートを一個ずつつないでいきましょう。
ログの4行目がそれぞれ以下のようになると思います。
Vector 1 = ' INFO : 4000 - elt 0: <1.000000, 0.000000, 0.000000, 0.000000>
Vector 2 = ' INFO : 4000 - elt 0: <0.000000, 1.000000, 0.000000, 0.000000>
Vector 3 = ' INFO : 4000 - elt 0: <0.000000, 0.000000, 1.000000, 0.000000>
Vector 4 = ' INFO : 4000 - elt 0: <0.000000, 0.000000, 0.000000, 1.000000>
<>の中は左から順にX,Y,Z,Wとなっています。
そして今のLightの姿勢をベクトルで表現すると<0,0,-1,0>となるので、この中で正解は
Vector 3ということになります。
Infinite LightはZ基準なのですね。
おいおいちがうやろ!と突っ込まれた方は鋭いかもしれません。
Vector 3が表す数値はZが1で正の数なのに対し、Lightの姿勢は Zが-1ということなのですが、ここでこの章の最初の画像に戻ります。

矢印が、ライト自身のベクトルと逆を向いているのに気づきましたでしょうか?
オブジェクト自体のシェーディングを計算するためですので、オブジェクトからみてライトはこっちの方向にあるよ!
という意味でライトベクトルというのは、XSI内のライトの矢印とは反対になるのです。

それでは
Vector 3をDot Productに繋ぐという段で、微妙にポートの黄色の色が違うことに注目します。
これはPointNormalは三次元(X,Y,Z)ベクトルを出力しているのに対し、Matrix to Vectorは四次元(X,Y,Z,W)ベクトルを出力しているためです。
 070
ここはどうやら次元をあわせないと繋がらないようなので、Conversionから 4D Vector to Scalar で分割して、XYZのみ Scalar to 3DVector でまとめなおします。
これで難なく
Dot Productに繋ぐことが出来ました。
 071
ここまで出何が出来たかというと、ランバートの輝度値です。※RGBA to Color を使って
Dot ProductのResultをRGBそれぞれに繋いで、SetDataにつないで見てください。
このままだとただの白黒シェーディングなので、普段のXSIのシェーディング表示時のようにディフューズカラーや、
アンビエントカラーを加味した色味に出来るように仕上げたいと思います。
 072

まず、ディフューズ色は簡単で、Color>Multiply Color by Scalar を呼び出して、Factorポートに
Dot ProductのResultを繋ぎます。
色の設定はこのノードが持っているのでそのまま使います。
クランプの設定は0~1の間にしておきます。
 073

次はアンビエントカラーです。
アンビエントは加算なので、Color>Add Color を使います。
 074

これでほぼランバートシェーダの完成です。
まだまだイケル!という方はシーンアンビエントの取得や、ライトカラーの乗算なども試してみてはいかがでしょうか?

最後にこれのコンパウンドの公開です。
 075
上図のようなディフューズカラーと、アンビエントカラーを外部公開し、ライトはGetDataでオブジェクトを指定して繋ぐ
というコンパウンドノードをダウンロードで きるようにしておきます。
ご自由にお使いください。

※外部公開入力へ出力した色のパラメータは、コンパウンドをダブルクリックするとPPGとして変更できます。
 086 
085

fmt_LambertShader v0.5 ダウンロード
このコンパウンドは下図(コンパウンド内部)のようにGetData内にはライト名ではなく、Kinematicsから設定されています。
そしてIn Nameに外部公開入力が入力されていますので、コンパウンドの外で(上図右の左下)GetDataからライトオブジェクトの名前のみを指定して接続。
といった方法でライトを設定できます。
 084

・・・と、ここまでTipsを作成したところで XSI7.01 30日トライアルの期限が切れそうです。
30日トライアル版でもここまでのことが出来るという参考になりましたでしょうか?
このドキュメントが、皆様のICE習得やそのほか諸々のお役に立てることを願っています。
ご意見ご感想などいただけたら幸いですよ。ホント。
これを使ってこんなんできました。なんていうのを送ってくれたら嬉しいことこの上ないのですが・・・。

<前 へ
次 へ>