表現で使いわける! Unity の URPと HDRP
Universal Render Pipeline(URP)とHigh Definition Render Pipeline(HDRP)はどちらも高い拡張性を持ったUnityの新しいレンダーパイプラインです。
しかし、HDRPが明確に高精細/高性能ハード向けを特徴としている一方で、URPはモバイルからコンソールまで広く柔軟にカバーしているため、あえて高性能ハードでURPを選ぶメリットは理解しにくいかもしれません。
そこで本講演では、ハード性能に関わらずURPを選ぶメリットと、それに関連する機能を、”表現”という言葉を軸に解説いたします。
特に、オリジナリティのあるグラフィックに挑戦したい方はぜひご覧ください。
参考記事
Custom Function で独自のノードを実装(Shader Graph Tips)
https://youtu.be/qltNyFIGYkw
シェーダーグラフのカスタムライティング(Unity公式ブログ)
https://blog.unity.com/ja/technology/custom-lighting-in-shader-graph-expanding-your-graphs-in-2019
ライティング情報の取得に使ったHLSL
void MainLight_half(float3 WorldPos, out half3 Direction, out half3 Color, out half DistanceAtten, out half ShadowAtten)
{
#pragma multi_compile _SHADOWS_SOFT
#ifdef SHADERGRAPH_PREVIEW
Direction = half3(0.5, 0.5, 0);
Color = 1;
DistanceAtten = 1;
ShadowAtten = 1;
#else
#if SHADOWS_SCREEN
half4 clipPos = TransformWorldToHClip(WorldPos);
half4 shadowCoord = ComputeScreenPos(clipPos);
#else
half4 shadowCoord = TransformWorldToShadowCoord(WorldPos);
#endif
Light mainLight = GetMainLight(shadowCoord);
Direction = mainLight.direction;
Color = mainLight.color;
DistanceAtten = mainLight.distanceAttenuation;
#if !defined(_MAIN_LIGHT_SHADOWS) || defined(_RECEIVE_SHADOWS_OFF)
ShadowAtten = 1.0h;
#endif
#if SHADOWS_SCREEN
ShadowAtten = SampleScreenSpaceShadowmap(shadowCoord);
#else
ShadowSamplingData shadowSamplingData = GetMainLightShadowSamplingData();
half4 shadowParams = GetMainLightShadowParams();
ShadowAtten = SampleShadowmap(TEXTURE2D_ARGS(_MainLightShadowmapTexture, sampler_MainLightShadowmapTexture),
TransformWorldToShadowCoord(WorldPos), shadowSamplingData, shadowParams, false);
#endif
#endif
}