カスタムユニバーサルレンダーパイプライン (URP) シェーダーでライティングを使用するには、以下の手順に従います。
HLSLPROGRAM 内に #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" を追加します。
Lighting.hlsl ファイルは、以下のメソッドを含む RealtimeLights.hlsl ファイルをインポートします。
| メソッド | 構文 | 説明 |
|---|---|---|
GetMainLight |
Light GetMainLight() |
シーンのメインライトを返します。 |
GetAdditionalLight |
Light GetAdditionalLight(uint lightIndex, float3 positionInWorldSpace) |
positionWS に影響する lightIndex の追加ライトを返します。例えば、lightIndex が 0 の場合、このメソッドは最初の追加ライトを返します。 |
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 はオクルージョンされないことを意味します。 |
詳細は、アンビエントオクルージョン を参照してください。
GetScreenSpaceAmbientOcclusion メソッドを使用してこの構造体を返します。
| フィールド | 説明 |
|---|---|
half indirectAmbientOcclusion |
オブジェクトが、間接光を遮るオブジェクトによるアンビエントオクルージョンから影を作られる量。 |
half directAmbientOcclusion |
オブジェクトが、直接光を遮るオブジェクトによるアンビエントオクルージョンから影を作られる量。 |
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
}
}
}