もんしょの巣穴blog

スポンサーサイト

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

[UE4] エンジンのシェーダコードを変更する 基礎編

今回はエンジンのシェーダコードを変更することでトゥーンシェーダを実装してみようと思います。
基礎編とか言ってますが、今のところ応用編を作成する予定はありません。

トゥーンシェーダは通常、ライトの影響を2値、もしくは3値に変換することで実装します。
よくある実装方法はルックアップテーブルをテクスチャ化し、これを利用する方法です。
ライトの影響は法線とライトベクトルの内積で求められ、-1.0~1.0の範囲を取ります。
これを0.0~1.0に圧縮、ルックアップテーブルテクスチャをサンプリングします。

この手法はトゥーンシェーダ以外でも割と使われるのですが、今回はこの方法を用いません。
テクスチャをサンプリングする場合はテクスチャをシェーダにバインドしてやる必要があるのですが、これを行うにはシェーダコード以外にC++コード側も修正する必要があります。
今回はシェーダコードのみの実装にするため、シェーダコード内で比較を用いて2値化します。

シェーダコードは当然GitHubのエンジンコード内に存在します。
なのでエンジンコードを持ってくること、ビルドする環境があることが条件になります。
エンジンコードはサブスクリプション契約をしていれば取得できます。
ビルド環境はWindowsならVisual Studio 2013があればOKです。
無料環境は現在、Visual Studio Community 2013が無料で使えるのでこれを持ってきます。
まあ、詳しい方法についてはヒストリアさんのブログを参照してください。

[UE4] エンジンのソースコード取得とビルド手順のまとめ

エンジンコードをビルドし実行すると、普通にUEを立ち上げたのと同じ状態になります。
ここで作成したプロジェクトはビルドしたエンジンに関連付けられるので、バージョン変更をしない限りはコード変更の影響を受けます。

では、コードを変更していきましょう。
直接ライティングを処理しているのは"DeferredLightingCommon.usf"というファイルです。
プロジェクト内では、"Engine/UE4/Shaders"内に存在します。
変更箇所は610行目付近で、以下の太字のように変更しましょう。

float3 SurfaceLightingSpec = SurfaceShading(ScreenSpaceData.GBuffer, LobeRoughness, LobeEnergy, L, V, N, float2(0, 1));
float NoLAndAttn = NoL * SurfaceAttenuation;
if (ScreenSpaceData.GBuffer.ShadingModelID == SHADINGMODELID_DEFAULT_LIT)
{
    NoLAndAttn = (NoLAndAttn > 0.2) ? 1.0 : 0.0;
}

LightAccumulator_Add(LightAccumulator, SurfaceLightingDiff, SurfaceLightingSpec, LightColor * NoLAndAttn);

法線とライトベクトルの内積だけでなく、シャドウによる減衰分も含めて2値化します。
シャドウの減衰を考慮しないとトゥーンっぽくならないです。

変更をしたらプロジェクトを立ち上げ直すか、プロジェクトがすでに立ち上がっている場合はCtrl+Shift+"."のショートカットキーでシェーダのリビルドを行います。
これで変更が有効になるはずです。

で、結果がこれ。

ue277.jpg 
見ての通り、陰影は2値化されています。
ただし、GIによる影響はありますし、スペキュラやリフレクションは別の処理なのでちょっと微妙かもしれません。
また、半透明マテリアルはまた別のライティング処理なのでやっぱりうまくいきません。

ここまでやったらあとはポストプロセスなどでアウトラインをつけてやればそれっぽくなるんじゃないでしょうか?

スポンサーサイト
  1. 2015/02/14(土) 22:31:00|
  2. UE4
  3. | トラックバック:1
  4. | コメント:0

[UE4] 勉強会の資料

2/11に行われたUE4勉強会には多くの方に出席していただきました。
ありがとうございます。

その時に使用した資料とプロジェクトを公開します。

http://1drv.ms/1EYLzjL
ue4study_art.ppt
ue4study_art.pdf
UE4Study_Tokyo03.zip

プロジェクトは前回の勉強会で使用したものを上書きしています。
スライド資料は分けていますが、ほぼ同じものです。
若干の修正、Appendix Cを本発表に挟むなどの変更があります。

あと、プロジェクトのブルーマン先生登場シーンの音楽はやっぱり抜いてあります。
予め、ご了承ください。
  1. 2015/02/14(土) 11:24:54|
  2. UE4
  3. | トラックバック:1
  4. | コメント:0

[UE4] あまり使われないマイナーなマテリアル機能 その2 "Customized UV"

前回に引き続き、マテリアルのマイナーな機能を紹介するコーナー。
今回はCustomized UVです。
UVのカスタマイズと聞いて、メッシュに別のUVを割り当てる手法と思う人もいるかもしれませんが、そうではありません。

とりあえず、解説する前に使い方から提示します。
まず、マテリアルエディタを開き、詳細パネルをチェックしましょう。
[Material]カテゴリのデフォルトでは非表示になっている部分に[Num Customized UVs]という項目があります。
デフォルト値は0ですが、この状態では使用できないので2を入れてみましょう。

ue269.jpg 

すると、メインマテリアルノードに[Customized UV0], [Customized UV1]の2つのピンが出現します。
これで機能が使えるようになります。

実際に使ってみましょう。
わかりやすくするため、以下のようにつないでみます。

ue270.jpg 

UV0にはテクスチャ座標をそのまま設定、UV1には2倍したテクスチャ座標、つまり2回のタイリングを行うテクスチャ座標を設定します。

次に適当なテクスチャをテクスチャ座標でサンプリングし、ベースカラーに設定します。

ue271.jpg 

これを四角の板に貼り付けた結果は当然こうなります。

ue272.jpg 

では、テクスチャをサンプリングしているテクスチャ座標を選択し、詳細パネルで[Coordinate Index]を1に変更してみましょう。

ue273.jpg 

すると、結果がこのように変化します。

ue274.jpg 

2回のタイリング結果ですね。

ここからわかると思いますが、Customized UVの機能を利用するとCustomized UVのピンに入力した結果をテクスチャサンプルする段階でインデックス番号によって参照することが出来るというわけです。
しかし、この方法は一手間増えてしまっています。今までみたいにサンプリングする際に直接2倍したりじゃダメなのでしょうか?

もちろん、ダメじゃないです。
ただ、これにはこれで利点もあります。

では、続きからでそもそもの機能解説と制約を書いておきます。

[[UE4] あまり使われないマイナーなマテリアル機能 その2 "Customized UV"]の続きを読む
  1. 2015/02/05(木) 00:14:32|
  2. UE4
  3. | トラックバック:0
  4. | コメント:0

プロフィール

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

最近の記事

最近のコメント

最近のトラックバック

月別アーカイブ

カテゴリー

ブロとも申請フォーム

この人とブロともになる

ブログ内検索

RSSフィード

リンク

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

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