表現で使いわける! 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
}