You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

119 lines
5.0 KiB

using System.Collections.Generic;
using System;
using UnityEngine;
using UnityEditor.Graphing;
using UnityEditor.ShaderGraph;
using UnityEditor.ShaderGraph.Drawing.Controls;
using UnityEditor.ShaderGraph.Internal;
using UnityEngine.Rendering.HighDefinition;
using System.Reflection;
namespace UnityEditor.Rendering.HighDefinition
{
[SRPFilter(typeof(HDRenderPipeline))]
[Title("Input", "High Definition Render Pipeline", "HD Scene Depth")]
sealed class HDSceneDepthNode : AbstractMaterialNode, IGeneratesBodyCode, IGeneratesFunction, IMayRequireScreenPosition, IMayRequireDepthTexture, IMayRequireNDCPosition
{
const string k_ScreenPositionSlotName = "UV";
const string k_LodInputSlotName = "Lod";
const string k_OutputSlotName = "Output";
const int k_ScreenPositionSlotId = 0;
const int k_LodInputSlotId = 1;
const int k_OutputSlotId = 2;
[SerializeField]
private DepthSamplingMode m_DepthSamplingMode = DepthSamplingMode.Linear01;
[EnumControl("Sampling Mode")]
public DepthSamplingMode depthSamplingMode
{
get { return m_DepthSamplingMode; }
set
{
if (m_DepthSamplingMode == value)
return;
m_DepthSamplingMode = value;
Dirty(ModificationScope.Graph);
}
}
public override string documentationURL => NodeUtils.GetDocumentationString("HD-Scene-Depth");
public HDSceneDepthNode()
{
name = "HD Scene Depth";
synonyms = new string[] { "hdzbuffer", "hdzdepth" };
UpdateNodeAfterDeserialization();
}
public override bool hasPreview { get { return false; } }
public sealed override void UpdateNodeAfterDeserialization()
{
AddSlot(new ScreenPositionMaterialSlot(k_ScreenPositionSlotId, k_ScreenPositionSlotName, k_ScreenPositionSlotName, ScreenSpaceType.Default));
AddSlot(new Vector1MaterialSlot(k_LodInputSlotId, k_LodInputSlotName, k_LodInputSlotName, SlotType.Input, 0, ShaderStageCapability.Fragment));
AddSlot(new Vector1MaterialSlot(k_OutputSlotId, k_OutputSlotName, k_OutputSlotName, SlotType.Output, 0, ShaderStageCapability.Fragment));
RemoveSlotsNameNotMatching(new[]
{
k_ScreenPositionSlotId,
k_LodInputSlotId,
k_OutputSlotId,
});
}
string GetFunctionName() => "Unity_HDRP_SampleSceneDepth_$precision";
public void GenerateNodeFunction(FunctionRegistry registry, GenerationMode generationMode)
{
// Preview SG doesn't have access to HDRP depth buffer
if (!generationMode.IsPreview())
{
registry.ProvideFunction(GetFunctionName(), s =>
{
registry.builder.AppendLine("StructuredBuffer<int2> _DepthPyramidMipLevelOffsets;");
s.AppendLine("$precision {0}($precision2 uv, $precision lod)", GetFunctionName());
using (s.BlockScope())
{
s.AppendLine("#if defined(REQUIRE_DEPTH_TEXTURE) && defined(SHADERPASS) && (SHADERPASS != SHADERPASS_LIGHT_TRANSPORT)");
s.AppendLine("int2 coord = int2(uv * _ScreenSize.xy);");
s.AppendLine("int2 mipCoord = coord.xy >> int(lod);");
s.AppendLine("int2 mipOffset = _DepthPyramidMipLevelOffsets[int(lod)];");
s.AppendLine("return LOAD_TEXTURE2D_X(_CameraDepthTexture, mipOffset + mipCoord).r;");
s.AppendLine("#endif");
s.AppendLine("return 0.0;");
}
});
}
}
public void GenerateNodeCode(ShaderStringBuilder sb, GenerationMode generationMode)
{
if (generationMode.IsPreview())
{
sb.AppendLine("$precision {0} = 0.0;", GetVariableNameForSlot(k_OutputSlotId));
}
else
{
string uv = GetSlotValue(k_ScreenPositionSlotId, generationMode);
string lod = GetSlotValue(k_LodInputSlotId, generationMode);
string depth = $"{GetFunctionName()}({uv}.xy, {lod})";
if (depthSamplingMode == DepthSamplingMode.Eye)
depth = $"LinearEyeDepth({depth}, _ZBufferParams)";
if (depthSamplingMode == DepthSamplingMode.Linear01)
depth = $"Linear01Depth({depth}, _ZBufferParams)";
sb.AppendLine($"$precision {GetVariableNameForSlot(k_OutputSlotId)} = {depth};");
}
}
public bool RequiresDepthTexture(ShaderStageCapability stageCapability) => true;
public bool RequiresNDCPosition(ShaderStageCapability stageCapability = ShaderStageCapability.All) => true;
public bool RequiresScreenPosition(ShaderStageCapability stageCapability = ShaderStageCapability.All) => true;
}
}