Unity/Code

[Shader Graph][CODE] Custom Function - Light

김성인 2023. 8. 7. 20:38

 

Shader Graph v14.0.8에서 작성

 

Custom Function으로 사용하기 위한 코드 백업


Main Light

 

void CustomLight_float( float3 WorldPos, out float3 Direction , out float3 Color, out float ShadowAtten, out float DistanceAtten)
{
    #ifdef SHADERGRAPH_PREVIEW
        Direction = float3(1,1,1);
        Color = float3(1,1,1);
        ShadowAtten = 1.0f;
        DistanceAtten = 1.0f;
    #else
    
    #if defined(_MAIN_LIGHT_SHADOWS_SCREEN) && !defined(_SURFACE_TYPE_TRANSPARENT)
    half4 clipPos = TransformWorldToHClip(WorldPos);
    half4 shadowCoord =  ComputeScreenPos(clipPos);
    #else
    half4 shadowCoord =  TransformWorldToShadowCoord(WorldPos);
    #endif
     
    Light light = GetMainLight();
    Direction = light.direction;
    Color = light.color;
    DistanceAtten = light.distanceAttenuation;

    #if !defined(_MAIN_LIGHT_SHADOWS) || defined(_RECEIVE_SHADOWS_OFF)
        ShadowAtten = 1.0f;
    #endif

    #if SHADOWS_SCREEN
        ShadowAtten = SampleScreenSpaceShadowmap(shadowCoord);
    #else
        ShadowSamplingData shadowSamplingData = GetMainLightShadowSamplingData();
        half shadowStrength = GetMainLightShadowStrength();
        ShadowAtten = SampleShadowmap(shadowCoord, TEXTURE2D_ARGS(_MainLightShadowmapTexture,
        sampler_MainLightShadowmapTexture),
        shadowSamplingData, shadowStrength, false);
    #endif

    #endif
}

 


Additional Light


void AdditionalLights_float(float3 WorldPos, float3 WorldNormal, float3 WorldView, out float3 Diffuse)
{
    float3 diffuseColor = 0;

#ifndef SHADERGRAPH_PREVIEW
    WorldNormal = normalize(WorldNormal);
    WorldView = SafeNormalize(WorldView);
    int pixelLightCount = GetAdditionalLightsCount();
    for (int i = 0; i < pixelLightCount; ++i)
    {
        Light light = GetAdditionalLight(i, WorldPos);
        half3 attenuatedLightColor = light.color * (light.distanceAttenuation * light.shadowAttenuation);
        diffuseColor += LightingLambert(attenuatedLightColor, light.direction, WorldNormal);
    }
#endif

    Diffuse = diffuseColor;
}