224 lines
9.9 KiB
C#

using UnityEngine.Rendering.HighDefinition.Attributes;
using UnityEngine.Experimental.Rendering;
namespace UnityEngine.Rendering.HighDefinition
{
partial class Lit : RenderPipelineMaterial
{
// Currently we have only one materialId (Standard GGX), so it is not store in the GBuffer and we don't test for it
// If change, be sure it match what is done in Lit.hlsl: MaterialFeatureFlagsFromGBuffer
// Material bit mask must match the size define LightDefinitions.s_MaterialFeatureMaskFlags value
[GenerateHLSL(PackingRules.Exact)]
public enum MaterialFeatureFlags
{
LitStandard = 1 << 0, // For material classification we need to identify that we are indeed use as standard material, else we are consider as sky/background element
LitSpecularColor = 1 << 1, // LitSpecularColor is not use statically but only dynamically
LitSubsurfaceScattering = 1 << 2,
LitTransmission = 1 << 3,
LitAnisotropy = 1 << 4,
LitIridescence = 1 << 5,
LitClearCoat = 1 << 6
};
//-----------------------------------------------------------------------------
// SurfaceData
//-----------------------------------------------------------------------------
// Main structure that store the user data (i.e user input of master node in material graph)
[GenerateHLSL(PackingRules.Exact, false, false, true, 1000)]
public struct SurfaceData
{
[SurfaceDataAttributes("Material Features")]
public uint materialFeatures;
// Standard
[MaterialSharedPropertyMapping(MaterialSharedProperty.Albedo)]
[SurfaceDataAttributes("Base Color", false, true, FieldPrecision.Real)]
public Vector3 baseColor;
[SurfaceDataAttributes("Specular Occlusion", precision = FieldPrecision.Real)]
public float specularOcclusion;
[MaterialSharedPropertyMapping(MaterialSharedProperty.Normal)]
[SurfaceDataAttributes(new string[] { "Normal", "Normal View Space" }, true, checkIsNormalized = true)]
public Vector3 normalWS;
[MaterialSharedPropertyMapping(MaterialSharedProperty.Smoothness)]
[SurfaceDataAttributes("Smoothness", precision = FieldPrecision.Real)]
public float perceptualSmoothness;
[MaterialSharedPropertyMapping(MaterialSharedProperty.AmbientOcclusion)]
[SurfaceDataAttributes("Ambient Occlusion", precision = FieldPrecision.Real)]
public float ambientOcclusion;
[MaterialSharedPropertyMapping(MaterialSharedProperty.Metal)]
[SurfaceDataAttributes("Metallic", precision = FieldPrecision.Real)]
public float metallic;
[SurfaceDataAttributes("Coat mask", precision = FieldPrecision.Real)]
public float coatMask;
// MaterialFeature dependent attribute
// Specular Color
[MaterialSharedPropertyMapping(MaterialSharedProperty.Specular)]
[SurfaceDataAttributes("Specular Color", false, true, FieldPrecision.Real)]
public Vector3 specularColor;
// SSS
[SurfaceDataAttributes("Diffusion Profile Hash")]
public uint diffusionProfileHash;
[SurfaceDataAttributes("Subsurface Mask", precision = FieldPrecision.Real)]
public float subsurfaceMask;
// Transmission
// + Diffusion Profile
[SurfaceDataAttributes("Thickness", precision = FieldPrecision.Real)]
public float thickness;
// Anisotropic
[SurfaceDataAttributes("Tangent", true)]
public Vector3 tangentWS;
[SurfaceDataAttributes("Anisotropy", precision = FieldPrecision.Real)]
public float anisotropy; // anisotropic ratio(0->no isotropic; 1->full anisotropy in tangent direction, -1->full anisotropy in bitangent direction)
// Iridescence
[SurfaceDataAttributes("Iridescence Layer Thickness", precision = FieldPrecision.Real)]
public float iridescenceThickness;
[SurfaceDataAttributes("Iridescence Mask", precision = FieldPrecision.Real)]
public float iridescenceMask;
// Forward property only
[SurfaceDataAttributes(new string[] { "Geometric Normal", "Geometric Normal View Space" }, true, precision = FieldPrecision.Real, checkIsNormalized = true)]
public Vector3 geomNormalWS;
// Transparency
// Reuse thickness from SSS
[SurfaceDataAttributes("Index of refraction", precision = FieldPrecision.Real)]
public float ior;
[SurfaceDataAttributes("Transmittance Color", precision = FieldPrecision.Real)]
public Vector3 transmittanceColor;
[SurfaceDataAttributes("Transmittance Absorption Distance", precision = FieldPrecision.Real)]
public float atDistance;
[SurfaceDataAttributes("Transmittance Mask", precision = FieldPrecision.Real)]
public float transmittanceMask;
};
//-----------------------------------------------------------------------------
// BSDFData
//-----------------------------------------------------------------------------
[GenerateHLSL(PackingRules.Exact, false, false, true, 1050)]
public struct BSDFData
{
public uint materialFeatures;
[SurfaceDataAttributes("", false, true, FieldPrecision.Real)]
public Vector3 diffuseColor;
[SurfaceDataAttributes(precision = FieldPrecision.Real)]
public Vector3 fresnel0;
[SurfaceDataAttributes(precision = FieldPrecision.Real)]
public float ambientOcclusion; // Caution: This is accessible only if light layer is enabled, otherwise it is 1
[SurfaceDataAttributes(precision = FieldPrecision.Real)]
public float specularOcclusion;
[SurfaceDataAttributes(new string[] { "Normal WS", "Normal View Space" }, true, checkIsNormalized: true)]
public Vector3 normalWS;
[SurfaceDataAttributes(precision = FieldPrecision.Real)]
public float perceptualRoughness;
[SurfaceDataAttributes(precision = FieldPrecision.Real)]
public float coatMask;
// MaterialFeature dependent attribute
// SpecularColor fold into fresnel0
// SSS
public uint diffusionProfileIndex;
[SurfaceDataAttributes(precision = FieldPrecision.Real)]
public float subsurfaceMask;
// Transmission
// + Diffusion Profile
[SurfaceDataAttributes(precision = FieldPrecision.Real)]
public float thickness;
public bool useThickObjectMode; // Read from the diffusion profile
[SurfaceDataAttributes(precision = FieldPrecision.Real)]
public Vector3 transmittance; // Precomputation of transmittance
// Anisotropic
[SurfaceDataAttributes("", true)]
public Vector3 tangentWS;
[SurfaceDataAttributes("", true)]
public Vector3 bitangentWS;
[SurfaceDataAttributes(precision = FieldPrecision.Real)]
public float roughnessT;
[SurfaceDataAttributes(precision = FieldPrecision.Real)]
public float roughnessB;
[SurfaceDataAttributes(precision = FieldPrecision.Real)]
public float anisotropy;
// Iridescence
[SurfaceDataAttributes(precision = FieldPrecision.Real)]
public float iridescenceThickness;
[SurfaceDataAttributes(precision = FieldPrecision.Real)]
public float iridescenceMask;
// ClearCoat
[SurfaceDataAttributes(precision = FieldPrecision.Real)]
public float coatRoughness; // Automatically fill
// Forward property only
[SurfaceDataAttributes(new string[] { "Geometric Normal", "Geometric Normal View Space" }, true, precision = FieldPrecision.Real, checkIsNormalized = true)]
public Vector3 geomNormalWS;
// Transparency
[SurfaceDataAttributes(precision = FieldPrecision.Real)]
public float ior;
// Reuse thickness from SSS
[SurfaceDataAttributes(precision = FieldPrecision.Real)]
public Vector3 absorptionCoefficient;
[SurfaceDataAttributes(precision = FieldPrecision.Real)]
public float transmittanceMask;
};
//-----------------------------------------------------------------------------
// GBuffer management
//-----------------------------------------------------------------------------
public override bool IsDefferedMaterial() { return true; }
//-----------------------------------------------------------------------------
// Init precomputed texture
//-----------------------------------------------------------------------------
public Lit() {}
public override void Build(HDRenderPipelineAsset hdAsset, RenderPipelineResources defaultResources)
{
PreIntegratedFGD.instance.Build(PreIntegratedFGD.FGDIndex.FGD_GGXAndDisneyDiffuse);
LTCAreaLight.instance.Build();
}
public override void Cleanup()
{
PreIntegratedFGD.instance.Cleanup(PreIntegratedFGD.FGDIndex.FGD_GGXAndDisneyDiffuse);
LTCAreaLight.instance.Cleanup();
}
public override void RenderInit(CommandBuffer cmd)
{
PreIntegratedFGD.instance.RenderInit(PreIntegratedFGD.FGDIndex.FGD_GGXAndDisneyDiffuse, cmd);
}
public override void Bind(CommandBuffer cmd)
{
PreIntegratedFGD.instance.Bind(cmd, PreIntegratedFGD.FGDIndex.FGD_GGXAndDisneyDiffuse);
LTCAreaLight.instance.Bind(cmd);
}
}
}