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.
175 lines
8.4 KiB
175 lines
8.4 KiB
using System.Collections.Generic;
|
|
using UnityEditor.Rendering;
|
|
using UnityEditor.Rendering.Utilities;
|
|
using UnityEngine;
|
|
using UnityEngine.Rendering;
|
|
using UnityEngine.Rendering.HighDefinition;
|
|
|
|
namespace UnityEditor.Rendering.HighDefinition
|
|
{
|
|
internal class ShadowKeywords
|
|
{
|
|
ShaderKeyword PunctualShadowLow;
|
|
ShaderKeyword PunctualShadowMedium;
|
|
ShaderKeyword PunctualShadowHigh;
|
|
|
|
ShaderKeyword DirectionalShadowLow;
|
|
ShaderKeyword DirectionalShadowMedium;
|
|
ShaderKeyword DirectionalShadowHigh;
|
|
|
|
ShaderKeyword AreaShadowMedium;
|
|
ShaderKeyword AreaShadowHigh;
|
|
|
|
public Dictionary<HDShadowFilteringQuality, ShaderKeyword> PunctualShadowVariants;
|
|
public Dictionary<HDShadowFilteringQuality, ShaderKeyword> DirectionalShadowVariants;
|
|
public Dictionary<HDAreaShadowFilteringQuality, ShaderKeyword> AreaShadowVariants;
|
|
|
|
public ShadowKeywords()
|
|
{
|
|
PunctualShadowLow = new ShaderKeyword("PUNCTUAL_SHADOW_LOW");
|
|
PunctualShadowMedium = new ShaderKeyword("PUNCTUAL_SHADOW_MEDIUM");
|
|
PunctualShadowHigh = new ShaderKeyword("PUNCTUAL_SHADOW_HIGH");
|
|
|
|
DirectionalShadowLow = new ShaderKeyword("DIRECTIONAL_SHADOW_LOW");
|
|
DirectionalShadowMedium = new ShaderKeyword("DIRECTIONAL_SHADOW_MEDIUM");
|
|
DirectionalShadowHigh = new ShaderKeyword("DIRECTIONAL_SHADOW_HIGH");
|
|
|
|
AreaShadowMedium = new ShaderKeyword("AREA_SHADOW_MEDIUM");
|
|
AreaShadowHigh = new ShaderKeyword("AREA_SHADOW_HIGH");
|
|
|
|
PunctualShadowVariants = new Dictionary<HDShadowFilteringQuality, ShaderKeyword>
|
|
{
|
|
{HDShadowFilteringQuality.Low, PunctualShadowLow},
|
|
{HDShadowFilteringQuality.Medium, PunctualShadowMedium},
|
|
{HDShadowFilteringQuality.High, PunctualShadowHigh},
|
|
};
|
|
|
|
DirectionalShadowVariants = new Dictionary<HDShadowFilteringQuality, ShaderKeyword>
|
|
{
|
|
{HDShadowFilteringQuality.Low, DirectionalShadowLow},
|
|
{HDShadowFilteringQuality.Medium, DirectionalShadowMedium},
|
|
{HDShadowFilteringQuality.High, DirectionalShadowHigh},
|
|
};
|
|
|
|
AreaShadowVariants = new Dictionary<HDAreaShadowFilteringQuality, ShaderKeyword>
|
|
{
|
|
{HDAreaShadowFilteringQuality.Medium, AreaShadowMedium},
|
|
{HDAreaShadowFilteringQuality.High, AreaShadowHigh},
|
|
};
|
|
}
|
|
}
|
|
|
|
abstract class BaseShaderPreprocessor
|
|
{
|
|
// Common keyword list
|
|
protected ShaderKeyword m_Transparent;
|
|
protected ShaderKeyword m_AlphaTestOn;
|
|
protected ShaderKeyword m_DebugDisplay;
|
|
protected ShaderKeyword m_TileLighting;
|
|
protected ShaderKeyword m_ClusterLighting;
|
|
protected ShaderKeyword m_LodFadeCrossFade;
|
|
protected ShaderKeyword m_DecalsOFF;
|
|
protected ShaderKeyword m_Decals3RT;
|
|
protected ShaderKeyword m_Decals4RT;
|
|
protected ShaderKeyword m_RenderingLayers;
|
|
protected ShaderKeyword m_ShadowLow;
|
|
protected ShaderKeyword m_ShadowMedium;
|
|
protected ShaderKeyword m_ShadowHigh;
|
|
protected ShaderKeyword m_WriteNormalBuffer;
|
|
protected ShaderKeyword m_WriteDecalBuffer;
|
|
protected ShaderKeyword m_WriteRenderingLayer;
|
|
protected ShaderKeyword m_WriteDecalBufferAndRenderingLayer;
|
|
protected ShaderKeyword m_WriteMSAADepth;
|
|
protected ShaderKeyword m_SubsurfaceScattering;
|
|
protected ShaderKeyword m_ScreenSpaceShadowOFFKeywords;
|
|
protected ShaderKeyword m_ScreenSpaceShadowONKeywords;
|
|
protected ShaderKeyword m_ProbeVolumesL1;
|
|
protected ShaderKeyword m_ProbeVolumesL2;
|
|
protected ShaderKeyword m_LightmapBicubicSampling;
|
|
protected ShaderKeyword m_DecalSurfaceGradient;
|
|
protected ShaderKeyword m_EditorVisualization;
|
|
protected ShaderKeyword m_SupportWater;
|
|
protected ShaderKeyword m_WaterDecalPartial;
|
|
protected ShaderKeyword m_WaterDecalComplete;
|
|
protected ShaderKeyword m_SupportWaterCaustics;
|
|
protected ShaderKeyword m_SupportWaterCausticsShadow;
|
|
protected ShaderKeyword m_SupportWaterAbsorption;
|
|
|
|
protected ShadowKeywords m_ShadowKeywords;
|
|
|
|
#if !ENABLE_SENSOR_SDK
|
|
protected ShaderKeyword m_SensorEnableLidar;
|
|
protected ShaderKeyword m_SensorOverrideReflectance;
|
|
#endif
|
|
|
|
protected Dictionary<HDShadowFilteringQuality, ShaderKeyword> m_ShadowVariants;
|
|
|
|
public virtual int Priority => 0;
|
|
|
|
public BaseShaderPreprocessor()
|
|
{
|
|
// NOTE: All these keyword should be automatically stripped so there's no need to handle them ourselves.
|
|
// LIGHTMAP_ON, DIRLIGHTMAP_COMBINED, DYNAMICLIGHTMAP_ON, LIGHTMAP_SHADOW_MIXING, SHADOWS_SHADOWMASK
|
|
// FOG_LINEAR, FOG_EXP, FOG_EXP2
|
|
// STEREO_INSTANCING_ON, STEREO_MULTIVIEW_ON, STEREO_CUBEMAP_RENDER_ON
|
|
// INSTANCING_ON
|
|
m_Transparent = new ShaderKeyword("_SURFACE_TYPE_TRANSPARENT");
|
|
m_AlphaTestOn = new ShaderKeyword("_ALPHATEST_ON");
|
|
m_DebugDisplay = new ShaderKeyword("DEBUG_DISPLAY");
|
|
m_TileLighting = new ShaderKeyword("USE_FPTL_LIGHTLIST");
|
|
m_ClusterLighting = new ShaderKeyword("USE_CLUSTERED_LIGHTLIST");
|
|
m_LodFadeCrossFade = new ShaderKeyword("LOD_FADE_CROSSFADE");
|
|
m_DecalsOFF = new ShaderKeyword("DECALS_OFF");
|
|
m_Decals3RT = new ShaderKeyword("DECALS_3RT");
|
|
m_Decals4RT = new ShaderKeyword("DECALS_4RT");
|
|
m_RenderingLayers = new ShaderKeyword("RENDERING_LAYERS");
|
|
m_WriteNormalBuffer = new ShaderKeyword("WRITE_NORMAL_BUFFER");
|
|
m_WriteDecalBuffer = new ShaderKeyword("WRITE_DECAL_BUFFER");
|
|
m_WriteRenderingLayer = new ShaderKeyword("WRITE_RENDERING_LAYER");
|
|
m_WriteDecalBufferAndRenderingLayer = new ShaderKeyword("WRITE_DECAL_BUFFER_AND_RENDERING_LAYER");
|
|
m_WriteMSAADepth = new ShaderKeyword("WRITE_MSAA_DEPTH");
|
|
m_SubsurfaceScattering = new ShaderKeyword("OUTPUT_SPLIT_LIGHTING");
|
|
m_ScreenSpaceShadowOFFKeywords = new ShaderKeyword("SCREEN_SPACE_SHADOWS_OFF");
|
|
m_ScreenSpaceShadowONKeywords = new ShaderKeyword("SCREEN_SPACE_SHADOWS_ON");
|
|
m_ProbeVolumesL1 = new ShaderKeyword("PROBE_VOLUMES_L1");
|
|
m_ProbeVolumesL2 = new ShaderKeyword("PROBE_VOLUMES_L2");
|
|
m_LightmapBicubicSampling = new ShaderKeyword("LIGHTMAP_BICUBIC_SAMPLING");
|
|
m_DecalSurfaceGradient = new ShaderKeyword("DECAL_SURFACE_GRADIENT");
|
|
m_EditorVisualization = new ShaderKeyword("EDITOR_VISUALIZATION");
|
|
m_SupportWater = new ShaderKeyword("SUPPORT_WATER");
|
|
m_WaterDecalPartial = new ShaderKeyword("WATER_DECAL_PARTIAL");
|
|
m_WaterDecalComplete = new ShaderKeyword("WATER_DECAL_COMPLETE");
|
|
m_SupportWaterCaustics = new ShaderKeyword("SUPPORT_WATER_CAUSTICS");
|
|
m_SupportWaterCausticsShadow = new ShaderKeyword("SUPPORT_WATER_CAUSTICS_SHADOW");
|
|
m_SupportWaterAbsorption = new ShaderKeyword("SUPPORT_WATER_ABSORPTION");
|
|
m_ShadowKeywords = new ShadowKeywords();
|
|
|
|
#if !ENABLE_SENSOR_SDK
|
|
m_SensorEnableLidar = new ShaderKeyword("SENSORSDK_ENABLE_LIDAR");
|
|
m_SensorOverrideReflectance = new ShaderKeyword("SENSORSDK_OVERRIDE_REFLECTANCE");
|
|
#endif
|
|
}
|
|
|
|
public bool ShadersStripper(HDRenderPipelineAsset hdrpAsset, Shader shader, ShaderSnippetData snippet,
|
|
ShaderCompilerData inputData)
|
|
{
|
|
return IsMaterialQualityVariantStripped(hdrpAsset, inputData) || DoShadersStripper(hdrpAsset, shader, snippet, inputData);
|
|
}
|
|
|
|
protected abstract bool DoShadersStripper(HDRenderPipelineAsset hdrpAsset, Shader shader, ShaderSnippetData snippet, ShaderCompilerData inputData);
|
|
|
|
protected static bool IsMaterialQualityVariantStripped(HDRenderPipelineAsset hdrpAsset, ShaderCompilerData inputData)
|
|
{
|
|
var shaderMaterialLevel = inputData.shaderKeywordSet.GetMaterialQuality();
|
|
// if there are material quality defines in this shader
|
|
// and they don't match the material quality accepted by the hdrp asset
|
|
if (shaderMaterialLevel != 0 && (hdrpAsset.availableMaterialQualityLevels & shaderMaterialLevel) == 0)
|
|
{
|
|
// then strip this variant
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
}
|
|
}
|