UE4.14.0 Forward Shadingのエンジン改造でセルシェードやってみた
- 10. その前に
● セルシェード(セルルック)に関しては、
おぎまふさん( @ogimafu )が詳しいです。
つよい。いつか倒したい
– 【UE4】セルっぽいルックを頑張ってみる その1(概要)
- 開発日誌
http://ogimafu.blogspot.jp/2015/03/ue4.html
– 【第3回UE4札幌Meetup!!!】 UE4で実装するセル表現
http://www.slideshare.net/TomohiroOgiwara/ue4meet
up-63696087
- 12. そもそものレンダリングフロー
● Deferred Shading
– メッシュの描画命令→
Gバッファにシェーディングに必要な情報をレンダリングして保存
→
(ほぼ)全部のメッシュの描画命令が出た後にGバッファの情報を
使用してスクリーンベースでシェーディング(陰影付)
● Forward Shading
– メッシュの描画命令→
そのままシェーディング
詳しく喋ると1晩かかるのでググって!
- 15. エンジン改造
● UE 4.14.0のエンジンのソースコード落としてきて環境を
整える
– [UE4] エンジンのソースコード取得とビルド手順のまとめ
UE4.6改訂版 – historia
http://historia.co.jp/archives/1327
– エンジン改造 - UE4 Document@com04
http://com04.sakura.ne.jp/unreal/wiki/index.php?
%A5%A8%A5%F3%A5%B8%A5%F3%B2%FE
%C2%A4
- 16. 事前情報:エンジンコードでのフラグ
● ソースコードでForward ShadingがONかどうか取得
● シェーダーコードでForward Shading時のdefine
● シェーダーコードで、Forward Shadingの時、Gバッ
ファがdisableになってる
static IConsoleVariable* CVarForwardShading =
IConsoleManager::Get().FindConsoleVariable(TEXT("r.ForwardShading"));
const bool bForwardShading =
CVarForwardShading ? (CVarForwardShading->GetInt() != 0) : false;
#define FORWARD_SHADING
#define USES_GBUFFER // これがdisableになってる
- 17. 事前情報:シェーダーの流れ
● Forward Shading時のシェーダーの流れ
● FPixelShaderInOut_MainPS(BasePassPixelShader.usf)
– GetForwardDirectLighting(ForwardLightingCommon.usf)
● GetDynamicLighting(DeferredLightingCommon.usf)
– SurfaceShading(ShadingModels.usf)
● シェーダーコードは”UnrealEngine/Engine/Shaders”あたり
● ライティング計算はDeferredと同じ物を使ってる。
- 22. 影色の適用
● 呼び出し元を差し替える
GetDynamicLighting(DeferredLightingCommon.usf)
// accumulate surface
{
float3 SurfaceLighting =
SurfaceShading(GBuffer, LobeRoughness, LobeEnergy, L, V, N, Random);
#if FORWARD_SHADING
float light = ((NoL * SurfaceAttenuation) > 0.5f) ? 1.0f : 0.0f; // とりあえず2値化
LightAccumulator_AddMeetup(LightAccumulator, SurfaceLighting,
GBuffer.ShadowColor*(1.0/PI), (1.0/PI), light,
bNeedsSeparateSubsurfaceLightAccumulation);
#else
LightAccumulator_Add(LightAccumulator, SurfaceLighting,
(1.0/PI), LightColor * (NoL * SurfaceAttenuation),
bNeedsSeparateSubsurfaceLightAccumulation);
#endif
}
- 24. できた!
● これだけ!
● Gバッファーとか何にも弄らなくていい!
● 多分ぼくが見たセルシェードの中で一番扱いやすいかも。
● 今回弄ってないけど、やるべき項目
– スペキュラも段階付けるとかしないと。
● EngineShadersShadingModels.usf
– StandardShading辺りのハズ…
– ドロップシャドウ周り
● 頑張ればライティング値からテクスチャルックアップの陰影
付も出来るかも。