您最多选择25个主题
主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
52 行
2.0 KiB
52 行
2.0 KiB
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
|
|
namespace UnityEngine.Experimental.Rendering.HDPipeline
|
|
{
|
|
public class LightUtils
|
|
{
|
|
// Physical light unit helper
|
|
// All light unit are in lumen (Luminous power)
|
|
// Punctual light (point, spot) are convert to candela (cd = lumens / steradian)
|
|
// Area light are convert to luminance (cd/(m^2*steradian)) with the following formulation: Luminous Power / (Area * PI * steradian)
|
|
|
|
// Ref: Moving Frostbite to PBR
|
|
public static float ConvertPointLightIntensity(float intensity)
|
|
{
|
|
return intensity / (4.0f * Mathf.PI);
|
|
}
|
|
|
|
// angle is the full angle, not the half angle in radiant
|
|
public static float ConvertSpotLightIntensity(float intensity, float angle, bool exact)
|
|
{
|
|
return exact ? intensity / (2.0f * (1.0f - Mathf.Cos(angle / 2.0f)) * Mathf.PI) : intensity / Mathf.PI;
|
|
}
|
|
|
|
// angleA and angleB are the full opening angle, not half angle
|
|
public static float ConvertFrustrumLightIntensity(float intensity, float angleA, float angleB)
|
|
{
|
|
return intensity / (4.0f * Mathf.Asin(Mathf.Sin(angleA / 2.0f) * Mathf.Sin(angleB / 2.0f)));
|
|
}
|
|
|
|
public static float ConvertSphereLightIntensity(float intensity, float sphereRadius)
|
|
{
|
|
return intensity / (4.0f * Mathf.PI * sphereRadius * sphereRadius * Mathf.PI * Mathf.PI);
|
|
}
|
|
|
|
public static float ConvertDiscLightIntensity(float intensity, float discRadius)
|
|
{
|
|
return intensity / (discRadius * discRadius * Mathf.PI * Mathf.PI);
|
|
}
|
|
|
|
public static float ConvertRectLightIntensity(float intensity, float width, float height)
|
|
{
|
|
return intensity / (width * height * Mathf.PI);
|
|
}
|
|
|
|
public static float calculateLineLightArea(float intensity, float lineRadius, float lineWidth)
|
|
{
|
|
return intensity / (2.0f * Mathf.PI * lineRadius * lineWidth * Mathf.PI);
|
|
}
|
|
}
|
|
}
|