スポンサーサイト

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

UNITY用背景シェーダー実装

130207a_UNTY.jpg
時間はかかったけどわりとすんなりと移植できた。
・テクスチャブレンド
・パララックスマッピング
・絵画調ライティング
・ポイントライト
・シャドウマップ
とまあ、だいたい欲しい表現は網羅できた。

本当は前にSI上で試作したレンズゆがみシェーダーも使いたかったのだけど、
テストの結果シャドウマップとの相性が悪いことが判明して泣く泣くカット。

これでキャラと背景のシェーダーが用意できた。
追加で欲しいシェーダーは…
・天球用シェーダー
・炎などの発光するエフェクト用シェーダー
・煙などの発光しないエフェクト用シェーダー
・文字や体力バーなどのためのUI用(?要調査)
・余裕があれば水面シェーダー
これだけあれば当面は足りるはず。

ゲームロジックに取り掛かれるのはもう少し後になるかな~。
しかし見た目部分の手ごたえはあり!
スポンサーサイト

UNITYシェーダーメモ03 ポイントライト&ポストエフェクト

130126a_UNTY.jpg
●ポイントライト
UNITYのライティング周りは結構仕様が複雑で把握に手間取ってしまった。
試行錯誤の末、やや裏技的な方法も使ってなんとか狙い通りの効果が得られるところまでこぎつけた。
いわゆる普通の加算ポイントライトとは違うオリジナルの処理をしているので、使えるポイントライトの数は二つまでに制限されるんだけど、そこはトレードオフで。
二つ使えるだけでも嬉しい。かがり火などの環境光+ヒットエフェクトを併用できるし。

●ポストエフェクト
さらにせっかくpro版を買ったのでいろいろとポストエフェクトを試してみる。
・Bloom and Lens Flare
・Global Fog
・Depth of Field Scatter
ただ、パラメータをうまく調整しないと、いかにも「エフェクトつかいました!」的な品のない絵になりがち。
難しい。
オリジナルのポストエフェクトも書けるみたいなのでいつか試してみたい。

現状背景用のシェーダーは仮なのでSIでは実装済みのパララックスマッピングやテクスチャブレンドは未実装。
次はそのあたりの移植に取り掛かろう。

しかしここまででもSI上ではやりたくてもできない表現がいろいろできてしまっているので、
外部リアルタイムレンダラーとしてもUNITYのpro版は個人的にはいい買い物だった。
これでさらにゲームまで作れるんだからいい時代になったものだ。

はやくこれらのキャラを動かせるようになりたいぜ!

UNITYシェーダーメモ02 覚書き

シェーダーの移植検証でUNITYとSOFTIMAGEのレンダ結果を比較
130119b_UNTY.jpg
比較検証のため、せっかく実現したシャドウマップは一旦カット。
ポーズやライティングは若干違うけど、色味とか陰影の入り方はほぼ完全再現できた。
まだポイントライト周りは手をつけてないので、それが入ったらやっと一段落かな。

●UNITYシェーダー覚書
覚書というか、移植に当たって苦労した部分の記録。
誰か同じようなことをやろうとしている奇特な人が居るかもしれないし。

・ワールドの座標系が無い!
UNITYは Model >> View >> Projection という座標系変換。使い慣れたworld変換が無い!?
そのくせライトのベクトルはワールド座標系準拠。
最初気づかずにモデル座標系の法線とワールド座標系のライトで計算しててライティングがえらいことに。
結局、「_Object2World」というマトリクスを法線にかけることでこれは解決。
OUT.normal.xyz = mul( _Object2World, float4( IN.normal.xyz, 0.0 ) ).xyz;
と書けば今までと同じようにワールド座標系同士でライティング計算ができた。

・アンビエントライトが暗い?
UNITY_LIGHTMODEL_AMBIENTでアンビエントカラーを取得できるんだけど、
同じ値でもなんかSoftimageと色の出方が違うなと思っていろいろ調べたところ、なぜか2倍にすると一致。
 float4 AmbientColor = UNITY_LIGHTMODEL_AMBIENT *2 ;
Softimageが明るいのか、Unityが暗いのかわからんけど、これで同じ値で同じ結果になった。

・ライトベクトルの取得
微妙に納得がいかないんだけど、「_WorldSpaceLightPos0.xyz」で0番のライトのベクトルを取得できる。
「Pos」って書いてあるのに向きベクトルなのは何なんだよって思うけど、意図したとおり動くのでまあいいや。
ポイントライトとかの処理に関係あるのかも。もう少し調べたい。

とりあえず今日はここまで。

UNITYシェーダーメモ01 シャドウマップ

前の記事で書いたように、なんとか自前のカスタムシェーダーにシャドウマップの処理を組み込むことに成功。
130119a_UNTY.jpg
有益な情報を見つけられたのはこちらのページ(英語)
http://forum.unity3d.com/threads/108612-Adding-shadows-to-custom-shader-(vert-frag)
ありがたいことに動作するコードが載っていたので逐一要素を比較して条件を絞り込んでいった。
上記ページにリストアップされていないものもあったので以下にメモ。


●カスタムシェーダーでシャドウマップを使うための条件


・シェーダーコードのTagsの中に"LightMode" = "ForwardBase" を入れる

・CGPROGRAMの下に以下の3つを入れる。
   #pragma multi_compile_fwdbase
   #include "UnityCG.cginc"
   #include "AutoLight.cginc"

・vertex shaderからfragment shaderに渡す構造体の定義の中に LIGHTING_COORDS(0,1)を含める。
   このとき、文末にセミコロンは不要。(0,1)には未使用のTEXCOORDの二つを指定する。

・vertex shader内に TRANSFER_VERTEX_TO_FRAGMENT(o); のコードを含める。
   (o)は出力される構造体名。

・fragment shader内で LIGHT_ATTENUATION(i)がシャドウマップのパラメータとなる。
   (i)は入力される構造体名。

・シェーダーコードの最後に必ず FallBack を指定する。指定しないとなぜかシャドウが出ない。
   個人的にはこれが盲点だった。



やっぱ落ち影が入ると画面の奥行き感にグッと説得力がでる。数日前には一瞬諦めかけてたけど解決できて良かった。
危うくpro版を買ったのが無意味になるところだった。他のポストエフェクトもいろいろ試したい。

まだまだシェーダーそのものも移植完了していないんだけど光明が見えてきた!!やるぜぇ~!

UNITYでトゥーン+セルフシャドウ!

でけた!感動!
130116a_UNTY.jpg
左がセルフシャドウあり、右がシャドウなし。
単にシャドウマップを上から乗算しているわけじゃなくて、きちんと値をトゥーンの計算に組み込んでいるので
影色を保ったままでセルフシャドウが出来ている。これがやりたかった!

数年越しの夢が現実になった。感無量。
詳細は後日。
プロフィール

JNY

Author:JNY
某ゲーム会社勤務
趣味と修行をかねて個人製作中
Softimage & Cgfx & Unity

最新記事
最新コメント
月別アーカイブ
カテゴリ
カウンター
twitter

Twitter Updates

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