您最多选择25个主题
主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
71 行
3.1 KiB
71 行
3.1 KiB
using System;
|
|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
using UnityEngine.Rendering;
|
|
|
|
namespace UnityEngine.Experimental.Rendering.HDPipeline
|
|
{
|
|
public class VolumetricFog : AtmosphericScattering
|
|
{
|
|
public ColorParameter albedo = new ColorParameter(Color.white);
|
|
public MinFloatParameter meanFreePath = new MinFloatParameter(1000000.0f, 1.0f);
|
|
public ClampedFloatParameter anisotropy = new ClampedFloatParameter(0.0f, -1.0f, 1.0f);
|
|
public ClampedFloatParameter globalLightProbeDimmer = new ClampedFloatParameter(1.0f, 0.0f, 1.0f);
|
|
|
|
// Override the volume blending function.
|
|
public override void Override(VolumeComponent state, float lerpFactor)
|
|
{
|
|
VolumetricFog other = state as VolumetricFog;
|
|
|
|
float thisExtinction = VolumeRenderingUtils.ExtinctionFromMeanFreePath(meanFreePath);
|
|
Vector3 thisScattering = VolumeRenderingUtils.ScatteringFromExtinctionAndAlbedo(thisExtinction, (Vector3)(Vector4)albedo.value);
|
|
|
|
float otherExtinction = VolumeRenderingUtils.ExtinctionFromMeanFreePath(other.meanFreePath);
|
|
Vector3 otherScattering = VolumeRenderingUtils.ScatteringFromExtinctionAndAlbedo(otherExtinction, (Vector3)(Vector4)other.albedo.value);
|
|
|
|
float blendExtinction = Mathf.Lerp(otherExtinction, thisExtinction, lerpFactor);
|
|
Vector3 blendScattering = Vector3.Lerp(otherScattering, thisScattering, lerpFactor);
|
|
float blendAsymmetry = Mathf.Lerp(other.anisotropy, anisotropy, lerpFactor);
|
|
|
|
float blendMeanFreePath = VolumeRenderingUtils.MeanFreePathFromExtinction(blendExtinction);
|
|
Color blendAlbedo = (Color)(Vector4)VolumeRenderingUtils.AlbedoFromMeanFreePathAndScattering(blendMeanFreePath, blendScattering);
|
|
float blendDimmer = Mathf.Lerp(other.globalLightProbeDimmer, globalLightProbeDimmer, lerpFactor);
|
|
|
|
blendAlbedo.a = 1.0f;
|
|
|
|
if (meanFreePath.overrideState)
|
|
{
|
|
other.meanFreePath.value = blendMeanFreePath;
|
|
}
|
|
|
|
if (albedo.overrideState)
|
|
{
|
|
other.albedo.value = blendAlbedo;
|
|
}
|
|
|
|
if (anisotropy.overrideState)
|
|
{
|
|
other.anisotropy.value = blendAsymmetry;
|
|
}
|
|
|
|
if (globalLightProbeDimmer.overrideState)
|
|
{
|
|
other.globalLightProbeDimmer.value = blendDimmer;
|
|
}
|
|
}
|
|
|
|
public override void PushShaderParameters(HDCamera hdCamera, CommandBuffer cmd)
|
|
{
|
|
DensityVolumeParameters param = new DensityVolumeParameters(albedo, meanFreePath, anisotropy);
|
|
|
|
DensityVolumeData data = param.GetData();
|
|
|
|
cmd.SetGlobalInt(HDShaderIDs._AtmosphericScatteringType, (int)FogType.Volumetric);
|
|
|
|
cmd.SetGlobalVector(HDShaderIDs._GlobalScattering, data.scattering);
|
|
cmd.SetGlobalFloat(HDShaderIDs._GlobalExtinction, data.extinction);
|
|
cmd.SetGlobalFloat(HDShaderIDs._GlobalAnisotropy, anisotropy);
|
|
}
|
|
}
|
|
}
|