スポンサーサイト

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

シェーダ

シェーダのサイトは少ないと思う。
本を買って勉強するのがいいんだろうけどXNA専用のものが無いので気後れしてしまいます(涙

すこしでも資料になれば。と簡単にまとめ。

デッサンでものを書けるように白と黒の組み合わせで光の濃淡をほとんど表現できます。
一般的に光の有無のデータを0~1の割合で表してやり、テクスチャや頂点カラーなどで獲た情報に「かける」ことで最終色を書き出すようです。(反射や特殊効果はあとから加算)

最初に勘違いしやすいのはTEXCOORD0~とかのところだと思います。
「一つの頂点に複数の座標を記憶させることができる。」ということをしっかり掴んでおけば大丈夫でしょう。

さて、メタセコなどにもある「ランバート」「Phong」について触れます。

~ランバートシェーダ~
視点とライトのべクトルの関係により光の割合を計算し明暗を与える手法っぽい。
内積cosθは、-1.0f~1.0fの範囲になることを踏まえなければならない。
max( 最低値, dot(N, L) )などして一番暗いところでも環境光を当ててやると綺麗でリアルになる。


ハーフランバートと呼ばれるものもある。、
cosカーブの値に1/2をかたものに1/2を加算。(0.0f ~ 1.0fの範囲内に変換)
さらにこれを2乗することで実装。(明るくなるほどカーブが急になる)



maxで底上げして環境光を当てたものにハーフランバート処理を入れるとかなり光が柔らかくなる。

maxの計算は
max(dot(N,L))*0.5+0.5 , Ambient)←これを二乗 としても
max(dot(N,L)),Ambient)*0.5+0.5 ←これを二乗 としても
max( dot(N,L))*0.5+0.5を二乗したもの ,Ambient)としてもよいが
Ambientの範囲が変わるので注意。

ハーフランバートをまとめると黒から白のグラデーションをグラフにしたとき
「/」だったものを「ノ」にしてやることで「中間色の色の変わり方を緩やかにしてやる」と説明するのがしっくりくるかんじ。


~Phong~
スペキュラ値を求めてやり上記に反射を与える表現手法。
物体の一点で考えてみよう。
物体から見てカメラの位置とライトの位置の丁度中間に向かって線を引く。
法線(面にから垂直に立っている線のこと)とさっきの線を比べて狭ければスペキュラ値を上げる。
テクスチャなどから今まで計算した色にスペキュラ値を加算することで綺麗に光の反射をあらわす。



以上のことを知っていれば簡単に綺麗な表現が出来るはずだ。
ただし最低限の高校数学(ベクトルあたり)や必要に応じて大学レベルの数学が必要になるらしい。
計算方法などは深入りせずに用意されたメソッドに任せ、必要な部分だけ抜き出してGoogle先生と仲良くやっていくのがいいと思う。といっても計算自体が重いものもあるらしいので詳しいことに越したことはないと思うけど。。。。


それ以外には

自己照明光を加えたい場合は↑出した色に
min( 上の値 + 照明の強さ, 1.0f )などしてやる。


とか

光源を背にしたモデルを影側からみたら光が回り込むやつ!を表現するには
float a = 1.0f - max( 0.0f, dot( 法線, 視線) );
a = a * 調整指数(0.3~1.0くらいで分かると思う);
a = a * a * max( 0.0f, dot( 視線,ライト線) );
この値を最終的に出た色にプラスしてやればOK。


などなど。


こっち形も勉強しだしたら底が見えないんだろうな。。
ねよっと。



コメントの投稿

非公開コメント

プロフィール

あしゅ

Author:あしゅ
ぷぃぷぃ日常。
いつのまにか雑記ブログに。

カテゴリ
最新記事
検索フォーム
最新コメント
リンク
このブログをリンクに追加する
ブロとも申請フォーム

この人とブロともになる

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