スポンサーサイト

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

法線ブレンドによる「いいとこ取り」シェーダー

前々から課題として心に引っかかっていたローコストかつ見栄えのするなゲーム背景用ブロック、
昨日参加したJUNKIさんのXSI男忘年会での会話で良さそうな方法を思いついたのを試してみたらできたんでメモ。

まずは結果:
1401230a_block.jpg
わりといい感じのブロックになったとおもう。エッジ部分の光の回り込み具合とか。
ノーマルマップなし、超シンプルなメッシュでこの結果ならひとまずは成功じゃないか。

●素材
・ワイヤーフレームは↓な感じで、ごくシンプルなトポロジ。面の中心に頂点があるのがポイント。
1401230a_block_wire.jpg
・UVはこんな感じでシンプル。UVの切れ目でタイリングテクスチャがずれてしまうのは目をつぶる。
1401230a_block_UV.jpg

●前提
ゲームの背景で無造作かつ大量に配置できる汎用性の高いブロックが欲しかった。
量産が容易で、かつ見た目はそこそこ見れるレベルが望ましい。
今の時代のZブラシとかでハイメッシュを作ってノーマルマップ作ってローポリモデルに貼るっていう
ワークフローが「常識」だと思うんだけど、自分基準ではこれは作業コストがかかりすぎなので、
もっと簡単な方法がないかと模索していた。

・ハードエッジ:明暗のエッジがさすがにちょっと直線的すぎてうそ臭い。
1401230a_block_hard.jpg
・スムースエッジ:立体がヌルく見えてしまうのはNG
1401230a_block_soft.jpg

・この二つを「いいとこ取り」できないか
1401230a_block_blend_final_20141231145339c35.jpg
エッジ付近の自然なつながりと面の立体感を両立するために、この二つの結果をシェーダー上でブレンドしてやればいいのではないか、というのは実は前からちょっと考えていたのだけれど、そのためにはハードエッジ状態の法線と、スムースエッジ状態の法線の両方を保持しなくてはならないのがネックになっていた。法線情報は基本的に一つしか持てないので。
なのだけど、実は先日公開されたSoftimage用の法線編集ツール「UserNormalTranslator」を使えばできることに、飲み会の会話中にふと気づいたのです。
UserNormalTranslatorには法線情報を頂点カラーに変換する機能があるので、それをつかってスムースエッジ状態の法線を一旦頂点カラーに格納してその数値をシェーダー内では法線として扱うようにすればいい。
1401230a_block_blendmap_20141231145337f40.jpg

そしてシェーダー内でエッジ付近はスムースエッジの結果を、面の部分はハードエッジの結果を使えば、理想的な結果が得られるのではないか。

・エッジ部分の指定
とはいえシェーダー内ではどこがエッジでどこが面なのかなんてのは判定できないので、なんらかの方法でエッジ付近をマスクする必要がある。テクスチャでやってもいいのだが、そうするとUV展開などにも頭を捻らなくてはならないし手数も増えてしまうので、ここはやはり頂点カラーを使って指定する。
エッジ部分の頂点カラーを1に、それ以外を0に。別にRGBA全部を使う必要は無いので今回はAチャンネルを使用。
1401230a_block_vcol.jpg
ただコレだとグラデーションが広すぎてエッジ付近のマスクとして扱うには不適切なので、ピクセルシェーダー内で頂点カラーを累乗する。だいたい20乗くらいするとこんな感じの分布になってくれる。
1401230a_block_vcol_pow.jpg
で、このマスクをつかってハードエッジ法線とスムースエッジ法線のライティング結果をシェーダー内でブレンドしてやればめでたく以下の結果が得られた。
1401230a_block.jpg

我ながら回りくどいことをしていると思うw
でも結果にはわりと満足。実戦投入するにはまだもう少し不安があるけれども。
すなおにノーマルマップを使えばいいじゃない、という考えも分かるが
みんなと同じ方法をとったら同じような結果しか手に入らないしね。多様性大事。
かの名言「楽をするためならどんな苦労をも厭わない」の精神で今後もがんばりたい。
それでは来年もよろしくお願いします。
スポンサーサイト

User Normal Translator

というわけでGOTETZさんと組んで密かに進めていたsoftimage用の法線編集プラグイン
その名も「User Normal Translator」が一般公開になりました。

下記URLからダウンロードできます。
https://github.com/Gotetz/UserNormalTranslator

組んだとはいっても自分は「こんな機能があるとすごく助かるんです!」というようなリクエストをしただけで
実際に手を動かしたのは100%GOTETZさんなので足を向けて寝れないのですが!
ずっと「こんなツールがあったらなぁ!」と思ってた機能をこちらの想像の2倍くらい使いやすくして
実装してもらえたので本当に感謝してもしきれないです。
今後仕事でも趣味でも大活躍してもらえること間違いなしです。

