浏览代码

Moved area light convertion code to LightUtils

/main
Antoine Lelievre 6 年前
当前提交
f41c533f
共有 3 个文件被更改,包括 68 次插入26 次删除
  1. 24
      com.unity.render-pipelines.high-definition/HDRP/Editor/Lighting/HDLightEditor.cs
  2. 20
      com.unity.render-pipelines.high-definition/HDRP/Lighting/Light/HDAdditionalLightData.cs
  3. 50
      com.unity.render-pipelines.high-definition/HDRP/Lighting/LightUtils.cs

24
com.unity.render-pipelines.high-definition/HDRP/Editor/Lighting/HDLightEditor.cs


enum DirectionalLightUnit
{
Lux = LightUnit.Lux,
Ev = LightUnit.Ev,
}
enum AreaLightUnit

{
Lumen = LightUnit.Lumen,
Candela = LightUnit.Candela,
Ev = LightUnit.Ev,
}
const float k_MinAreaWidth = 0.01f; // Provide a small size of 1cm for line light

// For area lights
if (oldLightUnit == LightUnit.Lumen && newLightUnit == LightUnit.Luminance)
{
if (m_LightShape == LightShape.Rectangle)
intensity = LightUtils.ConvertRectLightLumenToLuminance(intensity, m_AdditionalLightData.shapeWidth.floatValue, m_AdditionalLightData.shapeHeight.floatValue);
else if (m_LightShape == LightShape.Line)
intensity = LightUtils.CalculateLineLightLumenToLuminance(intensity, m_AdditionalLightData.shapeWidth.floatValue);
}
intensity = LightUtils.ConvertAreaLightLumenToLuminance((LightTypeExtent)m_AdditionalLightData.lightTypeExtent.enumValueIndex, intensity, m_AdditionalLightData.shapeWidth.floatValue, m_AdditionalLightData.shapeHeight.floatValue);
{
if (m_LightShape == LightShape.Rectangle)
intensity = LightUtils.ConvertRectLightLuminanceToLumen(intensity, m_AdditionalLightData.shapeWidth.floatValue, m_AdditionalLightData.shapeHeight.floatValue);
else if (m_LightShape == LightShape.Line)
intensity = LightUtils.CalculateLineLightLuminanceToLumen(intensity, m_AdditionalLightData.shapeWidth.floatValue);
}
intensity = LightUtils.ConvertAreaLightLuminanceToLumen((LightTypeExtent)m_AdditionalLightData.lightTypeExtent.enumValueIndex, intensity, m_AdditionalLightData.shapeWidth.floatValue, m_AdditionalLightData.shapeHeight.floatValue);
if (oldLightUnit == LightUnit.Luminance && newLightUnit == LightUnit.Ev)
intensity = LightUtils.ConvertLuminanceToEv(intensity);
if (oldLightUnit == LightUnit.Ev && newLightUnit == LightUnit.Luminance)
intensity = LightUtils.ConvertEvToLuminance(intensity);
if (oldLightUnit == LightUnit.Ev && newLightUnit == LightUnit.Lumen)
intensity = LightUtils.ConvertAreaLightEvToLumen((LightTypeExtent)m_AdditionalLightData.lightTypeExtent.enumValueIndex, intensity, m_AdditionalLightData.shapeWidth.floatValue, m_AdditionalLightData.shapeHeight.floatValue);
if (oldLightUnit == LightUnit.Lumen && newLightUnit == LightUnit.Ev)
intensity = LightUtils.ConvertAreaLightLumenToEv((LightTypeExtent)m_AdditionalLightData.lightTypeExtent.enumValueIndex, intensity, m_AdditionalLightData.shapeWidth.floatValue, m_AdditionalLightData.shapeHeight.floatValue);
m_AdditionalLightData.intensity.floatValue = intensity;
}

20
com.unity.render-pipelines.high-definition/HDRP/Lighting/Light/HDAdditionalLightData.cs


if (lightUnit == LightUnit.Lumen)
{
switch (lightTypeExtent)
{
case LightTypeExtent.Punctual:
SetLightIntensityPunctual(intensity);
break;
case LightTypeExtent.Line:
m_Light.intensity = LightUtils.CalculateLineLightLumenToLuminance(intensity, shapeWidth);
break;
case LightTypeExtent.Rectangle:
m_Light.intensity = LightUtils.ConvertRectLightLumenToLuminance(intensity, shapeWidth, shapeHeight);
break;
}
if (lightTypeExtent == LightTypeExtent.Punctual)
SetLightIntensityPunctual(intensity);
else
m_Light.intensity = LightUtils.ConvertAreaLightLumenToLuminance(lightTypeExtent, intensity, shapeWidth, shapeHeight);
}
else if (lightUnit == LightUnit.Ev)
{
m_Light.intensity = LightUtils.ConvertEvToLuminance(intensity);
}
else
m_Light.intensity = intensity;

50
com.unity.render-pipelines.high-definition/HDRP/Lighting/LightUtils.cs


return intensity * ((width * height) * Mathf.PI);
}
public static float ConvertEvToLuminance(float ev)
{
return Mathf.Pow(2, ev - 3);
}
public static float ConvertLuminanceToEv(float luminance)
{
const float k = 12.5f;
return (float)Math.Log((luminance * 100f) / k, 2);
}
public static float ConvertAreaLightLumenToLuminance(LightTypeExtent areaLightType, float lumen, float width, float height = 0)
{
switch (areaLightType)
{
case LightTypeExtent.Line:
return LightUtils.CalculateLineLightLumenToLuminance(lumen, width);
case LightTypeExtent.Rectangle:
return LightUtils.ConvertRectLightLumenToLuminance(lumen, width, height);
}
return lumen;
}
public static float ConvertAreaLightLuminanceToLumen(LightTypeExtent areaLightType, float luminance, float width, float height = 0)
{
switch (areaLightType)
{
case LightTypeExtent.Line:
return LightUtils.CalculateLineLightLuminanceToLumen(luminance, width);
case LightTypeExtent.Rectangle:
return LightUtils.ConvertRectLightLuminanceToLumen(luminance, width, height);
}
return luminance;
}
public static float ConvertAreaLightLumenToEv(LightTypeExtent areaLightType, float lumen, float width, float height)
{
float luminance = ConvertAreaLightLumenToLuminance(areaLightType, lumen, width, height);
return ConvertLuminanceToEv(luminance);
}
public static float ConvertAreaLightEvToLumen(LightTypeExtent areaLightType, float ev, float width, float height)
{
float luminance = ConvertEvToLuminance(ev);
return ConvertAreaLightLuminanceToLumen(areaLightType, luminance, width, height);
}
// convert intensity (lumen) to nits
public static float CalculateLineLightLumenToLuminance(float intensity, float lineWidth)
{

正在加载...
取消
保存