Shader code cleanupand bug fix.
This commit is contained in:
@@ -11,27 +11,30 @@ namespace Misaki.HdrpToon
|
||||
[HideInInspector]
|
||||
internal class UTSPass : CustomPass
|
||||
{
|
||||
private const int Adjustment_Curve_Precision = 128;
|
||||
private const int _ADJUSTMENT_CURVE_PRECISION = 128;
|
||||
|
||||
private const string Compensation_Prop_Name = "_ToonEvAdjustmentCompensation";
|
||||
private const string Exposure_Adjustment_Prop_Name = "_ToonEvAdjustmentCurve";
|
||||
private const string Exposure_Array_Prop_Name = "_ToonEvAdjustmentValueArray";
|
||||
private const string Exposure_Min_Prop_Name = "_ToonEvAdjustmentValueMin";
|
||||
private const string Exposure_Max_Prop_Name = "_ToonEvAdjustmentValueMax";
|
||||
private const string Toon_Light_Filter_Prop_Name = "_ToonLightHiCutFilter";
|
||||
private const string Ignore_Volume_Exposure_Prop_Name = "_ToonIgnoreExposureMultiplier";
|
||||
private const string _COMPENSATION_PROP_NAME = "_ToonEvAdjustmentCompensation";
|
||||
private const string _EXPOSURE_ADJUSTMENT_PROP_NAME = "_ToonEvAdjustmentCurve";
|
||||
private const string _EXPOSURE_ARRAY_PROP_NAME = "_ToonEvAdjustmentValueArray";
|
||||
private const string _EXPOSURE_MIN_PROP_NAME = "_ToonEvAdjustmentValueMin";
|
||||
private const string _EXPOSURE_MAX_PROP_NAME = "_ToonEvAdjustmentValueMax";
|
||||
private const string _TOON_LIGHT_FILTER_PROP_NAME = "_ToonLightHiCutFilter";
|
||||
private const string _IGNORE_VOLUME_EXPOSURE_PROP_NAME = "_ToonIgnoreExposureMultiplier";
|
||||
|
||||
private const string Hair_Shadow_RTHandle_Scale_Prop_Name = "_HairShadowRTHandleScale";
|
||||
private const string Hair_Shadow_Distance_Prop_Name = "_HairShadowDistance";
|
||||
private const string Hair_Shadow_Distance_Scale_Prop_Name = "_HairShadowDistanceScaleFactor";
|
||||
private const string Hair_Shadow_Depth_Bias_Prop_Name = "_HairShadowDepthBias";
|
||||
private const string Hair_Shadow_FadeIn_Prop_Name = "_HairShadowFadeInDistance";
|
||||
private const string Hair_Shadow_Fade_Out_Prop_Name = "_HairShadowFadeOutDistance";
|
||||
private const string _HAIR_SHADOW_RTHANDLE_SCALE_PROP_NAME = "_HairShadowRTHandleScale";
|
||||
private const string _HAIR_SHADOW_DISTANCE_PROP_NAME = "_HairShadowDistance";
|
||||
private const string _HAIR_SHADOW_DISTANCE_SCALE_PROP_NAME = "_HairShadowDistanceScaleFactor";
|
||||
private const string _HAIR_SHADOW_DEPTH_BIAS_PROP_NAME = "_HairShadowDepthBias";
|
||||
private const string _HAIR_SHADOW_FADEIN_PROP_NAME = "_HairShadowFadeInDistance";
|
||||
private const string _HAIR_SHADOW_FADE_OUT_PROP_NAME = "_HairShadowFadeOutDistance";
|
||||
|
||||
private const string Hair_Blending_RTHandle_Scale_Prop_Name = "_HairBlendingRTHandleScale";
|
||||
private const string _HAIR_BLENDING_RTHANDLE_SCALE_PROP_NAME = "_HairBlendingRTHandleScale";
|
||||
|
||||
private const string Output_RT_Prop_Name = "_HairShadowTex";
|
||||
private const string Hair_Blending_Prop_Name = "_HairBlendingTex";
|
||||
private const string _HAIR_SHADOW_RT_PROP_NAME = "_HairShadowTex";
|
||||
private const string _HAIR_BLENDING_PROP_NAME = "_HairBlendingTex";
|
||||
|
||||
private static readonly ProfilingSampler _hairShadowProfilingSampler = new("UTS Hair Shadow");
|
||||
private static readonly ProfilingSampler _hairBlendingProfilingSampler = new("UTS Hair Blending Target");
|
||||
|
||||
private float _max;
|
||||
private float _min;
|
||||
@@ -146,16 +149,9 @@ namespace Misaki.HdrpToon
|
||||
_ => Vector2.zero
|
||||
};
|
||||
|
||||
var format = _hairShadowQuality switch
|
||||
{
|
||||
BufferQuality.Low => GraphicsFormat.D16_UNorm,
|
||||
BufferQuality.High => GraphicsFormat.D32_SFloat,
|
||||
_ => GraphicsFormat.D16_UNorm
|
||||
};
|
||||
|
||||
_hairShadowRTHandle?.Release();
|
||||
_hairShadowRTHandle = RTHandles.Alloc(scale, colorFormat: format, isShadowMap: true, useDynamicScale: true, name: Output_RT_Prop_Name);
|
||||
Shader.SetGlobalTexture(Output_RT_Prop_Name, _hairShadowRTHandle);
|
||||
_hairShadowRTHandle = RTHandles.Alloc(scale, useDynamicScale: true, format: GraphicsFormat.D16_UNorm, isShadowMap: true, name: _HAIR_SHADOW_RT_PROP_NAME);
|
||||
Shader.SetGlobalTexture(_HAIR_SHADOW_RT_PROP_NAME, _hairShadowRTHandle);
|
||||
|
||||
_needReallocateHairShadow = false;
|
||||
}
|
||||
@@ -182,93 +178,20 @@ namespace Misaki.HdrpToon
|
||||
};
|
||||
|
||||
_hairBlendingRTHandle?.Release();
|
||||
_hairBlendingRTHandle = RTHandles.Alloc(Vector2.one, colorFormat: format, useDynamicScale: true, name: Hair_Blending_Prop_Name);
|
||||
Shader.SetGlobalTexture(Hair_Blending_Prop_Name, _hairBlendingRTHandle);
|
||||
_hairBlendingRTHandle = RTHandles.Alloc(Vector2.one, useDynamicScale: true, dimension: TextureXR.dimension, colorFormat: format, name: _HAIR_BLENDING_PROP_NAME);
|
||||
Shader.SetGlobalTexture(_HAIR_BLENDING_PROP_NAME, _hairBlendingRTHandle);
|
||||
|
||||
_needReallocateHairBlending = false;
|
||||
}
|
||||
|
||||
protected override void Setup(ScriptableRenderContext renderContext, CommandBuffer cmd)
|
||||
{
|
||||
_exposureArray = new float[Adjustment_Curve_Precision];
|
||||
_exposureArray = new float[_ADJUSTMENT_CURVE_PRECISION];
|
||||
|
||||
ReallocateHairShadowBuffer();
|
||||
ReallocateHairBlendingBuffer();
|
||||
}
|
||||
|
||||
protected override void Execute(CustomPassContext ctx)
|
||||
{
|
||||
var utsRenderer = ctx.hdCamera.volumeStack.GetComponent<UTSRenderer>();
|
||||
|
||||
UpdateSceneEV(utsRenderer);
|
||||
RenderHairShadow(ref ctx, utsRenderer);
|
||||
RenderHairBlending(ref ctx);
|
||||
}
|
||||
|
||||
private void RenderHairShadow(ref CustomPassContext ctx, UTSRenderer utsRenderer)
|
||||
{
|
||||
if (!_enableHairShadow)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (ShouldReallocateHairShadowBuffer())
|
||||
{
|
||||
ReallocateHairShadowBuffer();
|
||||
return;
|
||||
}
|
||||
|
||||
CoreUtils.SetRenderTarget(ctx.cmd, _hairShadowRTHandle, ClearFlag.DepthStencil);
|
||||
|
||||
var shouldRender = utsRenderer != null && utsRenderer.enableHairShadow.value && utsRenderer.state.value;
|
||||
if (!shouldRender)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
var result = new RendererListDesc(UtsShaderPassName.hairShadowCasterPassId, ctx.cullingResults, ctx.hdCamera.camera)
|
||||
{
|
||||
renderQueueRange = GetRenderQueueRange(RenderQueueType.All),
|
||||
sortingCriteria = SortingCriteria.CommonOpaque,
|
||||
excludeObjectMotionVectors = false,
|
||||
};
|
||||
|
||||
CoreUtils.DrawRendererList(ctx.renderContext, ctx.cmd, ctx.renderContext.CreateRendererList(result));
|
||||
|
||||
Shader.SetGlobalVector(Hair_Shadow_RTHandle_Scale_Prop_Name, _hairShadowRTHandle.rtHandleProperties.rtHandleScale);
|
||||
Shader.SetGlobalFloat(Hair_Shadow_Distance_Prop_Name, utsRenderer.shadowDistance.value);
|
||||
Shader.SetGlobalFloat(Hair_Shadow_Distance_Scale_Prop_Name, utsRenderer.shadowDistanceScale.value);
|
||||
Shader.SetGlobalFloat(Hair_Shadow_Depth_Bias_Prop_Name, utsRenderer.shadowDepthBias.value);
|
||||
Shader.SetGlobalFloat(Hair_Shadow_FadeIn_Prop_Name, utsRenderer.shadowFadeIn.value);
|
||||
Shader.SetGlobalFloat(Hair_Shadow_Fade_Out_Prop_Name, utsRenderer.shadowFadeOut.value);
|
||||
}
|
||||
|
||||
private void RenderHairBlending(ref CustomPassContext ctx)
|
||||
{
|
||||
if (!_enableHairBlending)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (ShouldReallocateHairBlendingBuffer())
|
||||
{
|
||||
ReallocateHairBlendingBuffer();
|
||||
return;
|
||||
}
|
||||
|
||||
CoreUtils.SetRenderTarget(ctx.cmd, _hairBlendingRTHandle, ctx.cameraDepthBuffer, ClearFlag.Color);
|
||||
|
||||
var result = new RendererListDesc(UtsShaderPassName.hairBlendingTargetPassId, ctx.cullingResults, ctx.hdCamera.camera)
|
||||
{
|
||||
renderQueueRange = GetRenderQueueRange(RenderQueueType.All),
|
||||
sortingCriteria = SortingCriteria.CommonOpaque,
|
||||
excludeObjectMotionVectors = false,
|
||||
};
|
||||
|
||||
CoreUtils.DrawRendererList(ctx.renderContext, ctx.cmd, ctx.renderContext.CreateRendererList(result));
|
||||
Shader.SetGlobalVector(Hair_Blending_RTHandle_Scale_Prop_Name, _hairBlendingRTHandle.rtHandleProperties.rtHandleScale);
|
||||
}
|
||||
|
||||
private void UpdateSceneEV(UTSRenderer utsRenderer)
|
||||
{
|
||||
if (utsRenderer == null)
|
||||
@@ -307,22 +230,98 @@ namespace Misaki.HdrpToon
|
||||
{
|
||||
_min = curve[0].time;
|
||||
_max = curve[curve.length - 1].time;
|
||||
var step = (_max - _min) / (Adjustment_Curve_Precision - 1f);
|
||||
var step = (_max - _min) / (_ADJUSTMENT_CURVE_PRECISION - 1f);
|
||||
|
||||
for (var i = 0; i < Adjustment_Curve_Precision; i++)
|
||||
for (var i = 0; i < _ADJUSTMENT_CURVE_PRECISION; i++)
|
||||
{
|
||||
_exposureArray[i] = curve.Evaluate(_min + step * i);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Shader.SetGlobalFloatArray(Exposure_Array_Prop_Name, _exposureArray);
|
||||
Shader.SetGlobalFloat(Exposure_Min_Prop_Name, _min);
|
||||
Shader.SetGlobalFloat(Exposure_Max_Prop_Name, _max);
|
||||
Shader.SetGlobalInt(Exposure_Adjustment_Prop_Name, toonEVAdjustment);
|
||||
Shader.SetGlobalInt(Toon_Light_Filter_Prop_Name, lightIntensityLimiter);
|
||||
Shader.SetGlobalInt(Ignore_Volume_Exposure_Prop_Name, ignoreVolumeExposure);
|
||||
Shader.SetGlobalFloat(Compensation_Prop_Name, compensation);
|
||||
Shader.SetGlobalFloatArray(_EXPOSURE_ARRAY_PROP_NAME, _exposureArray);
|
||||
Shader.SetGlobalFloat(_EXPOSURE_MIN_PROP_NAME, _min);
|
||||
Shader.SetGlobalFloat(_EXPOSURE_MAX_PROP_NAME, _max);
|
||||
Shader.SetGlobalInt(_EXPOSURE_ADJUSTMENT_PROP_NAME, toonEVAdjustment);
|
||||
Shader.SetGlobalInt(_TOON_LIGHT_FILTER_PROP_NAME, lightIntensityLimiter);
|
||||
Shader.SetGlobalInt(_IGNORE_VOLUME_EXPOSURE_PROP_NAME, ignoreVolumeExposure);
|
||||
Shader.SetGlobalFloat(_COMPENSATION_PROP_NAME, compensation);
|
||||
}
|
||||
|
||||
private void RenderHairShadow(ref CustomPassContext ctx, UTSRenderer utsRenderer)
|
||||
{
|
||||
if (!_enableHairShadow
|
||||
|| utsRenderer == null
|
||||
|| !utsRenderer.state.value
|
||||
|| !utsRenderer.enableHairShadow.value)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (ShouldReallocateHairShadowBuffer())
|
||||
{
|
||||
ReallocateHairShadowBuffer();
|
||||
return;
|
||||
}
|
||||
|
||||
using (new ProfilingScope(ctx.cmd, _hairShadowProfilingSampler))
|
||||
{
|
||||
CoreUtils.SetRenderTarget(ctx.cmd, _hairShadowRTHandle, ClearFlag.Depth);
|
||||
|
||||
var result = new RendererListDesc(UtsShaderPassName.hairShadowCasterPassId, ctx.cullingResults, ctx.hdCamera.camera)
|
||||
{
|
||||
renderQueueRange = GetRenderQueueRange(RenderQueueType.AllOpaque),
|
||||
sortingCriteria = SortingCriteria.CommonOpaque,
|
||||
excludeObjectMotionVectors = false,
|
||||
};
|
||||
|
||||
CoreUtils.DrawRendererList(ctx.renderContext, ctx.cmd, ctx.renderContext.CreateRendererList(result));
|
||||
|
||||
Shader.SetGlobalVector(_HAIR_SHADOW_RTHANDLE_SCALE_PROP_NAME, _hairShadowRTHandle.rtHandleProperties.rtHandleScale);
|
||||
Shader.SetGlobalFloat(_HAIR_SHADOW_DISTANCE_PROP_NAME, utsRenderer.shadowDistance.value);
|
||||
Shader.SetGlobalFloat(_HAIR_SHADOW_DISTANCE_SCALE_PROP_NAME, utsRenderer.shadowDistanceScale.value);
|
||||
Shader.SetGlobalFloat(_HAIR_SHADOW_DEPTH_BIAS_PROP_NAME, utsRenderer.shadowDepthBias.value);
|
||||
Shader.SetGlobalFloat(_HAIR_SHADOW_FADEIN_PROP_NAME, utsRenderer.shadowFadeIn.value);
|
||||
Shader.SetGlobalFloat(_HAIR_SHADOW_FADE_OUT_PROP_NAME, utsRenderer.shadowFadeOut.value);
|
||||
}
|
||||
}
|
||||
|
||||
private void RenderHairBlending(ref CustomPassContext ctx)
|
||||
{
|
||||
if (!_enableHairBlending)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (ShouldReallocateHairBlendingBuffer())
|
||||
{
|
||||
ReallocateHairBlendingBuffer();
|
||||
return;
|
||||
}
|
||||
|
||||
using (new ProfilingScope(ctx.cmd, _hairBlendingProfilingSampler))
|
||||
{
|
||||
CoreUtils.SetRenderTarget(ctx.cmd, _hairBlendingRTHandle, ctx.cameraDepthBuffer, ClearFlag.Color);
|
||||
|
||||
var result = new RendererListDesc(UtsShaderPassName.hairBlendingTargetPassId, ctx.cullingResults, ctx.hdCamera.camera)
|
||||
{
|
||||
renderQueueRange = GetRenderQueueRange(RenderQueueType.AllOpaque),
|
||||
sortingCriteria = SortingCriteria.CommonOpaque,
|
||||
excludeObjectMotionVectors = false,
|
||||
};
|
||||
|
||||
CoreUtils.DrawRendererList(ctx.renderContext, ctx.cmd, ctx.renderContext.CreateRendererList(result));
|
||||
Shader.SetGlobalVector(_HAIR_BLENDING_RTHANDLE_SCALE_PROP_NAME, _hairBlendingRTHandle.rtHandleProperties.rtHandleScale);
|
||||
}
|
||||
}
|
||||
|
||||
protected override void Execute(CustomPassContext ctx)
|
||||
{
|
||||
var utsRenderer = ctx.hdCamera.volumeStack.GetComponent<UTSRenderer>();
|
||||
|
||||
UpdateSceneEV(utsRenderer);
|
||||
RenderHairShadow(ref ctx, utsRenderer);
|
||||
RenderHairBlending(ref ctx);
|
||||
}
|
||||
|
||||
protected override void Cleanup()
|
||||
|
||||
Reference in New Issue
Block a user