softimageはver2015で開発が終了してしまいましたが、
まだまだユーザーの工夫次第ではいくらでも機能追加をしていける
という一例になればと期待しています。

もう少しで正月休みに入るのでいろいろと再開していこうと思ってますよ。乞うご期待。

FabricSplice始めてみた

精神的に一つ肩の荷が下りたので前々から触ってみたかったFabricEngineのSpliceを始めてみた。
http://fabricengine.com/2014/03/fabric-engine-softimage-and-the-vfx-industry/

まだよくわかってないけど、わかる範囲で説明するとこんな感じ。
・FabricEngine=DCCツールと連携するツール各種を作るための開発プラットフォーム。
・FabricSplice=DCCツール内の処理に介入していろいろできる仕組み。
・要するに外付けのICEみたいなもん?
・ただしノードベースではなく、コードを書く形
・KLというC++に似た言語をつかう。スクリプトのようにその場で編集できて、実行時にも高速なのが売りだとか。
・書いたものはsoftimage、maya、3dsmaxなど各種Dccツール間で互換性あり。

インストールまでの感想:
・英語のドキュメントがちょっとわかりづらくてインストールするまでがつらかった。
・Spliceと、Engineと、両方インストールしたけど、いまのところSpliceしか触ってない。
・Splice単品で動くのか、Engineもインストールしないといけないのかは不明。今度別のPCで試そう。

使ってみた感想:
・チュートリアルが動画なので最初の山さえ超えればスムーズに入れた。(ただし英語)
・maya向けのチュートリアルでもコード内容が一緒なのでそのままsoftimageに応用できる。
・ノードベースじゃないことのメリットとして記述が超簡潔。
・前から思ってたけどノードベースって分かりやすいように見せかけて実はわかりにくくね?すぐゴチャるし。


maya向けのチュートリアルを参考に、softimage上で簡単なセカンダリアニメーション用のシム処理を書いてみた。
140427a_sim.jpg
コードはたったこれだけだけど、ちゃんと動く。すげぇ。
前にICEでもチュートリアル参考にverlet法を作ってみたことあったけど、
その時は超ごちゃごちゃしててわかりにくかった。それと比べれば雲泥の差。

まだ最初の一歩を踏み出したばかりだけど、これはいろいろできそうで夢が広がるなー。
衣服とか髪の毛のゆれとかを自動化できればデザインの幅も広がるし、そのほかにもモデリングの補助的な機能も自作できれば…

softimageに機能追加がもう無いんだったら、自分で追加すればいいじゃない!
ってところまでいけたらいいな。

天球シェーダー移植

以前紹介した天球シェーダーを改めてUNITYに移植。意外と手間取った。
140218b_BG.jpg
このシェーダーは頂点シェーダー内でZ値を書き換えてメッシュを無理やり背景よりも後ろに描画する、というのがミソで、
実際の天球メッシュは直径1メートル程度の小サイズのものをカメラの子供として配置するだけでOK。
ステージ全体を包み込むような巨大なメッシュを作る必要もないし、ファークリップを心配する必要もない。
おまけにドローコールもUNITYネイティブのスカイボックスより少ない。


今回のメモ:
シェーダーコード自体はシンプルなので、移植はスムーズに行ったんだけど別の部分でトラブった。
どうやらUNITYのカメラの設定でUNITYネイティブのスカイボックスを使用していると、
自前の天球シェーダーよりもそっちが優先されてしまうみたい。
UNITYのカメラ設定のClearFlagsをSolidColorに変更したら無事に表示された。
エラーが出るわけでもないのに一向に表示されないからかなり悩んだけどふたを開けてみれば簡単な理由だった。

次は草木用のシェーダーかな。

セルフシャドウ失敗

自己流シャドウボリュームを応用してセルフシャドウ処理をしようとして盛大に失敗。
まー、そんなことじゃないかという気はしてたんだけど。別の手段を考えるとしよう。
120213a_ORC.jpg
勘のいいシェーダープログラマーなら上の絵で何してるか簡単にばれるかも。
これはこれでかっこいいような気もするけどちょっと実用には耐えないなぁ。

SI上でポスト処理がかけられればこんな回りくどいこともしなくていいんだけどな~。
一応SDKとかいじればできないこともないらしい(XGSてやつだっけ?)けど敷居高すぎてちょっと手が出ない。
次のバージョンでリアルタイム周りが強化されることを切に願う。
プロフィール

JNY

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

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

Twitter Updates

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