Más contenido relacionado
La actualidad más candente (20)
Similar a UE4でTranslucencyやUnlitに影を落としたい! (11)
UE4でTranslucencyやUnlitに影を落としたい!
- 4. 自己紹介
● Twitter: @com04
● ゲームプログラマー
● UE4歴: UE4.4~
● 作ったものとかは大体twitterモーメントに
○ https://twitter.com/i/moments/847072031048814594
○ https://twitter.com/i/moments/986364547098275840
4
- 5. 自己紹介
● マーケットプレイスに出品しました
− ComMaterialTools - マテリアル検索の便利ツール
● https://www.unrealengine.com/marketplace/commaterialtools
● UE4勉強会 in 大阪 の管理者やってます
− 講演したスライド
● マテリアル基礎・初級: https://www.slideshare.net/com044/ue4-80326829
● UE4でのチーム製作: https://www.slideshare.net/com044/4ue4-in-ue4
● アニメーション基礎: https://www.slideshare.net/com044/ue4-in-91056422
● もっとアニメーションBP: https://www.slideshare.net/com044/ue4-in-bp
● UE4 LODs for Optimization -Beginner-:
https://www.slideshare.net/com044/lods-for-optimization-beginner
● Volumetric Fogで空間を演出する!:
https://www.slideshare.net/com044/ue4-volumetric-fog
● エンジンの内部挙動について: https://www.slideshare.net/com044/ue4-in 5
- 15. UE4のおさらい - Opaque / Translucency, DefaultLit / Unlitの影
Opaque / TranslucencyとDefaultLit / Unlit
Blend Mode Shading
Model
他メッシュのキャストシャ
ドウ
自身のキャストシャ
ドウ
Opaque Default Lit 受けれる 受けれる
Opaque Unlit 受けれない 受けれない
Translucency Default Lit Lighting ModeがForward
Shadingなら受けれる
受けれる
Translucency Unlit 受けれない 受けれない
- 21. UE4のおさらい - Translucencyについて - Lighting Mode
● Shadine Model: Default Lit
● Lighting Mode: Surface ForwardShading
にするとOpaque+DefaultLitのように影を受ける事が出来
る
- 24. UE4のおさらい - Translucencyについて - Lighting Mode
Forward/Deferredレンダリングに関して知りたい方は下記
資料を!
● 第5回VFX技術者交流会 なぜなにリアルタイムレンダリング - も
んしょさん
○ https://www.slideshare.net/SatoshiKodaira/ss-69311865
- 26. UE4のおさらい - Translucencyについて - Lighting Mode
Surface ForwardShading
● メリット
○ DefaultLitと同じような影を受けれる
● デメリット
○ 重い
■ 特にパーティクル枚数が多くなってくると顕著
- 34. UE4のおさらい - Translucencyについて - Lighting Volume
● コンソールコマンド
○ r.TranslucentLightingVolume
■ 0 で無効
○ r.TranslucencyLightingVolumeDim
■ ボリュームの解像度。16~128
○ r.TranslucencyLightingVolumeInnerDistance
○ r.TranslucencyLightingVolumeOuterDistance
■ ボリュームの開始~終了距離。調整してゲームに合った距離を探る
- 35. UE4のおさらい - Translucencyについて - Lighting Volume
描画負荷、掛かります
GPU Profile上で……
● ライトの可動性:ムーバブル
○ Inject Translucent Volume
● ライトの可動性:ステーショナリー
○ Filter Translucent Volumeで纏めて
→必要無ければライト単位で設定をOFF
に
→ボリュームの解像度の調整も
- 36. UE4のおさらい - Translucencyについて - Lighting Volume
Translucent Lighting Volume
● メリット
○ それっぽい日陰やライトの色味が付く
○ デフォルトでON
● デメリット
○ 遠方は消えてしまう
○ 精度や距離を上げようとすると負荷が高くなる
○ 境目でのくっきりした影は出せない
- 41. UE4のおさらい - Translucencyについて - Self Shadow
1. メッシュやパーティクルシステムの
「Lighting」項目の下記にチェックを入
れる
● Cast Shadow
○ 影を落とすか
● Volumetric Translucent Shadow
○ Translucencyなボリュームシャドウを落
とすか
- 42. UE4のおさらい - Translucencyについて - Self Shadow
2. マテリアルのLighting Modeを下記のうちどれかにする
● Volumetric NonDirectional
● Volumetric Directional
● Surface Translucency Volume
- 44. 参考
● Lit Translucency - 公式ドキュメント
○ https://docs.unrealengine.com/en-us/Engine/Rendering/LightingAndSh
adows/LitTranslucency
● Material Properties - 公式ドキュメント
○ https://docs.unrealengine.com/en-us/Engine/Rendering/Materials/Mate
rialProperties
●
- 111. DistanceFieldを用いた影
実装。ループ処理を使うのでマテリアルのCustomノードで
対応しました。 // ライト方向
const float3 LightVector = ResolvedView.DirectionalLightDirection;
// 初回距離
const float StartLength = 30.0f;
// しきい値(これ以下の距離は壁の中にいる)
const float ShadowThreshold = 1.0f;
// 検索最大距離(これ以上検索したら日向にする)
const float MaxSearchLength = 10000.0f;
// 検索する座標
float3 Position = GetWorldPosition(Parameters) + LightVector * StartLength;
// 検索した距離
float SearchLength = StartLength;
// 10回分検索する
for (int Index = 0 ; Index < 10 ; ++Index) {
// 近いメッシュの距離
float Nearest = GetDistanceToNearestSurfaceGlobal(Position);
// 日陰かどうか
if (Nearest <= ShadowThreshold) {
return 0.0;
}
// 検索距離限界
SearchLength += Nearest;
if (SearchLength >= MaxSearchLength) {
break;
}
// Next Trace
Position += Nearest * LightVector;
}
return 1.0;
- 114. DistanceFieldを用いた影
Customノードを修正して、ループの中で調べていく中で1
番小さい(=影が濃い)数値を取って補間します
// 10回分検索する
for (int Index = 0 ; Index < 10 ; ++Index) {
// 近いメッシュの距離
float Nearest = GetDistanceToNearestSurfaceGlobal(Position);
// 日向~日陰具合
float SoftRate = saturate((Nearest - ShadowThreshold) / Smoothness);
// 一番の日陰を取る
Sunny = min(Sunny, SoftRate);
// 検索距離限界
SearchLength += Nearest;
if (SearchLength >= MaxSearchLength) {
break;
}
// Next Trace
Position += Nearest * LightVector;
}
return Sunny;
// ライト方向
const float3 LightVector = ResolvedView.DirectionalLightDirection;
// 初回距離
const float StartLength = 30.0f;
// しきい値(これ以下の距離は壁の中にいる)
const float ShadowThreshold = 1.0f;
// 検索最大距離(これ以上検索したら日向にする)
const float MaxSearchLength = 10000.0f;
// 検索する座標
float3 Position = GetWorldPosition(Parameters) + LightVector * StartLength;
// 検索した距離
float SearchLength = StartLength;
// 日向-1.0、日陰-0.0
float Sunny = 1.0;
- 127. DistanceFieldを用いた影
参考
● メッシュディスタンス フィールド
○ http://api.unrealengine.com/JPN/Engine/Rendering/LightingAndShadows/MeshDistanceFields/
● メッシュ ディスタンス フィールド設定のリファレンス
○ http://api.unrealengine.com/JPN/Engine/Rendering/LightingAndShadows/MeshDistanceFields/
Reference/index.html
● RayTraced Distance Field Soft Shadows
○ http://api.unrealengine.com/JPN/Engine/Rendering/LightingAndShadows/RayTracedDistanceFi
eldShadowing/index.html
● ディスタンス フィールド アンビエント オクルージョン
○ http://api.unrealengine.com/JPN/Engine/Rendering/LightingAndShadows/DistanceFieldAmbient
Occlusion/
- 181. さいごに - 影の色つけ
通常のDefault LitやTranslucency+Surface
ForwardShadingですと、エンジン内部で影付けを
行われるのでマテリアルでその係数を拾う事が出来ません。
ですが、先程のはマテリアル内で影の具合を拾えますので、
色味を自分で調整する事が出来ます。
- 188. さいごに - まとめ
手法 メリット デメリット
Unlitフェイク ・負荷的に軽い ・PostProcessで法線狂う
Component ・負荷的に軽い ・メッシュ単位の影ON/OFFしか取れない
Distance
Field
・元々Distance Field有効
なら負荷的に軽い
・元々Distance Field無効だった場合はONに
すると負荷激増
・Skeletal Meshから影を受けれない
Shadow Map ・解像度次第で精密な影
・事前に焼き込めばランタ
イムは軽い
・解像度次第でメモリを喰う
・Movableなメッシュから影を受けようとすると
処理負荷高い
- 197. 巻末資料 - TranslucencyのLightingModeについて
● PerVertex系
○ LightVolumeの方向計算を頂点単位で行う
■ PerVertexが付いていないのはピクセル単位
○ Volumetric Translucent Shadowが効かない
○ PerVertex付いてる方が軽い(ハズ)
● Directional / NonDirectional
○ NonDirectionalはライト方向によるシェーディングをしない
○ NonDirectionalの方が軽い(ハズ)
● Surface系
○ リフレクションが使える(Metallic, Roughnessが使える)
VolumetricPerVertexNonDirectional が一番描画負荷軽そう
- 206. 巻末資料 - TranslucencyのLightingModeについて
シェーダーの定義で下記defineが設定される。
○ 興味ある人はEngine/Shader/以下の.usf, .ushを検索!
● VolumetricNonDirectional
○ #define TRANSLUCENCY_LIGHTING_VOLUMETRIC_NONDIRECTIONAL
● VolumetricDirectional
○ #define TRANSLUCENCY_LIGHTING_VOLUMETRIC_DIRECTIONAL
● VolumetricPerVertexNonDirectional
○ #define TRANSLUCENCY_LIGHTING_VOLUMETRIC_PERVERTEX_NONDIRECTIONAL
● VolumetricPerVertexDirectional
○ #define TRANSLUCENCY_LIGHTING_VOLUMETRIC_PERVERTEX_DIRECTIONAL
● Surface TranslucencyVolume
○ #define TRANSLUCENCY_LIGHTING_SURFACE_LIGHTINGVOLUME
● Surface ForwardShading
○ #define TRANSLUCENCY_LIGHTING_SURFACE_FORWARDSHADING