Version: Unity 6.0 (6000.0)
言語 : 日本語
カスタム URP シェーダーでカメラを使用する
Use indirect lighting in a custom URP shader

カスタム URP シェーダーでのライティングの使用

カスタムユニバーサルレンダーパイプライン (URP) シェーダーでライティングを使用するには、以下の手順に従います。

  1. シェーダーファイルの HLSLPROGRAM 内に #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" を追加します。
  2. 以下のセクションのいずれかのメソッドを使用します。

ライトデータの取得

Lighting.hlsl ファイルは、以下のメソッドを含む RealtimeLights.hlsl ファイルをインポートします。

メソッド 構文 説明
GetMainLight Light GetMainLight() シーンのメインライトを返します。
GetAdditionalLight Light GetAdditionalLight(uint lightIndex, float3 positionInWorldSpace) positionWS に影響する lightIndex の追加ライトを返します。例えば、lightIndex0 の場合、このメソッドは最初の追加ライトを返します。
GetAdditionalLightsCount int GetAdditionalLightsCount() 追加ライトの数を返します。

影の計算に使用できるメソッドのバージョンについては、カスタム URP シェーダーでの影の使用 を参照してください。

面法線のライティングの計算

メソッド 構文 説明
LightingLambert half3 LightingLambert(half3 lightColor, half3 lightDirection, half3 surfaceNormal) Lambert モデルを使用して計算された、面法線のディフューズライティングを返します。
LightingSpecular half3 LightingSpecular(half3 lightColor, half3 lightDirection, half3 surfaceNormal, half3 viewDirection, half4 specularAmount, half smoothnessAmount) シンプルシェーディング を使用して、面法線のスペキュラーライティングを返します。

アンビエントオクルージョンの計算

Lighting.hlsl ファイルは、以下のメソッドを含む AmbientOcclusion.hlsl ファイルをインポートします。

メソッド 構文 説明
SampleAmbientOcclusion half SampleAmbientOcclusion(float2 normalizedScreenSpaceUV) スクリーンスペースの位置のアンビエントオクルージョン値を返します。0 はオクルージョンされ、1 はオクルージョンされないことを意味します。
GetScreenSpaceAmbientOcclusion AmbientOcclusionFactor GetScreenSpaceAmbientOcclusion(float2 normalizedScreenSpaceUV) スクリーンスペースの位置の間接および直接アンビエントオクルージョン値を返します。0 はオクルージョンされ、1 はオクルージョンされないことを意味します。

詳細は、アンビエントオクルージョン を参照してください。

構造体

AmbientOcclusionFactor

GetScreenSpaceAmbientOcclusion メソッドを使用してこの構造体を返します。

フィールド 説明
half indirectAmbientOcclusion オブジェクトが、間接光を遮るオブジェクトによるアンビエントオクルージョンから影を作られる量。
half directAmbientOcclusion オブジェクトが、直接光を遮るオブジェクトによるアンビエントオクルージョンから影を作られる量。

Light

GetMainLight メソッドと GetAdditionalLight メソッドを使用して、この構造体を返します。

フィールド 説明
half3 direction ライトの向き。
half3 color ライトの色。
float distanceAttenuation オブジェクトからの距離に基づくライトの強さ。
half shadowAttenuation オブジェクトが影の中にあるかどうかに基づくライトの強さ。
uint layerMask ライトのレイヤーマスク。

以下の URP シェーダーは、メインのディレクショナルライトから受けるライトの量でオブジェクト面を描画します。

Shader "Custom/LambertLighting"
{
    SubShader
    {
        Tags { "RenderType" = "Opaque" "RenderPipeline" = "UniversalPipeline" }

        Pass
        {
            HLSLPROGRAM

            #pragma vertex vert
            #pragma fragment frag

            #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl"

            struct Attributes
            {
                float4 positionOS : POSITION;
                float2 uv: TEXCOORD0;
            };

            struct Varyings
            {
                float4 positionCS  : SV_POSITION;
                float2 uv: TEXCOORD0;
                half3 lightAmount : TEXCOORD2;
            };

            Varyings vert(Attributes IN)
            {
                Varyings OUT;

                OUT.positionCS = TransformObjectToHClip(IN.positionOS.xyz);

                // Get the VertexNormalInputs of the vertex, which contains the normal in world space
                VertexNormalInputs positions = GetVertexNormalInputs(IN.positionOS);

                // Get the properties of the main light
                Light light = GetMainLight();

                // Calculate the amount of light the vertex receives
                OUT.lightAmount = LightingLambert(light.color, light.direction, positions.normalWS.xyz);

                return OUT;
            }

            half4 frag(Varyings IN) : SV_Target
            {
                // Set the fragment color to the interpolated amount of light
                return float4(IN.lightAmount, 1);
            }
            ENDHLSL
        }
    }
}

追加リソース

カスタム URP シェーダーでカメラを使用する
Use indirect lighting in a custom URP shader