浏览代码

Merge remote-tracking branch 'origin/master' into preview-cameras

/main
Tim Cooper 8 年前
当前提交
d4271c8c
共有 145 个文件被更改,包括 4669 次插入949 次删除
  1. 2
      Assets/ScriptableRenderLoop/HDRenderPipeline/Debug/DebugViewMaterial.cs
  2. 2
      Assets/ScriptableRenderLoop/HDRenderPipeline/Debug/DebugViewMaterial.cs.hlsl
  3. 11
      Assets/ScriptableRenderLoop/HDRenderPipeline/Debug/Resources/DebugViewMaterialGBuffer.shader
  4. 4
      Assets/ScriptableRenderLoop/HDRenderPipeline/Debug/Resources/DebugViewTiles.shader
  5. 36
      Assets/ScriptableRenderLoop/HDRenderPipeline/HDRenderPipeline.cs
  6. 4
      Assets/ScriptableRenderLoop/HDRenderPipeline/Lighting/Resources/Deferred.shader
  7. 5
      Assets/ScriptableRenderLoop/HDRenderPipeline/Lighting/TilePass/Resources/lightlistbuild-bigtile.compute
  8. 12
      Assets/ScriptableRenderLoop/HDRenderPipeline/Lighting/TilePass/TilePass.hlsl
  9. 7
      Assets/ScriptableRenderLoop/HDRenderPipeline/Material/Builtin/BuiltinData.hlsl
  10. 82
      Assets/ScriptableRenderLoop/HDRenderPipeline/Material/LayeredLit/Editor/LayeredLitUI.cs
  11. 56
      Assets/ScriptableRenderLoop/HDRenderPipeline/Material/LayeredLit/LayeredLit.shader
  12. 62
      Assets/ScriptableRenderLoop/HDRenderPipeline/Material/LayeredLit/LayeredLitTessellation.shader
  13. 13
      Assets/ScriptableRenderLoop/HDRenderPipeline/Material/Lit/Editor/BaseLitUI.cs
  14. 9
      Assets/ScriptableRenderLoop/HDRenderPipeline/Material/Lit/Editor/LitUI.cs
  15. 66
      Assets/ScriptableRenderLoop/HDRenderPipeline/Material/Lit/Lit.cs
  16. 48
      Assets/ScriptableRenderLoop/HDRenderPipeline/Material/Lit/Lit.hlsl
  17. 8
      Assets/ScriptableRenderLoop/HDRenderPipeline/Material/Lit/Lit.shader
  18. 290
      Assets/ScriptableRenderLoop/HDRenderPipeline/Material/Lit/LitData.hlsl
  19. 203
      Assets/ScriptableRenderLoop/HDRenderPipeline/Material/Lit/LitDataInternal.hlsl
  20. 39
      Assets/ScriptableRenderLoop/HDRenderPipeline/Material/Lit/LitProperties.hlsl
  21. 21
      Assets/ScriptableRenderLoop/HDRenderPipeline/Material/Lit/LitTessellation.hlsl
  22. 5
      Assets/ScriptableRenderLoop/HDRenderPipeline/Material/Lit/LitTessellation.shader
  23. 4
      Assets/ScriptableRenderLoop/HDRenderPipeline/Material/Lit/Resources/PreIntegratedFGD.shader
  24. 2
      Assets/ScriptableRenderLoop/HDRenderPipeline/Material/Lit/ShaderPass/LitDepthPass.hlsl
  25. 2
      Assets/ScriptableRenderLoop/HDRenderPipeline/Material/Lit/ShaderPass/LitDistortionPass.hlsl
  26. 4
      Assets/ScriptableRenderLoop/HDRenderPipeline/Material/Lit/ShaderPass/LitVelocityPass.hlsl
  27. 4
      Assets/ScriptableRenderLoop/HDRenderPipeline/Material/Unlit/Unlit.shader
  28. 2
      Assets/ScriptableRenderLoop/HDRenderPipeline/PostProcess/Resources/EyeAdaptation.shader
  29. 2
      Assets/ScriptableRenderLoop/HDRenderPipeline/PostProcess/Resources/FinalPass.shader
  30. 2
      Assets/ScriptableRenderLoop/HDRenderPipeline/PostProcess/Resources/LutGen.shader
  31. 14
      Assets/ScriptableRenderLoop/HDRenderPipeline/ShaderPass/TessellationShare.hlsl
  32. 38
      Assets/ScriptableRenderLoop/HDRenderPipeline/ShaderPass/VaryingMesh.hlsl
  33. 16
      Assets/ScriptableRenderLoop/HDRenderPipeline/ShaderPass/VertMesh.hlsl
  34. 12
      Assets/ScriptableRenderLoop/HDRenderPipeline/Sky/HDRISky/HDRISkyRenderer.cs
  35. 4
      Assets/ScriptableRenderLoop/HDRenderPipeline/Sky/HDRISky/Resources/SkyHDRI.shader
  36. 56
      Assets/ScriptableRenderLoop/HDRenderPipeline/Sky/ProceduralSky/ProceduralSkyRenderer.cs
  37. 18
      Assets/ScriptableRenderLoop/HDRenderPipeline/Sky/ProceduralSky/Resources/SkyProcedural.shader
  38. 4
      Assets/ScriptableRenderLoop/HDRenderPipeline/Sky/Resources/GGXConvolve.shader
  39. 35
      Assets/ScriptableRenderLoop/HDRenderPipeline/Sky/RuntimeFilterIBL.cs
  40. 48
      Assets/ScriptableRenderLoop/HDRenderPipeline/Sky/SkyManager.cs
  41. 1
      Assets/ScriptableRenderLoop/HDRenderPipeline/Sky/SkyRenderer.cs
  42. 2
      Assets/ScriptableRenderLoop/HDRenderPipeline/Utilities.cs
  43. 9
      Assets/ScriptableRenderLoop/ShaderLibrary/API/D3D11.hlsl
  44. 9
      Assets/ScriptableRenderLoop/ShaderLibrary/API/PSSL.hlsl
  45. 19
      Assets/ScriptableRenderLoop/ShaderLibrary/Common.hlsl
  46. 6
      Assets/ScriptableRenderLoop/ShaderLibrary/CommonMaterial.hlsl
  47. 292
      Assets/ScriptableRenderLoop/fptl/Internal-DeferredComputeShading.compute
  48. 2
      Assets/ScriptableRenderLoop/fptl/Internal-DeferredReflections.shader
  49. 2
      Assets/ScriptableRenderLoop/fptl/Internal-DeferredShading.shader
  50. 2
      Assets/ScriptableRenderLoop/fptl/LightBoundsDebug.shader
  51. 6
      Assets/ScriptableRenderLoop/fptl/StandardTest.shader
  52. 7
      Assets/ScriptableRenderLoop/fptl/lightlistbuild-bigtile.compute
  53. 4
      Assets/TestScenes/HDTest/HDRenderLoopTest.meta
  54. 737
      Assets/TestScenes/HDTest/HDRenderLoopTest.unity
  55. 291
      Assets/TestScenes/HDTest/Material/HDRenderLoopMaterials/Terrain.mat
  56. 25
      Assets/TestScenes/HDTest/Material/HDRenderLoopMaterials/test details.mat
  57. 4
      ProjectSettings/GraphicsSettings.asset
  58. 158
      ProjectSettings/ProjectSettings.asset
  59. 2
      ProjectSettings/ProjectVersion.txt
  60. 64
      Assets/TestScenes/HDTest/GraphicTest/Two Sided/Material/GroundLeaf_DoubleSidedFlip.mat
  61. 70
      Assets/ScriptableRenderLoop/HDRenderPipeline/Material/Lit/LayeredLitNormalSampling.hlsl
  62. 9
      Assets/ScriptableRenderLoop/HDRenderPipeline/Material/Lit/LayeredLitNormalSampling.hlsl.meta
  63. 88
      Assets/ScriptableRenderLoop/ShaderLibrary/API/Metal.hlsl
  64. 9
      Assets/ScriptableRenderLoop/ShaderLibrary/API/Metal.hlsl.meta
  65. 9
      Assets/TestScenes/HDTest/GraphicTest.meta
  66. 9
      Assets/TestScenes/HDTest/LayeredLitTest/Mesh/Materials.meta
  67. 9
      Assets/TestScenes/HDTest/GraphicTest/Common.meta
  68. 9
      Assets/TestScenes/HDTest/GraphicTest/Common/Material.meta
  69. 9
      Assets/TestScenes/HDTest/GraphicTest/Common/Textures.meta
  70. 9
      Assets/TestScenes/HDTest/GraphicTest/Parallax Occlusion Mapping.meta
  71. 9
      Assets/TestScenes/HDTest/GraphicTest/Parallax Occlusion Mapping/Material.meta
  72. 9
      Assets/TestScenes/HDTest/GraphicTest/Parallax Occlusion Mapping/Textures.meta
  73. 129
      Assets/TestScenes/HDTest/GraphicTest/Parallax Occlusion Mapping/Textures/FourShapesColor.tga
  74. 68
      Assets/TestScenes/HDTest/GraphicTest/Parallax Occlusion Mapping/Textures/FourShapesColor.tga.meta
  75. 17
      Assets/TestScenes/HDTest/GraphicTest/Parallax Occlusion Mapping/Textures/FourShapesRelief.tga
  76. 116
      Assets/TestScenes/HDTest/GraphicTest/Parallax Occlusion Mapping/Textures/FourShapesRelief.tga.meta
  77. 1
      Assets/TestScenes/HDTest/GraphicTest/Parallax Occlusion Mapping/Textures/FourShapesReliefHeightmap.tga
  78. 116
      Assets/TestScenes/HDTest/GraphicTest/Parallax Occlusion Mapping/Textures/FourShapesReliefHeightmap.tga.meta
  79. 533
      Assets/TestScenes/HDTest/GraphicTest/Parallax Occlusion Mapping/Textures/RockColor.jpg
  80. 68
      Assets/TestScenes/HDTest/GraphicTest/Parallax Occlusion Mapping/Textures/RockColor.jpg.meta
  81. 130
      Assets/TestScenes/HDTest/GraphicTest/Parallax Occlusion Mapping/Textures/RockHeightmap.tga
  82. 116
      Assets/TestScenes/HDTest/GraphicTest/Parallax Occlusion Mapping/Textures/RockHeightmap.tga.meta
  83. 572
      Assets/TestScenes/HDTest/GraphicTest/Parallax Occlusion Mapping/Textures/RockRelief.tga
  84. 116
      Assets/TestScenes/HDTest/GraphicTest/Parallax Occlusion Mapping/Textures/RockRelief.tga.meta
  85. 160
      Assets/TestScenes/HDTest/GraphicTest/Parallax Occlusion Mapping/Material/POM - Rock.mat
  86. 9
      Assets/TestScenes/HDTest/GraphicTest/Parallax Occlusion Mapping/Material/POM - Rock.mat.meta
  87. 9
      Assets/TestScenes/HDTest/GraphicTest/Parallax Occlusion Mapping/Material/POM - Wood.mat.meta
  88. 160
      Assets/TestScenes/HDTest/GraphicTest/Parallax Occlusion Mapping/Material/POM - Wood.mat
  89. 9
      Assets/TestScenes/HDTest/GraphicTest/Tessellation.meta
  90. 9
      Assets/TestScenes/HDTest/GraphicTest/Tessellation/Material.meta
  91. 9
      Assets/TestScenes/HDTest/GraphicTest/Tessellation/Textures.meta
  92. 129
      Assets/TestScenes/HDTest/GraphicTest/Tessellation/Textures/FourShapesColor.tga

2
Assets/ScriptableRenderLoop/HDRenderPipeline/Debug/DebugViewMaterial.cs


public enum DebugViewGbuffer
{
Depth = DebugViewVarying.VertexColorAlpha + 1,
BakeDiffuseLighting,
BakeDiffuseLightingWithAlbedoPlusEmissive,
}
}
}

2
Assets/ScriptableRenderLoop/HDRenderPipeline/Debug/DebugViewMaterial.cs.hlsl


// UnityEngine.Experimental.Rendering.HDPipeline.Attributes.DebugViewGbuffer: static fields
//
#define DEBUGVIEWGBUFFER_DEPTH (10)
#define DEBUGVIEWGBUFFER_BAKE_DIFFUSE_LIGHTING (11)
#define DEBUGVIEWGBUFFER_BAKE_DIFFUSE_LIGHTING_WITH_ALBEDO_PLUS_EMISSIVE (11)
#endif

11
Assets/ScriptableRenderLoop/HDRenderPipeline/Debug/Resources/DebugViewMaterialGBuffer.shader


Blend SrcAlpha OneMinusSrcAlpha // We will lerp only the values that are valid
HLSLPROGRAM
#pragma target 5.0
#pragma only_renderers d3d11 ps4// TEMP: unitl we go futher in dev
#pragma target 4.5
#pragma only_renderers d3d11 ps4 metal // TEMP: unitl we go futher in dev
#pragma vertex Vert
#pragma fragment Frag

float linearDepth = frac(posInput.depthVS * 0.1);
result = linearDepth.xxx;
}
else if (_DebugViewMaterial == DEBUGVIEWGBUFFER_BAKE_DIFFUSE_LIGHTING)
// Caution: This value is not the same than the builtin data bakeDiffuseLighting. It also include emissive and multiply by the albedo
else if (_DebugViewMaterial == DEBUGVIEWGBUFFER_BAKE_DIFFUSE_LIGHTING_WITH_ALBEDO_PLUS_EMISSIVE)
result = bakeDiffuseLighting;
// TODO: require a remap
// TODO: we should not gamma correct, but easier to debug for now without correct high range value
result = bakeDiffuseLighting; needLinearToSRGB = true;
}
GetBSDFDataDebug(_DebugViewMaterial, bsdfData, result, needLinearToSRGB);

4
Assets/ScriptableRenderLoop/HDRenderPipeline/Debug/Resources/DebugViewTiles.shader


Blend SrcAlpha OneMinusSrcAlpha
HLSLPROGRAM
#pragma target 5.0
#pragma only_renderers d3d11 ps4// TEMP: unitl we go futher in dev
#pragma target 4.5
#pragma only_renderers d3d11 ps4 metal // TEMP: unitl we go futher in dev
#pragma vertex Vert
#pragma fragment Frag

36
Assets/ScriptableRenderLoop/HDRenderPipeline/HDRenderPipeline.cs


// Clear GBuffers
using (new Utilities.ProfilingSample("Clear GBuffer", renderContext))
if (!debugParameters.ShouldUseForwardRenderingOnly())
Utilities.SetRenderTarget(renderContext, m_gbufferManager.GetGBuffers(), m_CameraDepthBufferRT, ClearFlag.ClearColor, Color.black);
using (new Utilities.ProfilingSample("Clear GBuffer", renderContext))
{
Utilities.SetRenderTarget(renderContext, m_gbufferManager.GetGBuffers(), m_CameraDepthBufferRT, ClearFlag.ClearColor, Color.black);
}
// END TEMP
}
}

Shader.SetGlobalInt("_DebugViewMaterial", (int)debugParameters.debugViewMaterial);
RenderOpaqueRenderList(cull, hdCamera.camera, renderContext, "DebugViewMaterial");
RenderOpaqueRenderList(cull, hdCamera.camera, renderContext, "DebugViewMaterial", Utilities.kRendererConfigurationBakedLighting);
}
// Render GBuffer opaque

// Render forward transparent
{
RenderTransparentRenderList(cull, hdCamera.camera, renderContext, "DebugViewMaterial");
RenderTransparentRenderList(cull, hdCamera.camera, renderContext, "DebugViewMaterial", Utilities.kRendererConfigurationBakedLighting);
}
// Last blit

return ;
}
// Bind material data
m_LitRenderLoop.Bind();
m_lightLoop.RenderDeferredLighting(hdCamera, renderContext, m_CameraColorBuffer);
}

using (new Utilities.ProfilingSample("Forward Pass", renderContext))
{
// Bind material data
m_LitRenderLoop.Bind();
Utilities.SetRenderTarget(renderContext, m_CameraColorBufferRT, m_CameraDepthBufferRT);
m_lightLoop.RenderForward(camera, renderContext, renderOpaque);

RenderOpaqueRenderList(cullResults, camera, renderContext, "Forward");
RenderOpaqueRenderList(cullResults, camera, renderContext, "Forward", Utilities.kRendererConfigurationBakedLighting);
}
else
{

{
using (new Utilities.ProfilingSample("Forward Only Pass", renderContext))
{
// Bind material data
m_LitRenderLoop.Bind();
RenderOpaqueRenderList(cullResults, camera, renderContext, "ForwardOnlyOpaque");
RenderOpaqueRenderList(cullResults, camera, renderContext, "ForwardOnlyOpaque", Utilities.kRendererConfigurationBakedLighting);
}
}

// TODO: This is the wrong way to handle resize/allocation. We can have several different camera here, mean that the loop on camera will allocate and deallocate
// the below buffer which is bad. Best is to have a set of buffer for each camera that is persistent and reallocate resource if need
// For now consider we have only one camera that go to this code, the main one.
m_SkyManager.Resize(); // TODO: Also a bad naming, here we just want to realloc texture if skyparameters change (usefull for lookdev)
m_SkyManager.Resize(camera.nearClipPlane, camera.farClipPlane); // TODO: Also a bad naming, here we just want to realloc texture if skyparameters change (usefull for lookdev)
if (camera.pixelWidth != m_currentWidth || camera.pixelHeight != m_currentHeight || m_lightLoop.NeedResize())
{

InitAndClearBuffer(camera, renderContext);
// TODO: Find a correct place to bind these material textures
// We have to bind the material specific global parameters in this mode
m_LitRenderLoop.Bind();
RenderDepthPrepass(cullResults, camera, renderContext);
// Forward opaque with deferred/cluster tile require that we fill the depth buffer

using (new Utilities.ProfilingSample("Build Light list", renderContext))
{
m_lightLoop.PrepareLightsForGPU(m_ShadowSettings, cullResults, camera, ref shadows);
m_lightLoop.BuildGPULightLists(camera, renderContext, m_CameraDepthBufferRT); // TODO: Use async compute here to run light culling during shadow
PushGlobalParams(hdCamera, renderContext);
m_lightLoop.BuildGPULightLists(camera, renderContext, m_CameraDepthBufferRT); // TODO: Use async compute here to run light culling during shadow
PushGlobalParams(hdCamera, renderContext);
// Caution: We require sun light here as some sky use the sun light to render, mean UpdateSkyEnvironment
// must be call after BuildGPULightLists.

4
Assets/ScriptableRenderLoop/HDRenderPipeline/Lighting/Resources/Deferred.shader


Blend[_SrcBlend][_DstBlend]
HLSLPROGRAM
#pragma target 5.0
#pragma only_renderers d3d11 ps4// TEMP: unitl we go futher in dev
#pragma target 4.5
#pragma only_renderers d3d11 ps4 metal // TEMP: unitl we go futher in dev
#pragma vertex Vert
#pragma fragment Frag

5
Assets/ScriptableRenderLoop/HDRenderPipeline/Lighting/TilePass/Resources/lightlistbuild-bigtile.compute


for(int l=0; l<iNrCoarseLights; l++)
{
const uint idxCoarse = lightsListLDS[l];
[branch]if (idxCoarse<(uint)g_iNrVisibLights && _LightVolumeData[idxCoarse].lightVolume != LIGHTVOLUMETYPE_SPHERE) // don't bother doing edge tests for sphere lights since these have camera aligned bboxes.
bool canEnter = idxCoarse<(uint)g_iNrVisibLights;
if(canEnter) canEnter = _LightVolumeData[idxCoarse].lightVolume != LIGHTVOLUMETYPE_SPHERE; // don't bother doing edge tests for sphere lights since these have camera aligned bboxes.
[branch]if(canEnter)
{
SFiniteLightBound lgtDat = g_data[idxCoarse];

12
Assets/ScriptableRenderLoop/HDRenderPipeline/Lighting/TilePass/TilePass.hlsl


SAMPLER2D_SHADOW(samplerg_tShadowBuffer);
// Use texture array for IES
TEXTURE2D_ARRAY(_IESArray);
SAMPLER2D(sampler_IESArray);
//TEXTURE2D_ARRAY(_IESArray);
//SAMPLER2D(sampler_IESArray);
// Used by directional and spot lights
TEXTURE2D_ARRAY(_CookieTextures);

// ----------------------------------------------------------------------------
// sphericalTexCoord is theta and phi spherical coordinate
float4 SampleIES(LightLoopContext lightLoopContext, int index, float2 sphericalTexCoord, float lod)
{
return SAMPLE_TEXTURE2D_ARRAY_LOD(_IESArray, sampler_IESArray, sphericalTexCoord, index, 0);
}
//float4 SampleIES(LightLoopContext lightLoopContext, int index, float2 sphericalTexCoord, float lod)
//{
// return SAMPLE_TEXTURE2D_ARRAY_LOD(_IESArray, sampler_IESArray, sphericalTexCoord, index, 0);
//}
//-----------------------------------------------------------------------------
// Reflection proble / Sky sampling function

7
Assets/ScriptableRenderLoop/HDRenderPipeline/Material/Builtin/BuiltinData.hlsl


// Note: These parameters can be store in GBuffer if the writer wants
//-----------------------------------------------------------------------------
#include "BuiltinData.cs.hlsl"
//TODO: return this original relative path include after fixing a bug in Unity side
//#include "BuiltinData.cs.hlsl"
#include "Assets/ScriptableRenderLoop/HDRenderPipeline/Material/Builtin/BuiltinData.cs.hlsl"
//-----------------------------------------------------------------------------
// common Encode/Decode functions

break;
case DEBUGVIEW_BUILTIN_BUILTINDATA_BAKE_DIFFUSE_LIGHTING:
// TODO: require a remap
result = builtinData.bakeDiffuseLighting;
// TODO: we should not gamma correct, but easier to debug for now without correct high range value
result = builtinData.bakeDiffuseLighting; needLinearToSRGB = true;
break;
case DEBUGVIEW_BUILTIN_BUILTINDATA_EMISSIVE_COLOR:
// emissiveColor is premultiply by emissive intensity

82
Assets/ScriptableRenderLoop/HDRenderPipeline/Material/LayeredLit/Editor/LayeredLitUI.cs


public readonly GUIContent heightFactorText = new GUIContent("Height Multiplier", "Scale applied to the height of the layer.");
public readonly GUIContent blendSizeText = new GUIContent("Blend Size", "Thickness over which the layer will be blended with the previous one.");
public readonly GUIContent heightCenterOffsetText = new GUIContent("Height Center Offset", "Offset applied to the center of the height of the layer.");
public readonly GUIContent useHeightBasedBlendV2Text = new GUIContent("Use Height Based Blend V2", "Layer will be blended with the underlying layer based on the height.");
public readonly GUIContent blendUsingHeight = new GUIContent("Blend Using Height", "Blend Layers using height.");
public readonly GUIContent inheritBaseNormalText = new GUIContent("Inherit Base Layer Normal", "Inherit the normal from the base layer.");
public readonly GUIContent inheritBaseHeightText = new GUIContent("Inherit Base Layer Height", "Inherit the height from the base layer.");
public readonly GUIContent inheritBaseColorText = new GUIContent("Inherit Base Layer Color", "Inherit the base color from the base layer.");
public readonly GUIContent inheritBaseColorThresholdText = new GUIContent("Threshold", "Inherit the base color from the base layer.");
public readonly GUIContent minimumOpacityText = new GUIContent("Minimum Opacity", "Minimum Opacity.");
public readonly GUIContent opacityAsDensityText = new GUIContent("Use Opacity as Density", "Use Opacity as Density.");
public StylesLayer()
{
layerLabelColors[1].normal.textColor = Color.red;

const string kUseHeightBasedBlend = "_UseHeightBasedBlend";
MaterialProperty useHeightBasedBlend = null;
const string kUseHeightBasedBlendV2 = "_UseHeightBasedBlendV2";
MaterialProperty useHeightBasedBlendV2 = null;
const string kBlendUsingHeight = "_BlendUsingHeight";
MaterialProperty[] blendUsingHeight = new MaterialProperty[kMaxLayerCount - 1];
const string kHeightOffset = "_HeightOffset";
MaterialProperty[] heightOffset = new MaterialProperty[kMaxLayerCount-1];
const string kInheritBaseLayer = "_InheritBaseLayer";

const string kHeightCenterOffset = "_HeightCenterOffset";
MaterialProperty[] heightCenterOffset = new MaterialProperty[kMaxLayerCount - 1];
// Height blend V2
const string kInheritBaseNormal = "_InheritBaseNormal";
MaterialProperty[] inheritBaseNormal = new MaterialProperty[kMaxLayerCount - 1];
const string kInheritBaseHeight = "_InheritBaseHeight";
MaterialProperty[] inheritBaseHeight = new MaterialProperty[kMaxLayerCount - 1];
const string kInheritBaseColor = "_InheritBaseColor";
MaterialProperty[] inheritBaseColor = new MaterialProperty[kMaxLayerCount - 1];
const string kInheritBaseColorThreshold = "_InheritBaseColorThreshold";
MaterialProperty[] inheritBaseColorThreshold = new MaterialProperty[kMaxLayerCount - 1];
const string kOpacityAsDensity = "_OpacityAsDensity";
MaterialProperty[] opacityAsDensity = new MaterialProperty[kMaxLayerCount - 1];
const string kMinimumOpacity = "_MinimumOpacity";
MaterialProperty[] minimumOpacity = new MaterialProperty[kMaxLayerCount - 1];
MaterialProperty layerEmissiveColor = null;
MaterialProperty layerEmissiveColorMap = null;
MaterialProperty layerEmissiveIntensity = null;

vertexColorHeightFactor = FindProperty(kVertexColorHeightFactor, props);
layerCount = FindProperty(kLayerCount, props);
useHeightBasedBlend = FindProperty(kUseHeightBasedBlend, props);
useHeightBasedBlendV2 = FindProperty(kUseHeightBasedBlendV2, props);
for (int i = 0; i < kMaxLayerCount; ++i)
{

heightOffset[i-1] = FindProperty(string.Format("{0}{1}", kHeightOffset, i), props);
heightFactor[i-1] = FindProperty(string.Format("{0}{1}", kHeightFactor, i), props);
blendSize[i-1] = FindProperty(string.Format("{0}{1}", kBlendSize, i), props);
heightCenterOffset[i - 1] = FindProperty(string.Format("{0}{1}", kHeightCenterOffset, i), props);
blendUsingHeight[i - 1] = FindProperty(string.Format("{0}{1}", kBlendUsingHeight, i), props);
inheritBaseNormal[i - 1] = FindProperty(string.Format("{0}{1}", kInheritBaseNormal, i), props);
inheritBaseHeight[i - 1] = FindProperty(string.Format("{0}{1}", kInheritBaseHeight, i), props);
inheritBaseColor[i - 1] = FindProperty(string.Format("{0}{1}", kInheritBaseColor, i), props);
inheritBaseColorThreshold[i - 1] = FindProperty(string.Format("{0}{1}", kInheritBaseColorThreshold, i), props);
minimumOpacity[i - 1] = FindProperty(string.Format("{0}{1}", kMinimumOpacity, i), props);
opacityAsDensity[i - 1] = FindProperty(string.Format("{0}{1}", kOpacityAsDensity, i), props);
}
}

{
int heightParamIndex = layerIndex - 1;
m_MaterialEditor.ShaderProperty(inheritBaseLayer[heightParamIndex], styles.inheritBaseLayerText);
m_MaterialEditor.ShaderProperty(heightOffset[heightParamIndex], styles.heightOffsetText);
m_MaterialEditor.ShaderProperty(heightFactor[heightParamIndex], styles.heightFactorText);
m_MaterialEditor.ShaderProperty(blendSize[heightParamIndex], styles.blendSizeText);
if(useHeightBasedBlendV2.floatValue != 1.0f)
{
//m_MaterialEditor.ShaderProperty(inheritBaseLayer[heightParamIndex], styles.inheritBaseLayerText);
m_MaterialEditor.ShaderProperty(heightOffset[heightParamIndex], styles.heightOffsetText);
m_MaterialEditor.ShaderProperty(heightFactor[heightParamIndex], styles.heightFactorText);
m_MaterialEditor.ShaderProperty(blendSize[heightParamIndex], styles.blendSizeText);
m_MaterialEditor.ShaderProperty(inheritBaseColor[heightParamIndex], styles.inheritBaseColorText);
EditorGUI.indentLevel++;
m_MaterialEditor.ShaderProperty(inheritBaseColorThreshold[heightParamIndex], styles.inheritBaseColorThresholdText);
EditorGUI.indentLevel--;
m_MaterialEditor.ShaderProperty(inheritBaseNormal[heightParamIndex], styles.inheritBaseNormalText);
}
else
{
m_MaterialEditor.ShaderProperty(heightFactor[heightParamIndex], styles.heightFactorText);
m_MaterialEditor.ShaderProperty(heightCenterOffset[heightParamIndex], styles.heightCenterOffsetText);
m_MaterialEditor.ShaderProperty(blendUsingHeight[heightParamIndex], styles.blendUsingHeight);
m_MaterialEditor.ShaderProperty(inheritBaseColor[heightParamIndex], styles.inheritBaseColorText);
EditorGUI.indentLevel++;
m_MaterialEditor.ShaderProperty(inheritBaseColorThreshold[heightParamIndex], styles.inheritBaseColorThresholdText);
EditorGUI.indentLevel--;
m_MaterialEditor.ShaderProperty(inheritBaseNormal[heightParamIndex], styles.inheritBaseNormalText);
m_MaterialEditor.ShaderProperty(inheritBaseHeight[heightParamIndex], styles.inheritBaseHeightText);
m_MaterialEditor.ShaderProperty(opacityAsDensity[heightParamIndex], styles.opacityAsDensityText);
m_MaterialEditor.ShaderProperty(minimumOpacity[heightParamIndex], styles.minimumOpacityText);
}
}
}

}
if (enabled)
{
m_MaterialEditor.ShaderProperty(vertexColorHeightFactor, styles.vertexColorHeightMultiplierText);
EditorGUI.BeginChangeCheck();
bool enabledV2 = EditorGUILayout.Toggle(styles.useHeightBasedBlendV2Text, useHeightBasedBlendV2.floatValue > 0.0f);
if (EditorGUI.EndChangeCheck())
{
useHeightBasedBlendV2.floatValue = enabledV2 ? 1.0f : 0.0f;
}
if(!enabledV2)
m_MaterialEditor.ShaderProperty(vertexColorHeightFactor, styles.vertexColorHeightMultiplierText);
}
else
{

bool useHeightBasedBlend = material.GetFloat(kUseHeightBasedBlend) != 0.0f;
if(useHeightBasedBlend)
{
bool useHeightBasedBlendV2 = material.GetFloat(kUseHeightBasedBlendV2) != 0.0f;
SetKeyword(material, "_HEIGHT_BASED_BLEND_V2", useHeightBasedBlendV2);
}
else
{

56
Assets/ScriptableRenderLoop/HDRenderPipeline/Material/LayeredLit/LayeredLit.shader


_HeightOffset2("_HeightOffset2", Range(-0.3, 0.3)) = 0.0
_HeightOffset3("_HeightOffset3", Range(-0.3, 0.3)) = 0.0
_HeightFactor1("_HeightFactor1", Range(0, 5)) = 1
_HeightFactor2("_HeightFactor2", Range(0, 5)) = 1
_HeightFactor3("_HeightFactor3", Range(0, 5)) = 1
_HeightFactor1("_HeightFactor1", Float) = 1
_HeightFactor2("_HeightFactor2", Float) = 1
_HeightFactor3("_HeightFactor3", Float) = 1
_BlendSize1("_BlendSize1", Range(0, 0.30)) = 0.0
_BlendSize2("_BlendSize2", Range(0, 0.30)) = 0.0

_VertexColorHeightFactor("_VertexColorHeightFactor", Float) = 0.3
// Layer blending options V2
[ToggleOff] _UseHeightBasedBlendV2("Use Height Blend V2", Float) = 0.0
_HeightCenterOffset1("_HeightCenterOffset1", Float) = 0.0
_HeightCenterOffset2("_HeightCenterOffset2", Float) = 0.0
_HeightCenterOffset3("_HeightCenterOffset3", Float) = 0.0
_BlendUsingHeight1("_BlendUsingHeight1", Float) = 0.0
_BlendUsingHeight2("_BlendUsingHeight2", Float) = 0.0
_BlendUsingHeight3("_BlendUsingHeight3", Float) = 0.0
_InheritBaseNormal1("_InheritBaseNormal1", Range(0, 1.0)) = 0.0
_InheritBaseNormal2("_InheritBaseNormal2", Range(0, 1.0)) = 0.0
_InheritBaseNormal3("_InheritBaseNormal3", Range(0, 1.0)) = 0.0
_InheritBaseHeight1("_InheritBaseHeight1", Range(0, 1.0)) = 0.0
_InheritBaseHeight2("_InheritBaseHeight2", Range(0, 1.0)) = 0.0
_InheritBaseHeight3("_InheritBaseHeight3", Range(0, 1.0)) = 0.0
_InheritBaseColor1("_InheritBaseColor1", Range(0, 1.0)) = 0.0
_InheritBaseColor2("_InheritBaseColor2", Range(0, 1.0)) = 0.0
_InheritBaseColor3("_InheritBaseColor3", Range(0, 1.0)) = 0.0
_InheritBaseColorThreshold1("_InheritBaseColorThreshold1", Range(0, 1.0)) = 1.0
_InheritBaseColorThreshold2("_InheritBaseColorThreshold2", Range(0, 1.0)) = 1.0
_InheritBaseColorThreshold3("_InheritBaseColorThreshold3", Range(0, 1.0)) = 1.0
_MinimumOpacity1("_MinimumOpacity1", Range(0, 1.0)) = 1.0
_MinimumOpacity2("_MinimumOpacity2", Range(0, 1.0)) = 1.0
_MinimumOpacity3("_MinimumOpacity3", Range(0, 1.0)) = 1.0
_OpacityAsDensity1("_OpacityAsDensity1", Range(0, 1.0)) = 0.0
_OpacityAsDensity2("_OpacityAsDensity2", Range(0, 1.0)) = 0.0
_OpacityAsDensity3("_OpacityAsDensity3", Range(0, 1.0)) = 0.0
_DistortionVectorMap("DistortionVectorMap", 2D) = "black" {}
_EmissiveColor("EmissiveColor", Color) = (0, 0, 0)

[Enum(Mask Alpha, 0, BaseColor Alpha, 1)] _SmoothnessTextureChannel("Smoothness texture channel", Float) = 1
[Enum(TangentSpace, 0, ObjectSpace, 1)] _NormalMapSpace("NormalMap space", Float) = 0
[ToggleOff] _EnablePerPixelDisplacement("Enable per pixel displacement", Float) = 0.0
_PPDMinSamples("Min sample for POM", Range(1.0, 64.0)) = 5
_PPDMaxSamples("Max sample for POM", Range(1.0, 64.0)) = 15
// WARNING
// All the following properties that concern the UV mapping are the same as in the Lit shader.
// This means that they will get overridden when synchronizing the various layers.
// To avoid this, make sure that all properties here are in the exclusion list in LayeredLitUI.SynchronizeLayerProperties
// WARNING
// All the following properties that concern the UV mapping are the same as in the Lit shader.
// This means that they will get overridden when synchronizing the various layers.
// To avoid this, make sure that all properties here are in the exclusion list in LayeredLitUI.SynchronizeLayerProperties
_TexWorldScale0("Tiling", Float) = 1.0
_TexWorldScale1("Tiling", Float) = 1.0
_TexWorldScale2("Tiling", Float) = 1.0

HLSLINCLUDE
#pragma target 5.0
#pragma only_renderers d3d11 ps4// TEMP: unitl we go futher in dev
#pragma target 4.5
#pragma only_renderers d3d11 ps4 metal // TEMP: unitl we go futher in dev
#pragma shader_feature _ALPHATEST_ON
#pragma shader_feature _DISTORTION_ON

#pragma shader_feature _DETAIL_MAP
#pragma shader_feature _ _LAYER_MASK_VERTEX_COLOR_MUL _LAYER_MASK_VERTEX_COLOR_ADD
#pragma shader_feature _HEIGHT_BASED_BLEND
#pragma shader_feature _HEIGHT_BASED_BLEND_V2
#pragma shader_feature _ _LAYEREDLIT_3_LAYERS _LAYEREDLIT_4_LAYERS
#pragma multi_compile LIGHTMAP_OFF LIGHTMAP_ON

62
Assets/ScriptableRenderLoop/HDRenderPipeline/Material/LayeredLit/LayeredLitTessellation.shader


_HeightOffset2("_HeightOffset2", Range(-0.3, 0.3)) = 0.0
_HeightOffset3("_HeightOffset3", Range(-0.3, 0.3)) = 0.0
_HeightFactor1("_HeightFactor1", Range(0, 5)) = 1
_HeightFactor2("_HeightFactor2", Range(0, 5)) = 1
_HeightFactor3("_HeightFactor3", Range(0, 5)) = 1
_HeightFactor1("_HeightFactor1", Float) = 1
_HeightFactor2("_HeightFactor2", Float) = 1
_HeightFactor3("_HeightFactor3", Float) = 1
_BlendSize1("_BlendSize1", Range(0, 0.30)) = 0.0
_BlendSize2("_BlendSize2", Range(0, 0.30)) = 0.0

_VertexColorHeightFactor("_VertexColorHeightFactor", Float) = 0.3
// Layer blending options V2
[ToggleOff] _UseHeightBasedBlendV2("Use Height Blend V2", Float) = 0.0
_HeightCenterOffset1("_HeightCenterOffset1", Float) = 0.0
_HeightCenterOffset2("_HeightCenterOffset2", Float) = 0.0
_HeightCenterOffset3("_HeightCenterOffset3", Float) = 0.0
_BlendUsingHeight1("_BlendUsingHeight1", Float) = 0.0
_BlendUsingHeight2("_BlendUsingHeight2", Float) = 0.0
_BlendUsingHeight3("_BlendUsingHeight3", Float) = 0.0
_InheritBaseNormal1("_InheritBaseNormal1", Range(0, 1.0)) = 0.0
_InheritBaseNormal2("_InheritBaseNormal2", Range(0, 1.0)) = 0.0
_InheritBaseNormal3("_InheritBaseNormal3", Range(0, 1.0)) = 0.0
_InheritBaseHeight1("_InheritBaseHeight1", Range(0, 1.0)) = 0.0
_InheritBaseHeight2("_InheritBaseHeight2", Range(0, 1.0)) = 0.0
_InheritBaseHeight3("_InheritBaseHeight3", Range(0, 1.0)) = 0.0
_InheritBaseColor1("_InheritBaseColor1", Range(0, 1.0)) = 0.0
_InheritBaseColor2("_InheritBaseColor2", Range(0, 1.0)) = 0.0
_InheritBaseColor3("_InheritBaseColor3", Range(0, 1.0)) = 0.0
_InheritBaseColorThreshold1("_InheritBaseColorThreshold1", Range(0, 1.0)) = 1.0
_InheritBaseColorThreshold2("_InheritBaseColorThreshold2", Range(0, 1.0)) = 1.0
_InheritBaseColorThreshold3("_InheritBaseColorThreshold3", Range(0, 1.0)) = 1.0
_MinimumOpacity1("_MinimumOpacity1", Range(0, 1.0)) = 1.0
_MinimumOpacity2("_MinimumOpacity2", Range(0, 1.0)) = 1.0
_MinimumOpacity3("_MinimumOpacity3", Range(0, 1.0)) = 1.0
_OpacityAsDensity1("_OpacityAsDensity1", Range(0, 1.0)) = 0.0
_OpacityAsDensity2("_OpacityAsDensity2", Range(0, 1.0)) = 0.0
_OpacityAsDensity3("_OpacityAsDensity3", Range(0, 1.0)) = 0.0
_DistortionVectorMap("DistortionVectorMap", 2D) = "black" {}
_EmissiveColor("EmissiveColor", Color) = (0, 0, 0)

[Enum(Mask Alpha, 0, BaseColor Alpha, 1)] _SmoothnessTextureChannel("Smoothness texture channel", Float) = 1
[Enum(TangentSpace, 0, ObjectSpace, 1)] _NormalMapSpace("NormalMap space", Float) = 0
[ToggleOff] _EnablePerPixelDisplacement("Enable per pixel displacement", Float) = 0.0
_PPDMinSamples("Min sample for POM", Range(1.0, 64.0)) = 5
_PPDMaxSamples("Max sample for POM", Range(1.0, 64.0)) = 15
// WARNING
// All the following properties that concern the UV mapping are the same as in the Lit shader.
// This means that they will get overridden when synchronizing the various layers.
// To avoid this, make sure that all properties here are in the exclusion list in LayeredLitUI.SynchronizeLayerProperties
// WARNING
// All the following properties that concern the UV mapping are the same as in the Lit shader.
// This means that they will get overridden when synchronizing the various layers.
// To avoid this, make sure that all properties here are in the exclusion list in LayeredLitUI.SynchronizeLayerProperties
_TexWorldScale0("Tiling", Float) = 1.0
_TexWorldScale1("Tiling", Float) = 1.0
_TexWorldScale2("Tiling", Float) = 1.0

HLSLINCLUDE
#pragma target 5.0
#pragma only_renderers d3d11 ps4// TEMP: unitl we go futher in dev
#pragma only_renderers d3d11 ps4 // TEMP: unitl we go futher in dev
#pragma shader_feature _ALPHATEST_ON
#pragma shader_feature _DISTORTION_ON

#pragma shader_feature _ _TESSELLATION_DISPLACEMENT _TESSELLATION_DISPLACEMENT_PHONG
#pragma shader_feature _TESSELLATION_OBJECT_SCALE
#pragma shader_feature _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A
#pragma shader_feature _LAYER_MAPPING_TRIPLANAR_0

#pragma shader_feature _DETAIL_MAP
#pragma shader_feature _ _LAYER_MASK_VERTEX_COLOR_MUL _LAYER_MASK_VERTEX_COLOR_ADD
#pragma shader_feature _HEIGHT_BASED_BLEND
#pragma shader_feature _HEIGHT_BASED_BLEND_V2
#pragma shader_feature _ _LAYEREDLIT_3_LAYERS _LAYEREDLIT_4_LAYERS
#pragma multi_compile LIGHTMAP_OFF LIGHTMAP_ON

#endif
// Explicitely said that we are a layered shader as we share code between lit and layered lit
#define LAYERED_LIT_SHADER
#define LAYERED_LIT_SHADER
//-------------------------------------------------------------------------------------
// variable declaration

// Lightmap memo
// DYNAMICLIGHTMAP_ON is used when we have an "enlighten lightmap" ie a lightmap updated at runtime by enlighten.This lightmap contain indirect lighting from realtime lights and realtime emissive material.Offline baked lighting(from baked material / light,
// both direct and indirect lighting) will hand up in the "regular" lightmap->LIGHTMAP_ON.
// No tessellation for Meta pass
#undef TESSELLATION_ON
#define SHADERPASS SHADERPASS_LIGHT_TRANSPORT
#include "../../Material/Material.hlsl"

}
}
CustomEditor "Experimental.Rendering.HDPipeline.LayeredLitGUI"
CustomEditor "Experimental.Rendering.HDPipeline.LayeredLitGUI"
}

13
Assets/ScriptableRenderLoop/HDRenderPipeline/Material/Lit/Editor/BaseLitUI.cs


public static GUIContent UVBaseDetailMappingText = new GUIContent("UV set for Base and Detail", "");
public static GUIContent normalMapSpaceText = new GUIContent("Normal/Tangent Map space", "");
public static GUIContent enablePerPixelDisplacementText = new GUIContent("Enable Per Pixel Displacement", "");
public static GUIContent ppdMinSamplesText = new GUIContent("Minimum samples", "Minimun samples to use with per pixel displacement mapping");
public static GUIContent ppdMaxSamplesText = new GUIContent("Maximum samples", "Maximum samples to use with per pxiel displacement mapping");
public static GUIContent detailMapModeText = new GUIContent("Detail Map with Normal", "Detail Map with AO / Height");
public static GUIContent UVDetailMappingText = new GUIContent("UV set for Detail", "");
public static GUIContent emissiveColorModeText = new GUIContent("Emissive Color Usage", "Use emissive color or emissive mask");

public static GUIContent tessellationFactorTriangleSizeText = new GUIContent("Triangle size", "Desired screen space sized of triangle (in pixel). Smaller value mean smaller triangle.");
public static GUIContent tessellationShapeFactorText = new GUIContent("Shape factor", "Strength of Phong tessellation shape (lerp factor)");
public static GUIContent tessellationBackFaceCullEpsilonText = new GUIContent("Triangle culling Epsilon", "If -1.0 back face culling is enabled for tessellation, higher number mean more aggressive culling and better performance");
public static GUIContent tessellationObjectScaleText = new GUIContent("Enable object scale", "Scale displacement taking into account the object scale");
public static GUIContent tessellationObjectScaleText = new GUIContent("Enable object scale", "Tesselation displacement will take into account the object scale - Only work with uniform positive scale");
}
public enum SurfaceType

if ((DoubleSidedMode)doubleSidedMode.floatValue == DoubleSidedMode.None)
{
m_MaterialEditor.ShaderProperty(tessellationBackFaceCullEpsilon, Styles.tessellationBackFaceCullEpsilonText);
}
// TODO: Implement
// m_MaterialEditor.ShaderProperty(tessellationObjectScale, Styles.tessellationObjectScaleText);
}
m_MaterialEditor.ShaderProperty(tessellationObjectScale, Styles.tessellationObjectScaleText);
EditorGUI.indentLevel--;
}
}

material.DisableKeyword("_TESSELLATION_DISPLACEMENT");
material.EnableKeyword("_TESSELLATION_DISPLACEMENT_PHONG");
}
bool tessellationObjectScaleEnable = material.GetFloat(kTessellationObjectScale) == 1.0;
SetKeyword(material, "_TESSELLATION_OBJECT_SCALE", tessellationObjectScaleEnable);
}
}

9
Assets/ScriptableRenderLoop/HDRenderPipeline/Material/Lit/Editor/LitUI.cs


protected const string kNormalMapSpace = "_NormalMapSpace";
protected MaterialProperty enablePerPixelDisplacement = null;
protected const string kEnablePerPixelDisplacement = "_EnablePerPixelDisplacement";
protected MaterialProperty ppdMinSamples = null;
protected const string kPpdMinSamples = "_PPDMinSamples";
protected MaterialProperty ppdMaxSamples = null;
protected const string kPpdMaxSamples = "_PPDMaxSamples";
protected MaterialProperty detailMapMode = null;
protected const string kDetailMapMode = "_DetailMapMode";
protected MaterialProperty UVDetail = null;

smoothnessMapChannel = FindProperty(kSmoothnessTextureChannel, props);
normalMapSpace = FindProperty(kNormalMapSpace, props);
enablePerPixelDisplacement = FindProperty(kEnablePerPixelDisplacement, props);
ppdMinSamples = FindProperty(kPpdMinSamples, props);
ppdMaxSamples = FindProperty(kPpdMaxSamples, props);
detailMapMode = FindProperty(kDetailMapMode, props);
emissiveColorMode = FindProperty(kEmissiveColorMode, props);
}

m_MaterialEditor.ShaderProperty(normalMapSpace, Styles.normalMapSpaceText.text);
m_MaterialEditor.ShaderProperty(emissiveColorMode, Styles.emissiveColorModeText.text);
m_MaterialEditor.ShaderProperty(enablePerPixelDisplacement, Styles.enablePerPixelDisplacementText.text);
m_MaterialEditor.ShaderProperty(ppdMinSamples, Styles.ppdMinSamplesText.text);
m_MaterialEditor.ShaderProperty(ppdMaxSamples, Styles.ppdMaxSamplesText.text);
ppdMinSamples.floatValue = Mathf.Min(ppdMinSamples.floatValue, ppdMaxSamples.floatValue);
EditorGUI.indentLevel--;
}

66
Assets/ScriptableRenderLoop/HDRenderPipeline/Material/Lit/Lit.cs


private Material m_InitPreFGD;
private RenderTexture m_PreIntegratedFGD;
// For area lighting
private Texture2D m_LtcGGXMatrix; // RGBA
private Texture2D m_LtcDisneyDiffuseMatrix; // RGBA
private Texture2D m_LtcMultiGGXFresnelDisneyDiffuse; // RGB, A unused
// For area lighting - We pack all texture inside a texture array to reduce the number of resource required
private Texture2DArray m_LtcData; // 0: m_LtcGGXMatrix - RGBA, 2: m_LtcDisneyDiffuseMatrix - RGBA, 3: m_LtcMultiGGXFresnelDisneyDiffuse - RGB, A unused
Material CreateEngineMaterial(string shaderPath)
{
Material mat = new Material(Shader.Find(shaderPath) as Shader);
mat.hideFlags = HideFlags.HideAndDontSave;
return mat;
}
Texture2D CreateLUT(int width, int height, TextureFormat format, Color[] pixels)
{
Texture2D tex = new Texture2D(width, height, format, false /*mipmap*/, true /*linear*/);
tex.hideFlags = HideFlags.HideAndDontSave;
tex.wrapMode = TextureWrapMode.Clamp;
tex.filterMode = FilterMode.Bilinear;
tex.SetPixels(pixels);
tex.Apply();
return tex;
}
Texture2D LoadLUT(TextureFormat format, float[] LUTScalar)
void LoadLUT(Texture2DArray tex, int arrayElement, TextureFormat format, float[] LUTScalar)
{
const int count = k_LtcLUTResolution * k_LtcLUTResolution;
Color[] pixels = new Color[count];

pixels[i] = new Color(0, 0, 0, LUTScalar[i]);
}
return CreateLUT(k_LtcLUTResolution, k_LtcLUTResolution, format, pixels);
tex.SetPixels(pixels, arrayElement);
Texture2D LoadLUT(TextureFormat format, double[,] LUTTransformInv)
void LoadLUT(Texture2DArray tex, int arrayElement, TextureFormat format, double[,] LUTTransformInv)
{
const int count = k_LtcLUTResolution * k_LtcLUTResolution;
Color[] pixels = new Color[count];

(float)LUTTransformInv[i, 6]);
}
return CreateLUT(k_LtcLUTResolution, k_LtcLUTResolution, format, pixels);
tex.SetPixels(pixels, arrayElement);
Texture2D LoadLUT(TextureFormat format, float[] LtcGGXMagnitudeData,
float[] LtcGGXFresnelData,
float[] LtcDisneyDiffuseMagnitudeData)
void LoadLUT(Texture2DArray tex, int arrayElement, TextureFormat format, float[] LtcGGXMagnitudeData,
float[] LtcGGXFresnelData,
float[] LtcDisneyDiffuseMagnitudeData)
{
const int count = k_LtcLUTResolution * k_LtcLUTResolution;
Color[] pixels = new Color[count];

LtcGGXFresnelData[i], LtcDisneyDiffuseMagnitudeData[i], 1);
}
return CreateLUT(k_LtcLUTResolution, k_LtcLUTResolution, format, pixels);
tex.SetPixels(pixels, arrayElement);
m_InitPreFGD = CreateEngineMaterial("Hidden/HDRenderPipeline/PreIntegratedFGD");
m_InitPreFGD = Utilities.CreateEngineMaterial("Hidden/HDRenderPipeline/PreIntegratedFGD");
m_PreIntegratedFGD = new RenderTexture(128, 128, 0, RenderTextureFormat.ARGBHalf);
m_PreIntegratedFGD = new RenderTexture(128, 128, 0, RenderTextureFormat.ARGBHalf, RenderTextureReadWrite.Linear);
m_LtcGGXMatrix = LoadLUT(TextureFormat.RGBAHalf, s_LtcGGXMatrixData);
m_LtcDisneyDiffuseMatrix = LoadLUT(TextureFormat.RGBAHalf, s_LtcDisneyDiffuseMatrixData);
m_LtcData = new Texture2DArray(k_LtcLUTResolution, k_LtcLUTResolution, 3, TextureFormat.RGBAHalf, false /*mipmap*/, true /* linear */)
{
hideFlags = HideFlags.HideAndDontSave,
wrapMode = TextureWrapMode.Clamp,
filterMode = FilterMode.Bilinear
};
LoadLUT(m_LtcData, 0, TextureFormat.RGBAHalf, s_LtcGGXMatrixData);
LoadLUT(m_LtcData, 1, TextureFormat.RGBAHalf, s_LtcDisneyDiffuseMatrixData);
m_LtcMultiGGXFresnelDisneyDiffuse = LoadLUT(TextureFormat.RGBAHalf, s_LtcGGXMagnitudeData,
s_LtcGGXFresnelData,
s_LtcDisneyDiffuseMagnitudeData);
LoadLUT(m_LtcData, 2, TextureFormat.RGBAHalf, s_LtcGGXMagnitudeData, s_LtcGGXFresnelData, s_LtcDisneyDiffuseMagnitudeData);
m_LtcData.Apply();
isInit = false;
}

public void Bind()
{
Shader.SetGlobalTexture("_PreIntegratedFGD", m_PreIntegratedFGD);
Shader.SetGlobalTexture("_LtcGGXMatrix", m_LtcGGXMatrix);
Shader.SetGlobalTexture("_LtcDisneyDiffuseMatrix", m_LtcDisneyDiffuseMatrix);
Shader.SetGlobalTexture("_LtcMultiGGXFresnelDisneyDiffuse", m_LtcMultiGGXFresnelDisneyDiffuse);
Shader.SetGlobalTexture("_PreIntegratedFGD", m_PreIntegratedFGD);
Shader.SetGlobalTexture("_LtcData", m_LtcData);
}
}
}

48
Assets/ScriptableRenderLoop/HDRenderPipeline/Material/Lit/Lit.hlsl


//-----------------------------------------------------------------------------
// SurfaceData is define in Lit.cs which generate Lit.cs.hlsl
#include "Lit.cs.hlsl"
//TODO: return this original relative path include after fixing a bug in Unity side
//#include "Lit.cs.hlsl"
#include "Assets/ScriptableRenderLoop/HDRenderPipeline/Material/Lit/Lit.cs.hlsl"
// In case we pack data uint16 buffer we need to change the output render target format to uint16
// TODO: Is there a way to automate these output type based on the format declare in lit.cs ?

// TODO: Check if anisotropy with a dynamic if on anisotropy > 0 is performant. Because it may mean we always calculate both isotropy and anisotropy case.
// Maybe we should always calculate anisotropy in case of standard ? Don't think the compile can optimize correctly.
// TODO: I haven't configure this sampler in the code, we should be able to do it (but Unity don't allow it for now...)
// By default Unity provide MIG_MAG_LINEAR_POINT sampler, so it fit with our need.
// TODO: to avoid the message Fragment program 'Frag' : sampler 'sampler_PreIntegratedFGD' has no matching texture and will be undefined.
// We need to test this define LIGHTLOOP_TILE_DIRECT, this is a bad workaround but no alternative until we can setup sampler correctly...
#if defined(LIT_DISPLAY_REFERENCE_IBL) || defined(LIGHTLOOP_TILE_DIRECT)
// When reference mode is enabled, then we need to chose another sampler not related to cubemap code...
SAMPLER2D(sampler_LtcGGXMatrix);
#define SRL_BilinearSampler sampler_LtcGGXMatrix // Used for all textures
#else
SAMPLER2D(sampler_PreIntegratedFGD);
#define SRL_BilinearSampler sampler_PreIntegratedFGD // Used for all textures
#endif
// TODO: we can share the sampler here and name it SRL_BilinearSampler. However Unity currently doesn't support to set sampler in C#
// + to avoid the message Fragment program 'Frag' : sampler 'sampler_PreIntegratedFGD' has no matching texture and will be undefined.
TEXTURE2D(_LtcGGXMatrix); // RGBA
TEXTURE2D(_LtcDisneyDiffuseMatrix); // RGBA
TEXTURE2D(_LtcMultiGGXFresnelDisneyDiffuse); // RGB, A unused
SAMPLER2D(sampler_PreIntegratedFGD);
TEXTURE2D_ARRAY(_LtcData); // We pack the 3 Ltc data inside a texture array
SAMPLER2D(sampler_LtcData);
#define LTC_GGX_MATRIX_INDEX 0 // RGBA
#define LTC_DISNEY_DIFFUSE_MATRIX_INDEX 1 // RGBA
#define LTC_MULTI_GGX_FRESNEL_DISNEY_DIFFUSE_INDEX 2 // RGB, A unused
//-----------------------------------------------------------------------------
// Helper functions/variable specific to this material

// _PreIntegratedFGD.y = Gv * Fc
// Pre integrate DisneyDiffuse FGD:
// _PreIntegratedFGD.z = DisneyDiffuse
float3 preFGD = SAMPLE_TEXTURE2D_LOD(_PreIntegratedFGD, SRL_BilinearSampler, float2(NdotV, perceptualRoughness), 0).xyz;
float3 preFGD = SAMPLE_TEXTURE2D_LOD(_PreIntegratedFGD, sampler_PreIntegratedFGD, float2(NdotV, perceptualRoughness), 0).xyz;
// f0 * Gv * (1 - Fc) + Gv * Fc
specularFGD = fresnel0 * preFGD.x + preFGD.y;

// Note we load the matrix transpose (avoid to have to transpose it in shader)
preLightData.ltcXformGGX = 0.0;
preLightData.ltcXformGGX._m22 = 1.0;
preLightData.ltcXformGGX._m00_m02_m11_m20 = SAMPLE_TEXTURE2D_LOD(_LtcGGXMatrix, SRL_BilinearSampler, uv, 0);
preLightData.ltcXformGGX._m00_m02_m11_m20 = SAMPLE_TEXTURE2D_ARRAY_LOD(_LtcData, sampler_LtcData, uv, LTC_GGX_MATRIX_INDEX, 0);
preLightData.ltcXformDisneyDiffuse._m00_m02_m11_m20 = SAMPLE_TEXTURE2D_LOD(_LtcDisneyDiffuseMatrix, SRL_BilinearSampler, uv, 0);
preLightData.ltcXformDisneyDiffuse._m00_m02_m11_m20 = SAMPLE_TEXTURE2D_ARRAY_LOD(_LtcData, sampler_LtcData, uv, LTC_DISNEY_DIFFUSE_MATRIX_INDEX, 0);
float3 ltcMagnitude = SAMPLE_TEXTURE2D_LOD(_LtcMultiGGXFresnelDisneyDiffuse, SRL_BilinearSampler, uv, 0).r;
float3 ltcMagnitude = SAMPLE_TEXTURE2D_ARRAY_LOD(_LtcData, sampler_LtcData, uv, LTC_MULTI_GGX_FRESNEL_DISNEY_DIFFUSE_INDEX, 0).rgb;
preLightData.ltcGGXFresnelMagnitudeDiff = ltcMagnitude.r;
preLightData.ltcGGXFresnelMagnitude = ltcMagnitude.g;
preLightData.ltcDisneyDiffuseMagnitude = ltcMagnitude.b;

// TODO: measure impact of having all these dynamic branch here and the gain (or not) of testing illuminace > 0
[branch] if (lightData.IESIndex >= 0 && illuminance > 0.0)
{
float3x3 lightToWorld = float3x3(lightData.right, lightData.up, lightData.forward);
float2 sphericalCoord = GetIESTextureCoordinate(lightToWorld, L);
illuminance *= SampleIES(lightLoopContext, lightData.IESIndex, sphericalCoord, 0).r;
}
//[branch] if (lightData.IESIndex >= 0 && illuminance > 0.0)
//{
// float3x3 lightToWorld = float3x3(lightData.right, lightData.up, lightData.forward);
// float2 sphericalCoord = GetIESTextureCoordinate(lightToWorld, L);
// illuminance *= SampleIES(lightLoopContext, lightData.IESIndex, sphericalCoord, 0).r;
//}
[branch] if (lightData.shadowIndex >= 0 && illuminance > 0.0)
{

8
Assets/ScriptableRenderLoop/HDRenderPipeline/Material/Lit/Lit.shader


[HideInInspector] _UVMappingPlanar("_UVMappingPlanar", Float) = 0
[Enum(TangentSpace, 0, ObjectSpace, 1)] _NormalMapSpace("NormalMap space", Float) = 0
[ToggleOff] _EnablePerPixelDisplacement("Enable per pixel displacement", Float) = 0.0
_PPDMinSamples("Min sample for POM", Range(1.0, 64.0)) = 5
_PPDMaxSamples("Max sample for POM", Range(1.0, 64.0)) = 15
[Enum(Use Emissive Color, 0, Use Emissive Mask, 1)] _EmissiveColorMode("Emissive color mode", Float) = 1
[Enum(Use Emissive Color, 0, Use Emissive Mask, 1)] _EmissiveColorMode("Emissive color mode", Float) = 1
#pragma target 5.0
#pragma only_renderers d3d11 ps4// TEMP: until we go futher in dev
#pragma target 4.5
#pragma only_renderers d3d11 ps4 metal // TEMP: until we go futher in dev
//-------------------------------------------------------------------------------------
// Variant

290
Assets/ScriptableRenderLoop/HDRenderPipeline/Material/Lit/LitData.hlsl


}
}
// TODO: Handle BC5 format, currently this code is for DXT5nm
// THis function below must call UnpackNormalmapRGorAG
float3 SampleNormalLayer(TEXTURE2D_ARGS(layerTex, layerSampler), LayerUV layerUV, float3 weights, float scale)
{
if (layerUV.isTriplanar)
{
float3 val = float3(0.0, 0.0, 0.0);
#define ADD_FUNC_SUFFIX(Name) Name
#define NORMAL_SAMPLE_FUNC(layerTex, layerSampler, layerUV, bias) SAMPLE_TEXTURE2D(layerTex, layerSampler, layerUV)
#include "LayeredLitNormalSampling.hlsl"
#undef ADD_FUNC_SUFFIX
#undef NORMAL_SAMPLE_FUNC
if (weights.x > 0.0)
val += weights.x * UnpackNormalAG(SAMPLE_TEXTURE2D(layerTex, layerSampler, layerUV.uvYZ), scale);
if (weights.y > 0.0)
val += weights.y * UnpackNormalAG(SAMPLE_TEXTURE2D(layerTex, layerSampler, layerUV.uvZX), scale);
if (weights.z > 0.0)
val += weights.z * UnpackNormalAG(SAMPLE_TEXTURE2D(layerTex, layerSampler, layerUV.uvXY), scale);
return normalize(val);
}
else
{
return UnpackNormalAG(SAMPLE_TEXTURE2D(layerTex, layerSampler, layerUV.uv), scale);
}
}
// This version is for normalmap with AG encoding only (use with details map)
float3 SampleNormalLayerAG(TEXTURE2D_ARGS(layerTex, layerSampler), LayerUV layerUV, float3 weights, float scale)
{
if (layerUV.isTriplanar)
{
float3 val = float3(0.0, 0.0, 0.0);
if (weights.x > 0.0)
val += weights.x * UnpackNormalAG(SAMPLE_TEXTURE2D(layerTex, layerSampler, layerUV.uvYZ), scale);
if (weights.y > 0.0)
val += weights.y * UnpackNormalAG(SAMPLE_TEXTURE2D(layerTex, layerSampler, layerUV.uvZX), scale);
if (weights.z > 0.0)
val += weights.z * UnpackNormalAG(SAMPLE_TEXTURE2D(layerTex, layerSampler, layerUV.uvXY), scale);
return normalize(val);
}
else
{
return UnpackNormalAG(SAMPLE_TEXTURE2D(layerTex, layerSampler, layerUV.uv), scale);
}
}
// This version is for normalmap with RGB encoding only, i.e non encoding. It is necessary to use this abstraction to handle correctly triplanar
// plus consistent with the normal scale parameter
float3 SampleNormalLayerRGB(TEXTURE2D_ARGS(layerTex, layerSampler), LayerUV layerUV, float3 weights, float scale)
{
if (layerUV.isTriplanar)
{
float3 val = float3(0.0, 0.0, 0.0);
if (weights.x > 0.0)
val += weights.x * UnpackNormalRGB(SAMPLE_TEXTURE2D(layerTex, layerSampler, layerUV.uvYZ), scale);
if (weights.y > 0.0)
val += weights.y * UnpackNormalRGB(SAMPLE_TEXTURE2D(layerTex, layerSampler, layerUV.uvZX), scale);
if (weights.z > 0.0)
val += weights.z * UnpackNormalRGB(SAMPLE_TEXTURE2D(layerTex, layerSampler, layerUV.uvXY), scale);
return normalize(val);
}
else
{
return UnpackNormalRGB(SAMPLE_TEXTURE2D(layerTex, layerSampler, layerUV.uv), scale);
}
}
#define ADD_FUNC_SUFFIX(Name) Name##_Bias
#define NORMAL_SAMPLE_FUNC(layerTex, layerSampler, layerUV, bias) SAMPLE_TEXTURE2D_BIAS(layerTex, layerSampler, layerUV, bias)
#include "LayeredLitNormalSampling.hlsl"
#undef ADD_FUNC_SUFFIX
#undef NORMAL_SAMPLE_FUNC
#define SAMPLE_LAYER_NORMALMAP(textureName, samplerName, coord, scale) SampleNormalLayer(TEXTURE2D_PARAM(textureName, samplerName), coord, layerTexCoord.weights, scale)
#define SAMPLE_LAYER_NORMALMAP_AG(textureName, samplerName, coord, scale) SampleNormalLayerAG(TEXTURE2D_PARAM(textureName, samplerName), coord, layerTexCoord.weights, scale)
#define SAMPLE_LAYER_NORMALMAP_RGB(textureName, samplerName, coord, scale) SampleNormalLayerRGB(TEXTURE2D_PARAM(textureName, samplerName), coord, layerTexCoord.weights, scale)
#define SAMPLE_LAYER_NORMALMAP(textureName, samplerName, coord, scale, useBias, bias) useBias ? SampleLayerNormal_Bias(TEXTURE2D_PARAM(textureName, samplerName), coord, layerTexCoord.weights, scale, bias) : SampleLayerNormal(TEXTURE2D_PARAM(textureName, samplerName), coord, layerTexCoord.weights, scale, bias)
#define SAMPLE_LAYER_NORMALMAP_AG(textureName, samplerName, coord, scale, useBias, bias) useBias ? SampleLayerNormalAG_Bias(TEXTURE2D_PARAM(textureName, samplerName), coord, layerTexCoord.weights, scale, bias) : SampleLayerNormalAG(TEXTURE2D_PARAM(textureName, samplerName), coord, layerTexCoord.weights, scale, bias)
#define SAMPLE_LAYER_NORMALMAP_RGB(textureName, samplerName, coord, scale, useBias, bias) useBias ? SampleLayerNormalRGB_Bias(TEXTURE2D_PARAM(textureName, samplerName), coord, layerTexCoord.weights, scale, bias) : SampleLayerNormalRGB(TEXTURE2D_PARAM(textureName, samplerName), coord, layerTexCoord.weights, scale, bias)
// Transforms 2D UV by scale/bias property
#define TRANSFORM_TEX(tex,name) ((tex.xy) * name##_ST.xy + name##_ST.zw)
#ifndef LAYERED_LIT_SHADER

positionWS, normalWS, isTriplanar, layerTexCoord);
}
void ApplyPerPixelDisplacement(FragInputs input, float3 V, inout LayerTexCoord layerTexCoord)
{
#if defined(_HEIGHTMAP) && defined(_PER_PIXEL_DISPLACEMENT)
// ref: https://www.gamedev.net/resources/_/technical/graphics-programming-and-theory/a-closer-look-at-parallax-occlusion-mapping-r3262
float3 viewDirTS = TransformWorldToTangent(V, input.tangentToWorld);
// Change the number of samples per ray depending on the viewing angle for the surface.
// Oblique angles require smaller step sizes to achieve more accurate precision for computing displacement.
int numSteps = (int)lerp(_PPDMaxSamples, _PPDMinSamples, viewDirTS.z);
ParallaxOcclusionMappingLayer(layerTexCoord, numSteps, viewDirTS);
// TODO: We are supposed to modify lightmaps coordinate (fetch in GetBuiltin), but this isn't the same uv mapping, so can't apply the offset here...
// Let's assume it will be "fine" as indirect diffuse is often low frequency
#endif
}
void GetSurfaceAndBuiltinData(FragInputs input, float3 V, inout PositionInputs posInput, out SurfaceData surfaceData, out BuiltinData builtinData)
{
LayerTexCoord layerTexCoord;

// Transform view vector in tangent space
float3 viewDirTS = TransformWorldToTangent(V, input.tangentToWorld);
ApplyDisplacement(input, viewDirTS, layerTexCoord);
ApplyPerPixelDisplacement(input, V, layerTexCoord);
float depthOffset = 0.0;
#ifdef _DEPTHOFFSET_ON

return max(finalLayerHeight, previousLayerHeight);
}
float3 ApplyHeightBasedBlendV2(float3 inputMask, float3 inputHeight, float3 blendUsingHeight)
{
return saturate(lerp(inputMask * inputHeight * blendUsingHeight * 100, 1, inputMask * inputMask)); // 100 arbitrary scale to limit blendUsingHeight values.
}
#define SURFACEDATA_BLEND_COLOR(surfaceData, name, mask) BlendLayeredFloat3(surfaceData##0.##name, surfaceData##1.##name, surfaceData##2.##name, surfaceData##3.##name, mask);
#define SURFACEDATA_BLEND_SCALAR(surfaceData, name, mask) BlendLayeredScalar(surfaceData##0.##name, surfaceData##1.##name, surfaceData##2.##name, surfaceData##3.##name, mask);

positionWS, normalWS, isTriplanar, layerTexCoord);
}
void ApplyPerPixelDisplacement(FragInputs input, float3 V, inout LayerTexCoord layerTexCoord)
{
#if defined(_HEIGHTMAP) && defined(_PER_PIXEL_DISPLACEMENT)
float3 viewDirTS = TransformWorldToTangent(V, input.tangentToWorld);
int numSteps = (int)lerp(_PPDMaxSamples, _PPDMinSamples, viewDirTS.z);
ParallaxOcclusionMappingLayer0(layerTexCoord, numSteps, viewDirTS);
ParallaxOcclusionMappingLayer1(layerTexCoord, numSteps, viewDirTS);
ParallaxOcclusionMappingLayer2(layerTexCoord, numSteps, viewDirTS);
ParallaxOcclusionMappingLayer3(layerTexCoord, numSteps, viewDirTS);
#endif
}
float3 ComputeInheritedNormalTS(FragInputs input, float3 normalTS0, float3 normalTS1, float3 normalTS2, float3 normalTS3, LayerTexCoord layerTexCoord, float weights[_MAX_LAYER])
{
float3 normalTS;
//#if !defined(_HEIGHT_BASED_BLEND_V2)
// float _InheritBaseLayer0 = 1.0f; // Default value for lerp when all weights but base layer are zero.
//
// // Compute the combined inheritance factor of layers 1,2 and 3
// float inheritFactor = PROP_BLEND_SCALAR(_InheritBaseLayer, weights);
// float3 vertexNormalTS = float3(0.0, 0.0, 1.0);
// // The idea here is to lerp toward vertex normal. This way when we don't want to inherit, we will combine layer 1/2/3 normal with a vertex normal which is neutral.
// float3 baseLayerNormalTS = normalize(lerp(vertexNormalTS, normalTS0, inheritFactor));
// // Blend layer 1/2/3 normals before combining to the base layer. Again we need to have a neutral value for base layer (vertex normal) in case all weights are zero.
// float3 layersNormalTS = BlendLayeredFloat3(vertexNormalTS, normalTS1, normalTS2, normalTS3, weights);
// normalTS = BlendNormalRNM(baseLayerNormalTS, layersNormalTS);
//#else
// Compute how much we want to inherit from base layer normal base on the mask. Base layer always fully inherit from "itself" if it's the visible layer.
float inheritBaseNormal = BlendLayeredScalar(1.0f, _InheritBaseNormal1, _InheritBaseNormal2, _InheritBaseNormal3, weights);
// Based on this inheritance parameters, fetch a lower level of the base layer normal map so that the less we inherit the more this tends to be "vertex normal"
float maxMipBias = 12.0f; // We arbitrarly choose the max bias for a 2048 texture. Smaller texture will bias toward vertex normal faster.
float3 inheritedBaseNormalTS = GetNormalTS0(input, layerTexCoord, float3(0.0, 0.0, 0.0), 0.0f, true, maxMipBias * (1.0 - inheritBaseNormal));
// Blend all layers but the base one. This will then be added to the "inherited" normal of base layer (that's why base layer here is tangent space vertex normal so that if it's the visible layer we add nothing in term of normal map).
float3 layersNormalTS = BlendLayeredFloat3(float3(0.0, 0.0, 1.0), normalTS1, normalTS2, normalTS3, weights);
// Add the inherited normal to the blended top layers.
normalTS = BlendNormalRNM(inheritedBaseNormalTS, layersNormalTS);
//#endif
return normalTS;
}
float3 ComputeInheritedColor(float3 baseColor0, float3 baseColor1, float3 baseColor2, float3 baseColor3, float compoMask, LayerTexCoord layerTexCoord, float weights[_MAX_LAYER])
{
//return BlendLayeredFloat3(baseColor0, baseColor1, baseColor2, baseColor3, weights);
float inheritBaseColor = BlendLayeredScalar(1.0f, _InheritBaseColor1, _InheritBaseColor2, _InheritBaseColor3, weights);
float inheritBaseColorThreshold = BlendLayeredScalar(1.0f, _InheritBaseColorThreshold1, _InheritBaseColorThreshold2, _InheritBaseColorThreshold3, weights);
inheritBaseColor = inheritBaseColor * (1.0 - saturate(compoMask / inheritBaseColorThreshold));
float textureBias = 12.0f;
float3 baseMeanColor0 = SAMPLE_TEXTURE2D_BIAS(_BaseColorMap0, sampler_BaseColorMap0, layerTexCoord.base0.uv, textureBias).rgb * _BaseColor0.rgb;
float3 baseMeanColor1 = SAMPLE_TEXTURE2D_BIAS(_BaseColorMap1, sampler_BaseColorMap0, layerTexCoord.base1.uv, textureBias).rgb * _BaseColor1.rgb;
float3 baseMeanColor2 = SAMPLE_TEXTURE2D_BIAS(_BaseColorMap2, sampler_BaseColorMap0, layerTexCoord.base2.uv, textureBias).rgb * _BaseColor2.rgb;
float3 baseMeanColor3 = SAMPLE_TEXTURE2D_BIAS(_BaseColorMap3, sampler_BaseColorMap0, layerTexCoord.base3.uv, textureBias).rgb * _BaseColor3.rgb;
//float3 toto1 = lerp(baseMeanColor1, baseMeanColor0, _InheritBaseColor1) + baseColor1 - baseMeanColor1;
//float3 toto2 = lerp(baseMeanColor2, baseMeanColor0, _InheritBaseColor2) + baseColor2 - baseMeanColor2;
//float3 toto3 = lerp(baseMeanColor3, baseMeanColor0, _InheritBaseColor3) + baseColor3 - baseMeanColor3;
//return BlendLayeredFloat3(baseColor0, toto1, toto3, toto3, weights);
float3 meanColor = BlendLayeredFloat3(baseMeanColor0, baseMeanColor1, baseMeanColor2, baseMeanColor3, weights);
float3 baseColor = BlendLayeredFloat3(baseColor0, baseColor1, baseColor2, baseColor3, weights);
//return lerp(baseMeanColor1, baseColor0, _InheritBaseColor1) + (baseColor1 - baseMeanColor1);
return lerp(meanColor, baseColor0, inheritBaseColor) + (baseColor - meanColor);
}
void ComputeLayerWeights(FragInputs input, LayerTexCoord layerTexCoord, float4 inputAlphaMask, out float outWeights[_MAX_LAYER])
{
float height0 = SampleHeightmap0(layerTexCoord);
float height1 = SampleHeightmap1(layerTexCoord, _HeightCenterOffset1, _HeightFactor1);
float height2 = SampleHeightmap2(layerTexCoord, _HeightCenterOffset2, _HeightFactor2);
float height3 = SampleHeightmap3(layerTexCoord, _HeightCenterOffset3, _HeightFactor3);
float4 heights = float4(height0, height1, height2, height3);
// Mask Values : Layer 1, 2, 3 are r, g, b
float3 inputMaskValues = SAMPLE_TEXTURE2D(_LayerMaskMap, sampler_LayerMaskMap, input.texCoord0).rgb;
// Mutually exclusive with _HEIGHT_BASED_BLEND
#if defined(_LAYER_MASK_VERTEX_COLOR_MUL) // Used when no layer mask is set
inputMaskValues *= input.color.rgb;
#elif defined(_LAYER_MASK_VERTEX_COLOR_ADD) || defined(_HEIGHT_BASED_BLEND_V2) // When layer mask is set, color is additive to enable user to override it.
inputMaskValues = saturate(inputMaskValues + input.color.rgb * 2.0 - 1.0);
#endif
#if defined(_HEIGHT_BASED_BLEND)
#if !defined(_HEIGHT_BASED_BLEND_V2)
float baseLayerHeight = heights.x;
baseLayerHeight = ApplyHeightBasedBlend(inputMaskValues.r, baseLayerHeight, heights.y, _HeightOffset1, _HeightFactor1, _BlendSize1, input.color.r);
baseLayerHeight = ApplyHeightBasedBlend(inputMaskValues.g, baseLayerHeight, heights.z, _HeightOffset2 + _HeightOffset1, _HeightFactor2, _BlendSize2, input.color.g);
ApplyHeightBasedBlend(inputMaskValues.b, baseLayerHeight, heights.w, _HeightOffset3 + _HeightOffset2 + _HeightOffset1, _HeightFactor3, _BlendSize3, input.color.b);
#else
float3 minOpaParam = float3(_MinimumOpacity1, _MinimumOpacity2, _MinimumOpacity3);
float3 remapedOpacity = (float3(1.0, 1.0, 1.0) - minOpaParam) * inputAlphaMask.yzw + minOpaParam; // Remap opacity mask from [0..1] to [minOpa..1]
float3 opacityAsDensity = saturate((inputAlphaMask.yzw - (float3(1.0, 1.0, 1.0) - inputMaskValues))*20.0);
float3 useOpacityAsDensityParam = float3(_OpacityAsDensity1, _OpacityAsDensity2, _OpacityAsDensity3);
inputMaskValues = lerp(inputMaskValues * remapedOpacity, opacityAsDensity, useOpacityAsDensityParam);
// HACK, use height0 to avoid compiler error for unused sampler
// To remove once we have POM
heights.y += (heights.x * 0.0001);
inputMaskValues = ApplyHeightBasedBlendV2(inputMaskValues, heights.yzw, float3(_BlendUsingHeight1, _BlendUsingHeight2, _BlendUsingHeight3));
#endif
#endif
ComputeMaskWeights(inputMaskValues, outWeights);
//#if defined(_HEIGHT_BASED_BLEND_V2)
// float inheritBaseHeight = BlendLayeredScalar(0.0f, _InheritBaseHeight1, _InheritBaseHeight2, _InheritBaseHeight3, weights);
// float blendedLayerHeight = BlendLayeredScalar(heights.x, heights.y, heights.z, heights.w, weights);
// float finalHeight = heights.x * inheritBaseHeight + blendedLayerHeight;
// // Use this for POM/Tesselation
//#endif
}
void GetSurfaceAndBuiltinData(FragInputs input, float3 V, inout PositionInputs posInput, out SurfaceData surfaceData, out BuiltinData builtinData)
{
LayerTexCoord layerTexCoord;

// Transform view vector in tangent space
float3 viewDirTS = TransformWorldToTangent(V, input.tangentToWorld);
float height0 = ApplyDisplacement0(input, viewDirTS, layerTexCoord);
float height1 = ApplyDisplacement1(input, viewDirTS, layerTexCoord);
float height2 = ApplyDisplacement2(input, viewDirTS, layerTexCoord);
float height3 = ApplyDisplacement3(input, viewDirTS, layerTexCoord);
ApplyPerPixelDisplacement(input, V, layerTexCoord);
SurfaceData surfaceData0;
SurfaceData surfaceData1;
SurfaceData surfaceData2;
SurfaceData surfaceData3;
float3 normalTS0;
float3 normalTS1;
float3 normalTS2;
float3 normalTS3;
SurfaceData surfaceData0, surfaceData1, surfaceData2, surfaceData3;
float3 normalTS0, normalTS1, normalTS2, normalTS3;
// Mask Values : Layer 1, 2, 3 are r, g, b
float3 maskValues = SAMPLE_TEXTURE2D(_LayerMaskMap, sampler_LayerMaskMap, input.texCoord0).rgb;
float weights[_MAX_LAYER];
ComputeLayerWeights(input, layerTexCoord, float4(alpha0, alpha1, alpha2, alpha3), weights);
// Mutually exclusive with _HEIGHT_BASED_BLEND
#if defined(_LAYER_MASK_VERTEX_COLOR_MUL) // Used when no layer mask is set
maskValues *= input.color.rgb;
#elif defined(_LAYER_MASK_VERTEX_COLOR_ADD) // When layer mask is set, color is additive to enable user to override it.
maskValues = saturate(maskValues + input.color.rgb * 2.0 - 1.0);
#endif
// For layered shader, alpha of base color is used as either an opacity mask, a composition mask for inheritance parameters or a density mask.
float alpha = PROP_BLEND_SCALAR(alpha, weights);
float baseLayerHeight = height0;
baseLayerHeight = ApplyHeightBasedBlend(maskValues.r, baseLayerHeight, height1, _HeightOffset1, _HeightFactor1, _BlendSize1, input.color.r);
baseLayerHeight = ApplyHeightBasedBlend(maskValues.g, baseLayerHeight, height2, _HeightOffset2 + _HeightOffset1, _HeightFactor2, _BlendSize2, input.color.g);
ApplyHeightBasedBlend(maskValues.b, baseLayerHeight, height3, _HeightOffset3 + _HeightOffset2 + _HeightOffset1, _HeightFactor3, _BlendSize3, input.color.b);
#endif
float weights[_MAX_LAYER];
ComputeMaskWeights(maskValues, weights);
surfaceData.baseColor = ComputeInheritedColor(surfaceData0.baseColor, surfaceData1.baseColor, surfaceData2.baseColor, surfaceData3.baseColor, alpha, layerTexCoord, weights);
#else
#endif
surfaceData.specularOcclusion = SURFACEDATA_BLEND_SCALAR(surfaceData, specularOcclusion, weights);
surfaceData.perceptualSmoothness = SURFACEDATA_BLEND_SCALAR(surfaceData, perceptualSmoothness, weights);
surfaceData.ambientOcclusion = SURFACEDATA_BLEND_SCALAR(surfaceData, ambientOcclusion, weights);

#if defined(_HEIGHT_BASED_BLEND)
float _InheritBaseLayer0 = 1.0f; // Default value for lerp when all weights but base layer are zero.
// Compute the combined inheritance factor of layers 1,2 and 3
float inheritFactor = PROP_BLEND_SCALAR(_InheritBaseLayer, weights);
float3 vertexNormalTS = float3(0.0, 0.0, 1.0);
// The idea here is to lerp toward vertex normal. This way when we don't want to inherit, we will combine layer 1/2/3 normal with a vertex normal which is neutral.
float3 baseLayerNormalTS = normalize(lerp(vertexNormalTS, normalTS0, inheritFactor));
// Blend layer 1/2/3 normals before combining to the base layer. Again we need to have a neutral value for base layer (vertex normal) in case all weights are zero.
float3 layersNormalTS = BlendLayeredFloat3(vertexNormalTS, normalTS1, normalTS2, normalTS3, weights);
normalTS = BlendNormalRNM(baseLayerNormalTS, layersNormalTS);
normalTS = ComputeInheritedNormalTS(input, normalTS0, normalTS1, normalTS2, normalTS3, layerTexCoord, weights);
surfaceData.normalWS = TransformTangentToWorld(normalTS, input.tangentToWorld);
surfaceData.tangentWS = input.tangentToWorld[0].xyz;

surfaceData.coatPerceptualSmoothness = 1.0;
surfaceData.specularColor = float3(0.0, 0.0, 0.0);
float alpha = PROP_BLEND_SCALAR(alpha, weights);
GetBuiltinData(input, surfaceData, alpha, depthOffset, builtinData);
}

203
Assets/ScriptableRenderLoop/HDRenderPipeline/Material/Lit/LitDataInternal.hlsl


ADD_IDX(layerTexCoord.details).uvXY = TRANSFORM_TEX(uvXY, ADD_IDX(_DetailMap));
}
float ADD_IDX(ApplyDisplacement)(inout FragInputs input, float3 viewDirTS, inout LayerTexCoord layerTexCoord)
float ADD_IDX(SampleHeightmap)(LayerTexCoord layerTexCoord, float centerOffset = 0.0f, float multiplier = 1.0f)
float height = 0.0f;
height = (SAMPLE_LAYER_TEXTURE2D(ADD_IDX(_HeightMap), ADD_ZERO_IDX(sampler_HeightMap), ADD_IDX(layerTexCoord.base)).r - ADD_IDX(_HeightCenter)) * ADD_IDX(_HeightAmplitude);
return (SAMPLE_TEXTURE2D(ADD_IDX(_HeightMap), ADD_ZERO_IDX(sampler_HeightMap), ADD_IDX(layerTexCoord.base).uv).r - ADD_IDX(_HeightCenter) - centerOffset) * ADD_IDX(_HeightAmplitude) * multiplier;
#else
return 0.0;
#endif
}
//#ifdef _PER_PIXEL_DISPLACEMENT
// //height = SAMPLE_LAYER_TEXTURE2D(ADD_IDX(_HeightMap), ADD_ZERO_IDX(sampler_HeightMap), ADD_IDX(layerTexCoord.base)).r * ADD_IDX(_HeightScale) + ADD_IDX(_HeightBias);
// float2 offset = ParallaxOffset(viewDirTS, height);
void ADD_IDX(ParallaxOcclusionMappingLayer)(inout LayerTexCoord layerTexCoord, int numSteps, float3 viewDirTS)
{
// Convention: 1.0 is top, 0.0 is bottom - POM is always inward, no extrusion
float stepSize = 1.0 / (float)numSteps;
// View vector is from the point to the camera, but we want to raymarch from camera to point, so reverse the sign
// The length of viewDirTS vector determines the furthest amount of displacement:
// float parallaxLimit = -length(viewDirTS.xy) / viewDirTS.z;
// float2 parallaxDir = normalize(Out.viewDirTS.xy);
// float2 parallaxMaxOffsetTS = parallaxDir * parallaxLimit;
// Above code simplify to
float2 parallaxMaxOffsetTS = (viewDirTS.xy / -viewDirTS.z) * ADD_IDX(_HeightAmplitude);
float2 texOffsetPerStep = stepSize * parallaxMaxOffsetTS;
float2 uv = ADD_IDX(layerTexCoord.base).uv;
// ADD_IDX(layerTexCoord.base).uv += offset;
// ADD_IDX(layerTexCoord.base).uvYZ += offset;
// ADD_IDX(layerTexCoord.base).uvZX += offset;
// ADD_IDX(layerTexCoord.base).uvXY += offset;
// Compute lod as we will sample inside a loop (so can't use regular sampling)
// It appear that CALCULATE_TEXTURE2D_LOD only return interger lod. We want to use float lod to have smoother transition and fading
// float lod = CALCULATE_TEXTURE2D_LOD(ADD_IDX(_HeightMap), ADD_ZERO_IDX(sampler_HeightMap), uv);
float lod = ComputeTextureLOD(uv, GET_TEXELSIZE_NAME(ADD_IDX(_HeightMap)));
// ADD_IDX(layerTexCoord.details).uv += offset;
// ADD_IDX(layerTexCoord.details).uvYZ += offset;
// ADD_IDX(layerTexCoord.details).uvZX += offset;
// ADD_IDX(layerTexCoord.details).uvXY += offset;
// Do a first step before the loop to init all value correctly
float2 texOffsetCurrent = 0;
float prevHeight = SAMPLE_TEXTURE2D_LOD(ADD_IDX(_HeightMap), ADD_ZERO_IDX(sampler_HeightMap), uv + texOffsetCurrent, lod).r;
texOffsetCurrent += texOffsetPerStep;
float currHeight = SAMPLE_TEXTURE2D_LOD(ADD_IDX(_HeightMap), ADD_ZERO_IDX(sampler_HeightMap), uv + texOffsetCurrent, lod).r;
float rayHeight = 1.0 - stepSize; // Start at top less one sample
// // Only modify texcoord for first layer, this will be use by for builtin data (like lightmap)
// if (LAYER_INDEX == 0)
// {
// input.texCoord0 += offset;
// input.texCoord1 += offset;
// input.texCoord2 += offset;
// input.texCoord3 += offset;
// }
// Linear search
for (int stepIndex = 0; stepIndex < numSteps; ++stepIndex)
{
// Have we found a height below our ray height ? then we have an intersection
if (currHeight > rayHeight)
break; // end the loop
prevHeight = currHeight;
rayHeight -= stepSize;
texOffsetCurrent += texOffsetPerStep;
// Sample height map which in this case is stored in the alpha channel of the normal map:
currHeight = SAMPLE_TEXTURE2D_LOD(ADD_IDX(_HeightMap), ADD_ZERO_IDX(sampler_HeightMap), uv + texOffsetCurrent, lod).r;
}
// Found below and above points, now perform line interesection (ray) with piecewise linear heightfield approximation
// Refine the search by adding few extra intersection
#define POM_REFINE 1
#if POM_REFINE
float pt0 = rayHeight + stepSize;
float pt1 = rayHeight;
float delta0 = pt0 - prevHeight;
float delta1 = pt1 - currHeight;
float2 offset = float2(0.0, 0.0);
float threshold = 1.0;
for (int i = 0; i < 5; ++i)
{
float t = (pt0 * delta1 - pt1 * delta0) / (delta1 - delta0);
offset = (1 - t) * texOffsetPerStep * numSteps;
currHeight = SAMPLE_TEXTURE2D_LOD(ADD_IDX(_HeightMap), ADD_ZERO_IDX(sampler_HeightMap), uv + offset, lod).r;
threshold = t - currHeight;
if (abs(threshold) <= 0.01)
break;
if (threshold < 0.0)
{
delta1 = threshold;
pt1 = t;
}
else
{
delta0 = threshold;
pt0 = t;
}
}
// // Need to refetch for the right parallaxed height for layer blending to behave correctly...
// height = SAMPLE_LAYER_TEXTURE2D(ADD_IDX(_HeightMap), ADD_ZERO_IDX(sampler_HeightMap), ADD_IDX(layerTexCoord.base)).r * ADD_IDX(_HeightScale) + ADD_IDX(_HeightBias);
#else
//float pt0 = rayHeight + stepSize;
//float pt1 = rayHeight;
//float delta0 = pt0 - prevHeight;
//float delta1 = pt1 - currHeight;
//float t = (pt0 * delta1 - pt1 * delta0) / (delta1 - delta0);
//float2 offset = (1 - t) * texOffsetPerStep * numSteps;
// #endif
// A bit more optimize
float delta0 = currHeight - rayHeight;
float delta1 = (rayHeight + stepSize) - prevHeight;
float ratio = delta0 / (delta0 + delta1);
float2 offset = texOffsetCurrent - ratio * texOffsetPerStep;
return height;
// TODO: expose LOD fading
//float lodThreshold = 0.0;
//offset *= (1.0 - saturate(lod - lodThreshold));
// Apply offset only on base. Details could use another mapping and will not be consistant...
// Don't know if this will still ok.
// TODO: check with artists
ADD_IDX(layerTexCoord.base).uv += offset;
}
float3 ADD_IDX(GetNormalTS)(FragInputs input, LayerTexCoord layerTexCoord, float3 detailNormalTS, float detailMask, bool useBias, float bias)
{
float3 normalTS;
#ifdef _NORMALMAP
#ifdef _NORMALMAP_TANGENT_SPACE
normalTS = SAMPLE_LAYER_NORMALMAP(ADD_IDX(_NormalMap), ADD_ZERO_IDX(sampler_NormalMap), ADD_IDX(layerTexCoord.base), ADD_ZERO_IDX(_NormalScale), useBias, bias);
#else // Object space
float3 normalOS = SAMPLE_LAYER_NORMALMAP_RGB(ADD_IDX(_NormalMap), ADD_ZERO_IDX(sampler_NormalMap), ADD_IDX(layerTexCoord.base), ADD_ZERO_IDX(_NormalScale), useBias, bias).rgb;
normalTS = TransformObjectToTangent(normalOS, input.tangentToWorld);
#endif
#ifdef _DETAIL_MAP
normalTS = lerp(normalTS, BlendNormalRNM(normalTS, detailNormalTS), detailMask);
#endif
#else
normalTS = float3(0.0, 0.0, 1.0);
#endif
#if defined(_DOUBLESIDED_LIGHTING_FLIP) || defined(_DOUBLESIDED_LIGHTING_MIRROR)
#ifdef _DOUBLESIDED_LIGHTING_FLIP
float3 oppositeNormalTS = -normalTS;
#else
// Mirror the normal with the plane define by vertex normal
float3 oppositeNormalTS = reflect(normalTS, float3(0.0, 0.0, 1.0)); // Reflect around vertex normal (in tangent space this is z)
#endif
// TODO : Test if GetOddNegativeScale() is necessary here in case of normal map, as GetOddNegativeScale is take into account in CreateTangentToWorld();
normalTS = input.isFrontFace ?
(GetOddNegativeScale() >= 0.0 ? normalTS : oppositeNormalTS) :
(-GetOddNegativeScale() >= 0.0 ? normalTS : oppositeNormalTS);
#endif
return normalTS;
}
// Return opacity

clip(alpha - _AlphaCutoff);
#endif
float3 detailNormalTS = float3(0.0, 0.0, 0.0);
float detailMask = 0.0;
float detailMask = SAMPLE_LAYER_TEXTURE2D(ADD_IDX(_DetailMask), ADD_ZERO_IDX(sampler_DetailMask), ADD_IDX(layerTexCoord.base)).b;
detailMask = SAMPLE_LAYER_TEXTURE2D(ADD_IDX(_DetailMask), ADD_ZERO_IDX(sampler_DetailMask), ADD_IDX(layerTexCoord.base)).b;
float2 detailAlbedoAndSmoothness = SAMPLE_LAYER_TEXTURE2D(ADD_IDX(_DetailMap), ADD_ZERO_IDX(sampler_DetailMap), ADD_IDX(layerTexCoord.details)).rb;
float detailAlbedo = detailAlbedoAndSmoothness.r;
float detailSmoothness = detailAlbedoAndSmoothness.g;

float3 detailNormalTS = SAMPLE_LAYER_NORMALMAP_AG(ADD_IDX(_DetailMap), ADD_ZERO_IDX(sampler_DetailMap), ADD_IDX(layerTexCoord.details), ADD_ZERO_IDX(_DetailNormalScale));
detailNormalTS = SAMPLE_LAYER_NORMALMAP_AG(ADD_IDX(_DetailMap), ADD_ZERO_IDX(sampler_DetailMap), ADD_IDX(layerTexCoord.details), ADD_ZERO_IDX(_DetailNormalScale), false, 0.0f);
float3 detailNormalTS = float3(0.0, 0.0, 1.0);
detailNormalTS = float3(0.0, 0.0, 1.0);
//float detailAO = detail.b;
#endif
#endif

surfaceData.normalWS = float3(0.0, 0.0, 0.0); // Need to init this so that the compiler leaves us alone.
// TODO: think about using BC5
#ifdef _NORMALMAP
#ifdef _NORMALMAP_TANGENT_SPACE
normalTS = SAMPLE_LAYER_NORMALMAP(ADD_IDX(_NormalMap), ADD_ZERO_IDX(sampler_NormalMap), ADD_IDX(layerTexCoord.base), ADD_ZERO_IDX(_NormalScale));
#else // Object space
float3 normalOS = SAMPLE_LAYER_NORMALMAP_RGB(ADD_IDX(_NormalMap), ADD_ZERO_IDX(sampler_NormalMap), ADD_IDX(layerTexCoord.base), ADD_ZERO_IDX(_NormalScale)).rgb;
normalTS = TransformObjectToTangent(normalOS, input.tangentToWorld);
#endif
#ifdef _DETAIL_MAP
normalTS = lerp(normalTS, BlendNormalRNM(normalTS, detailNormalTS), detailMask);
#endif
#else
normalTS = float3(0.0, 0.0, 1.0);
#endif
#if defined(_DOUBLESIDED_LIGHTING_FLIP) || defined(_DOUBLESIDED_LIGHTING_MIRROR)
#ifdef _DOUBLESIDED_LIGHTING_FLIP
float3 oppositeNormalTS = -normalTS;
#else
// Mirror the normal with the plane define by vertex normal
float3 oppositeNormalTS = reflect(normalTS, float3(0.0, 0.0, 1.0)); // Reflect around vertex normal (in tangent space this is z)
#endif
// TODO : Test if GetOddNegativeScale() is necessary here in case of normal map, as GetOddNegativeScale is take into account in CreateTangentToWorld();
normalTS = input.isFrontFace ?
(GetOddNegativeScale() >= 0.0 ? normalTS : oppositeNormalTS) :
(-GetOddNegativeScale() >= 0.0 ? normalTS : oppositeNormalTS);
#endif
normalTS = ADD_IDX(GetNormalTS)(input, layerTexCoord, detailNormalTS, detailMask, false, 0.0f);
#ifdef _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A
surfaceData.perceptualSmoothness = SAMPLE_LAYER_TEXTURE2D(ADD_IDX(_BaseColorMap), ADD_ZERO_IDX(sampler_BaseColorMap), ADD_IDX(layerTexCoord.base)).a;

39
Assets/ScriptableRenderLoop/HDRenderPipeline/Material/Lit/LitProperties.hlsl


TEXTURE2D(_HeightMap);
SAMPLER2D(sampler_HeightMap);
float4 _HeightMap_TexelSize; // Unity facility. This will provide the size of the heightmap to the shader
float _HeightAmplitude;
float _HeightCenter;

float4 _UVMappingMask;
float4 _UVDetailsMappingMask;
float _PPDMaxSamples;
float _PPDMinSamples;
#else // LAYERED_LIT_SHADER
// Set of users variables

PROP_DECL(float, _NormalScale);
PROP_DECL_TEX2D(_HeightMap);
float4 _HeightMap0_TexelSize;
float4 _HeightMap1_TexelSize;
float4 _HeightMap2_TexelSize;
float4 _HeightMap3_TexelSize;
PROP_DECL_TEX2D(_DetailMask);
PROP_DECL_TEX2D(_DetailMap);

float _InheritBaseLayer2;
float _InheritBaseLayer3;
// Blend Properties V2
float _UseHeightBasedBlendV2;
float _HeightCenterOffset1;
float _HeightCenterOffset2;
float _HeightCenterOffset3;
float _BlendUsingHeight1;
float _BlendUsingHeight2;
float _BlendUsingHeight3;
float _InheritBaseNormal1;
float _InheritBaseNormal2;
float _InheritBaseNormal3;
float _InheritBaseHeight1;
float _InheritBaseHeight2;
float _InheritBaseHeight3;
float _InheritBaseColor1;
float _InheritBaseColor2;
float _InheritBaseColor3;
float _InheritBaseColorThreshold1;
float _InheritBaseColorThreshold2;
float _InheritBaseColorThreshold3;
float _MinimumOpacity1;
float _MinimumOpacity2;
float _MinimumOpacity3;
float _OpacityAsDensity1;
float _OpacityAsDensity2;
float _OpacityAsDensity3;
float3 _EmissiveColor;
TEXTURE2D(_EmissiveColorMap);
SAMPLER2D(sampler_EmissiveColorMap);

PROP_DECL(float4, _UVDetailsMappingMask);
float _AlphaCutoff;
float _PPDMaxSamples;
float _PPDMinSamples;
#endif // LAYERED_LIT_SHADER

21
Assets/ScriptableRenderLoop/HDRenderPipeline/Material/Lit/LitTessellation.hlsl


float4 TessellationEdge(float3 p0, float3 p1, float3 p2, float3 n0, float3 n1, float3 n2)
float4 GetTessellationFactors(float3 p0, float3 p1, float3 p2, float3 n0, float3 n1, float3 n2)
{
float maxDisplacement = ADD_ZERO_IDX(_HeightAmplitude);
#ifdef _LAYER_COUNT

// Distance based tessellation
if (_TessellationFactorMaxDistance > 0.0)
{
tessFactor *= GetDistanceBasedTessFactor(p0, p1, p2, _WorldSpaceCameraPos, _TessellationFactorMinDistance, _TessellationFactorMaxDistance);
float3 distFactor = GetDistanceBasedTessFactor(p0, p1, p2, _WorldSpaceCameraPos, _TessellationFactorMinDistance, _TessellationFactorMaxDistance);
// We square the disance factor as it allow a better percptual descrease of vertex density.
tessFactor *= distFactor * distFactor;
}
tessFactor *= _TessellationFactor;

float2(0.0, 0.0),
#endif
input.positionWS,
#ifdef VARYINGS_DS_NEED_NORMAL
#else
float3(0.0, 0.0, 1.0),
#endif
layerTexCoord);
// TODO: For now just use Layer0, but we are suppose to apply the same heightmap blending than in the pixel shader

float height = 0.0;
#endif
#ifdef VARYINGS_DS_NEED_NORMAL
return height * input.normalWS;
#else
return float3(0.0, 0.0, 0.0);
float3 displ = height * input.normalWS;
// Applying scaling of the object if requested
#ifdef _TESSELLATION_OBJECT_SCALE
displ *= input.objectScale;
return displ;
}

5
Assets/ScriptableRenderLoop/HDRenderPipeline/Material/Lit/LitTessellation.shader


[HideInInspector] _UVMappingPlanar("_UVMappingPlanar", Float) = 0
[Enum(TangentSpace, 0, ObjectSpace, 1)] _NormalMapSpace("NormalMap space", Float) = 0
[ToggleOff] _EnablePerPixelDisplacement("Enable per pixel displacement", Float) = 0.0
_PPDMinSamples("Min sample for POM", Range(1.0, 64.0)) = 5
_PPDMaxSamples("Max sample for POM", Range(1.0, 64.0)) = 15
[Enum(DetailMapNormal, 0, DetailMapAOHeight, 1)] _DetailMapMode("DetailMap mode", Float) = 0
[Enum(UV0, 0, UV1, 1, UV2, 2, UV3, 3)] _UVDetail("UV Set for detail", Float) = 0
[HideInInspector] _UVDetailsMappingMask("_UVDetailsMappingMask", Color) = (1, 0, 0, 0)

#pragma shader_feature _ _DOUBLESIDED _DOUBLESIDED_LIGHTING_FLIP _DOUBLESIDED_LIGHTING_MIRROR
// Default is _TESSELLATION_PHONG
#pragma shader_feature _ _TESSELLATION_DISPLACEMENT _TESSELLATION_DISPLACEMENT_PHONG
#pragma shader_feature _TESSELLATION_OBJECT_SCALE
#pragma shader_feature _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A
#pragma shader_feature _MAPPING_TRIPLANAR

// both direct and indirect lighting) will hand up in the "regular" lightmap->LIGHTMAP_ON.
// No tessellation for Meta pass
#undef TESSELLATION_ON
#define SHADERPASS SHADERPASS_LIGHT_TRANSPORT
#include "../../Material/Material.hlsl"

ENDHLSL
}
}
CustomEditor "Experimental.Rendering.HDPipeline.LitGUI"

4
Assets/ScriptableRenderLoop/HDRenderPipeline/Material/Lit/Resources/PreIntegratedFGD.shader


HLSLPROGRAM
#pragma vertex Vert
#pragma fragment Frag
#pragma target 5.0
#pragma only_renderers d3d11 ps4// TEMP: unitl we go futher in dev
#pragma target 4.5
#pragma only_renderers d3d11 ps4 metal // TEMP: unitl we go futher in dev
#include "Common.hlsl"
#include "ImageBasedLighting.hlsl"

2
Assets/ScriptableRenderLoop/HDRenderPipeline/Material/Lit/ShaderPass/LitDepthPass.hlsl


#endif
// Attributes
#define REQUIRE_UV_FOR_TESSELATION (defined(TESSELLATION_ON) && (defined(_TESSELATION_DISPLACEMENT) || defined(_TESSELATION_DISPLACEMENT_PHONG)))
#define REQUIRE_UV_FOR_TESSELATION (defined(TESSELLATION_ON) && (defined(_TESSELLATION_DISPLACEMENT) || defined(_TESSELLATION_DISPLACEMENT_PHONG)))
#define REQUIRE_TANGENT_TO_WORLD (defined(_HEIGHTMAP) && defined(_PER_PIXEL_DISPLACEMENT))
// This first set of define allow to say which attributes will be use by the mesh in the vertex and domain shader (for tesselation)

2
Assets/ScriptableRenderLoop/HDRenderPipeline/Material/Lit/ShaderPass/LitDistortionPass.hlsl


#endif
// Attributes
#define REQUIRE_UV_FOR_TESSELATION (defined(TESSELLATION_ON) && (defined(_TESSELATION_DISPLACEMENT) || defined(_TESSELATION_DISPLACEMENT_PHONG)))
#define REQUIRE_UV_FOR_TESSELATION (defined(TESSELLATION_ON) && (defined(_TESSELLATION_DISPLACEMENT) || defined(_TESSELLATION_DISPLACEMENT_PHONG)))
#define REQUIRE_TANGENT_TO_WORLD (defined(_HEIGHTMAP) && defined(_PER_PIXEL_DISPLACEMENT))
// This first set of define allow to say which attributes will be use by the mesh in the vertex and domain shader (for tesselation)

4
Assets/ScriptableRenderLoop/HDRenderPipeline/Material/Lit/ShaderPass/LitVelocityPass.hlsl


// conflict with the normal in the semantic. This need to be fix! Also no per pixel displacement is possible either.
// Attributes
#define REQUIRE_UV_FOR_TESSELATION (defined(TESSELLATION_ON) && (defined(_TESSELATION_DISPLACEMENT) || defined(_TESSELATION_DISPLACEMENT_PHONG)))
#define REQUIRE_UV_FOR_TESSELATION (defined(TESSELLATION_ON) && (defined(_TESSELLATION_DISPLACEMENT) || defined(_TESSELLATION_DISPLACEMENT_PHONG)))
#define REQUIRE_TANGENT_TO_WORLD 0 /* (defined(_HEIGHTMAP) && defined(_PER_PIXEL_DISPLACEMENT)) */
// This first set of define allow to say which attributes will be use by the mesh in the vertex and domain shader (for tesselation)

// #define ATTRIBUTES_NEED_NORMAL
// #define ATTRIBUTES_NEED_NORMAL - When reenable, think to also enable code in VertMesh.hlsl
#endif
#if REQUIRE_TANGENT_TO_WORLD
#define ATTRIBUTES_NEED_TANGENT

4
Assets/ScriptableRenderLoop/HDRenderPipeline/Material/Unlit/Unlit.shader


HLSLINCLUDE
#pragma target 5.0
#pragma only_renderers d3d11 ps4 // TEMP: unitl we go futher in dev
#pragma target 4.5
#pragma only_renderers d3d11 ps4 metal // TEMP: unitl we go futher in dev
//-------------------------------------------------------------------------------------
// Variant

2
Assets/ScriptableRenderLoop/HDRenderPipeline/PostProcess/Resources/EyeAdaptation.shader


HLSLINCLUDE
#pragma target 5.0
#pragma target 4.5
#include "Common.hlsl"
#include "Assets/ScriptableRenderLoop/HDRenderPipeline/ShaderVariables.hlsl"
#include "EyeAdaptation.hlsl"

2
Assets/ScriptableRenderLoop/HDRenderPipeline/PostProcess/Resources/FinalPass.shader


HLSLINCLUDE
#pragma target 5.0
#pragma target 4.5
#include "Common.hlsl"
#include "Assets/ScriptableRenderLoop/HDRenderPipeline/ShaderVariables.hlsl"
#include "ColorGrading.hlsl"

2
Assets/ScriptableRenderLoop/HDRenderPipeline/PostProcess/Resources/LutGen.shader


{
HLSLINCLUDE
#pragma target 5.0
#pragma target 4.5
#include "Common.hlsl"
#include "Assets/ScriptableRenderLoop/HDRenderPipeline/ShaderVariables.hlsl"
#include "ColorGrading.hlsl"

14
Assets/ScriptableRenderLoop/HDRenderPipeline/ShaderPass/TessellationShare.hlsl


float3 p1 = varying1.vmesh.positionWS;
float3 p2 = varying2.vmesh.positionWS;
#ifdef VARYINGS_DS_NEED_NORMAL
#else
float3 n0 = float3(0.0, 0.0, 0.0);
float3 n1 = float3(0.0, 0.0, 0.0);
float3 n2 = float3(0.0, 0.0, 0.0);
#endif
float4 tf = TessellationEdge(p0, p1, p2, n0, n1, n2);
float4 tf = GetTessellationFactors(p0, p1, p2, n0, n1, n2);
TessellationFactors output;
output.edge[0] = tf.x;
output.edge[1] = tf.y;

float3 p1 = varying1.vmesh.positionWS;
float3 p2 = varying2.vmesh.positionWS;
#ifdef VARYINGS_DS_NEED_NORMAL
#else
float3 n0 = float3(0.0, 0.0, 0.0);
float3 n1 = float3(0.0, 0.0, 0.0);
float3 n2 = float3(0.0, 0.0, 0.0);
#endif
varying.vmesh.positionWS = PhongTessellation( varying.vmesh.positionWS,
p0, p1, p2, n0, n1, n2,

38
Assets/ScriptableRenderLoop/HDRenderPipeline/ShaderPass/VaryingMesh.hlsl


output.interpolators1.w = input.positionWS.x;
output.interpolators2.w = input.positionWS.y;
output.interpolators3.w = input.positionWS.z;
#else
output.interpolators1.w = 0.0;
output.interpolators2.w = 0.0;
output.interpolators3.w = 0.0;
#endif
#else
#ifdef VARYINGS_NEED_POSITION_WS

// We can deduce these defines from the other defines
// We need to pass to DS any varying required by pixel shader
// If we have required an attributes that is not present in varyings it mean we will be for DS
#if defined(VARYINGS_NEED_TANGENT_TO_WORLD) || defined(ATTRIBUTES_NEED_NORMAL)
#define VARYINGS_DS_NEED_NORMAL
#endif
#if defined(VARYINGS_NEED_TANGENT_TO_WORLD) || defined(ATTRIBUTES_NEED_TANGENT)
#define VARYINGS_DS_NEED_TANGENT
#endif

struct VaryingsMeshToDS
{
float3 positionWS;
#ifdef VARYINGS_DS_NEED_NORMAL
#endif
#ifdef VARYINGS_DS_NEED_TANGENT
float4 tangentWS;
#endif

#ifdef VARYINGS_DS_NEED_COLOR
float4 color;
#endif
#ifdef _TESSELLATION_OBJECT_SCALE
float3 objectScale;
#endif
float3 interpolators1 : NORMAL; // NormalWS
#ifdef VARYINGS_DS_NEED_NORMAL
float3 interpolators1 : NORMAL;
#endif
#ifdef VARYINGS_DS_NEED_TANGENT
float4 interpolators2 : TANGENT;
#endif

#ifdef VARYINGS_DS_NEED_COLOR
float4 interpolators5 : TEXCOORD2;
#endif
#ifdef _TESSELLATION_OBJECT_SCALE
float3 interpolators6 : TEXCOORD3;
#endif
};
// Functions to pack data to use as few interpolator as possible, the ShaderGraph should generate these functions

output.interpolators0 = input.positionWS;
#ifdef VARYINGS_DS_NEED_NORMAL
#endif
#ifdef VARYINGS_DS_NEED_TANGENT
output.interpolators2 = input.tangentWS;
#endif

#ifdef VARYINGS_DS_NEED_COLOR
output.interpolators5 = input.color;
#endif
#ifdef _TESSELLATION_OBJECT_SCALE
output.interpolators6 = input.objectScale;
#endif
return output;
}

VaryingsMeshToDS output;
output.positionWS = input.interpolators0;
#ifdef VARYINGS_DS_NEED_NORMAL
#endif
#ifdef VARYINGS_DS_NEED_TANGENT
output.tangentWS = input.interpolators2;
#endif

#ifdef VARYINGS_DS_NEED_COLOR
output.color = input.interpolators5;
#endif
#ifdef _TESSELLATION_OBJECT_SCALE
output.objectScale = input.interpolators6;
#endif
return output;
}

TESSELLATION_INTERPOLATE_BARY(positionWS, baryCoords);
#ifdef VARYINGS_DS_NEED_NORMAL
#endif
#ifdef VARYINGS_DS_NEED_TANGENT
// This will interpolate the sign but should be ok in practice as we may expect a triangle to have same sign (? TO CHECK)
TESSELLATION_INTERPOLATE_BARY(tangentWS, baryCoords);

#endif
#ifdef VARYINGS_DS_NEED_COLOR
TESSELLATION_INTERPOLATE_BARY(color, baryCoords);
#endif
#ifdef _TESSELLATION_OBJECT_SCALE
// objectScale doesn't change for the whole object.
ouput.objectScale = input0.objectScale;
#endif
return ouput;

16
Assets/ScriptableRenderLoop/HDRenderPipeline/ShaderPass/VertMesh.hlsl


{
VaryingsMeshType output;
#if defined(TESSELLATION_ON)
#ifdef TESSELLATION_ON
// TODO deal with camera center rendering and instancing (This is the reason why we always perform tow steps transform to clip space + instancing matrix)
#if defined(VARYINGS_NEED_TANGENT_TO_WORLD) || defined(VARYINGS_DS_NEED_NORMAL)
#ifdef _TESSELLATION_OBJECT_SCALE
// Extract scaling from world transform
float4x4 worldTransform = GetObjectToWorldMatrix();
output.objectScale.x = length(float3(worldTransform._m00, worldTransform._m01, worldTransform._m02));
output.objectScale.y = length(float3(worldTransform._m10, worldTransform._m11, worldTransform._m12));
output.objectScale.z = length(float3(worldTransform._m20, worldTransform._m21, worldTransform._m22));
#endif
// TODO: deal with camera center rendering and instancing (This is the reason why we always perform tow steps transform to clip space + instancing matrix)
// TODO: TEMP: Velocity has a flow as it doens't have normal. This need to be fix. In the mean time, generate fix normal so compiler doesn't complain - When fix, think to also enable ATTRIBUTES_NEED_NORMAL in LitVelocityPass.hlsl
#if SHADERPASS == SHADERPASS_VELOCITY
output.normalWS = float3(0.0, 0.0, 1.0);
#else
output.normalWS = TransformObjectToWorldNormal(input.normalOS);
#endif
#if defined(VARYINGS_NEED_TANGENT_TO_WORLD) || defined(VARYINGS_DS_NEED_TANGENT)

12
Assets/ScriptableRenderLoop/HDRenderPipeline/Sky/HDRISky/HDRISkyRenderer.cs


return GetParameters(skyParameters).skyHDRI != null;
}
public override void SetRenderTargets(BuiltinSkyParameters builtinParams)
{
if (builtinParams.depthBuffer == BuiltinSkyParameters.nullRT)
{
Utilities.SetRenderTarget(builtinParams.renderContext, builtinParams.colorBuffer);
}
else
{
Utilities.SetRenderTarget(builtinParams.renderContext, builtinParams.colorBuffer, builtinParams.depthBuffer);
}
}
override public void RenderSky(BuiltinSkyParameters builtinParams, SkyParameters skyParameters, bool renderForCubemap)
{
HDRISkyParameters hdriSkyParams = GetParameters(skyParameters);

4
Assets/ScriptableRenderLoop/HDRenderPipeline/Sky/HDRISky/Resources/SkyHDRI.shader


#pragma vertex Vert
#pragma fragment Frag
#pragma target 5.0
#pragma only_renderers d3d11 ps4// TEMP: unitl we go futher in dev
#pragma target 4.5
#pragma only_renderers d3d11 ps4 metal // TEMP: unitl we go futher in dev
#include "Color.hlsl"
#include "Common.hlsl"

56
Assets/ScriptableRenderLoop/HDRenderPipeline/Sky/ProceduralSky/ProceduralSkyRenderer.cs


allParams.worldRayleighColorRamp != null;
}
public override void SetRenderTargets(BuiltinSkyParameters builtinParams)
{
// We do not bind the depth buffer as a depth-stencil target since it is
// bound as a color texture which is then sampled from within the shader.
Utilities.SetRenderTarget(builtinParams.renderContext, builtinParams.colorBuffer);
}
void SetKeywords(BuiltinSkyParameters builtinParams, ProceduralSkyParameters param)
{
// Ensure that all preprocessor symbols are initially undefined.

*/
// Expected to be valid for the sky pass, and invalid for the cube map generation pass.
if (builtinParams.depthBuffer != BuiltinSkyParameters.invalidRTI)
if (builtinParams.depthBuffer != BuiltinSkyParameters.nullRT)
{
m_ProceduralSkyMaterial.EnableKeyword("PERFORM_SKY_OCCLUSION_TEST");
}

}
}
void SetUniforms(BuiltinSkyParameters builtinParams, ProceduralSkyParameters param)
void SetUniforms(BuiltinSkyParameters builtinParams, ProceduralSkyParameters param, ref MaterialPropertyBlock properties)
m_ProceduralSkyMaterial.SetTexture("_Cubemap", param.skyHDRI);
m_ProceduralSkyMaterial.SetVector("_SkyParam", new Vector4(param.exposure, param.multiplier, param.rotation, 0.0f));
m_ProceduralSkyMaterial.SetMatrix("_ViewProjMatrix", builtinParams.viewProjMatrix);
m_ProceduralSkyMaterial.SetMatrix("_InvViewProjMatrix", builtinParams.invViewProjMatrix);
m_ProceduralSkyMaterial.SetVector("_CameraPosWS", builtinParams.cameraPosWS);
m_ProceduralSkyMaterial.SetVector("_ScreenSize", builtinParams.screenSize);
properties.SetTexture("_Cubemap", param.skyHDRI);
properties.SetVector("_SkyParam", new Vector4(param.exposure, param.multiplier, param.rotation, 0.0f));
properties.SetMatrix("_InvViewProjMatrix", builtinParams.invViewProjMatrix);
properties.SetVector("_CameraPosWS", builtinParams.cameraPosWS);
properties.SetVector("_ScreenSize", builtinParams.screenSize);
m_ProceduralSkyMaterial.SetInt("_AtmosphericsDebugMode", (int)param.debugMode);

var pixelRect = new Rect(0f, 0f, builtinParams.screenSize.x, builtinParams.screenSize.y);
var scale = 1.0f; //(float)(int)occlusionDownscale;
var depthTextureScaledTexelSize = new Vector4(scale / pixelRect.width,
scale / pixelRect.height,
-scale / pixelRect.width,
-scale / pixelRect.height);
properties.SetVector("_DepthTextureScaledTexelSize", depthTextureScaledTexelSize);
/*
m_ProceduralSkyMaterial.SetFloat("_ShadowBias", useOcclusion ? occlusionBias : 1f);
m_ProceduralSkyMaterial.SetFloat("_ShadowBiasIndirect", useOcclusion ? occlusionBiasIndirect : 1f);

m_ProceduralSkyMaterial.SetVector("_OcclusionTexture_TexelSize", ???);
*/
var pixelRect = new Rect(0f, 0f, builtinParams.screenSize.x, builtinParams.screenSize.y);
var scale = 1.0f; //(float)(int)occlusionDownscale;
var depthTextureScaledTexelSize = new Vector4(scale / pixelRect.width,
scale / pixelRect.height,
-scale / pixelRect.width,
-scale / pixelRect.height);
m_ProceduralSkyMaterial.SetVector("_DepthTextureScaledTexelSize", depthTextureScaledTexelSize);
m_ProceduralSkyMaterial.SetFloat("_WorldScaleExponent", param.worldScaleExponent);
m_ProceduralSkyMaterial.SetFloat("_WorldNormalDistanceRcp", 1f / param.worldNormalDistance);

{
ProceduralSkyParameters proceduralSkyParams = GetParameters(skyParameters);
MaterialPropertyBlock properties = new MaterialPropertyBlock();
SetUniforms(builtinParams, proceduralSkyParams);
SetUniforms(builtinParams, proceduralSkyParams, ref properties);
if (builtinParams.depthBuffer != BuiltinSkyParameters.invalidRTI)
// Since we use the material for rendering the sky both into the cubemap, and
// during the fullscreen pass, setting the 'PERFORM_SKY_OCCLUSION_TEST' keyword has no effect.
if (builtinParams.depthBuffer != BuiltinSkyParameters.nullRT)
cmd.SetGlobalFloat("_DisableSkyOcclusionTest", 0.0f);
properties.SetFloat("_DisableSkyOcclusionTest", 0.0f);
// For some reason, disabling the 'PERFORM_SKY_OCCLUSION_TEST' keyword has no effect.
cmd.SetGlobalFloat("_DisableSkyOcclusionTest", 1.0f);
properties.SetFloat("_DisableSkyOcclusionTest", 1.0f);
cmd.DrawMesh(builtinParams.skyMesh, Matrix4x4.identity, m_ProceduralSkyMaterial);
cmd.DrawMesh(builtinParams.skyMesh, Matrix4x4.identity, m_ProceduralSkyMaterial, 0, 0, properties);
builtinParams.renderContext.ExecuteCommandBuffer(cmd);
cmd.Dispose();
}

18
Assets/ScriptableRenderLoop/HDRenderPipeline/Sky/ProceduralSky/Resources/SkyProcedural.shader


Blend One OneMinusSrcAlpha, Zero One
HLSLPROGRAM
#pragma target 5.0
#pragma only_renderers d3d11 ps4 // TEMP: unitl we go futher in dev
#pragma target 4.5
#pragma only_renderers d3d11 ps4 metal // TEMP: unitl we go futher in dev
#pragma vertex Vert
#pragma fragment Frag

float4 _CameraPosWS;
float4x4 _InvViewProjMatrix;
float4x4 _ViewProjMatrix;
float _DisableSkyOcclusionTest;

float3 rotDirY = float3(sinPhi, 0, cosPhi);
dir = float3(dot(rotDirX, dir), dir.y, dot(rotDirY, dir));
// input.positionCS is SV_Position
// input.positionCS is SV_Position
// If the sky box is too far away (depth set to 0), the resulting look is too foggy.
const float skyDepth = 0.002;
// An arbitrary value attempting to match the size of the sky mesh from the Blacksmith demo.
const float skyDepth = 0.00025;
#ifdef PERFORM_SKY_OCCLUSION_TEST
// Determine whether the sky is occluded by the scene geometry.

skyTexWeight = 1.0;
}
UpdatePositionInput(depthRaw, _InvViewProjMatrix, _ViewProjMatrix, posInput);
// Since we only need the world space position, so we don't pass the view-projection matrix.
UpdatePositionInput(depthRaw, _InvViewProjMatrix, k_identity4x4, posInput);
float4 c1, c2, c3;
VolundTransferScatter(posInput.positionWS, c1, c2, c3);

#endif
float3 skyColor = float3(0.0, 0.0, 0.0);
float opacity = extinction;
// Opacity should be proportional to extinction, but this produces wrong results.
// It appears what the algorithm computes is not actually extinction.
float opacity = (1.0 - extinction);
if (skyTexWeight == 1.0)
{

4
Assets/ScriptableRenderLoop/HDRenderPipeline/Sky/Resources/GGXConvolve.shader


Blend One Zero
HLSLPROGRAM
#pragma target 5.0
#pragma only_renderers d3d11 ps4 // TEMP: unitl we go futher in dev
#pragma target 4.5
#pragma only_renderers d3d11 ps4 metal // TEMP: unitl we go futher in dev
#pragma multi_compile _ USE_MIS

35
Assets/ScriptableRenderLoop/HDRenderPipeline/Sky/RuntimeFilterIBL.cs


const int k_GgxIblMipCountMinusOne = 6; // Height (UNITY_SPECCUBE_LOD_STEPS)
ComputeShader m_ComputeGgxIblSampleDataCS = null;
int m_ComputeIblGgxSampleDataKernel = -1;
int m_ComputeGgxIblSampleDataKernel = -1;
ComputeShader m_BuildProbabilityTablesCS = null;
int m_ConditionalDensitiesKernel = -1;

if (!m_ComputeGgxIblSampleDataCS)
{
m_ComputeGgxIblSampleDataCS = Resources.Load<ComputeShader>("ComputeGgxIblSampleData");
m_ComputeIblGgxSampleDataKernel = m_ComputeGgxIblSampleDataCS.FindKernel("ComputeGgxIblSampleData");
m_ComputeGgxIblSampleDataKernel = m_ComputeGgxIblSampleDataCS.FindKernel("ComputeGgxIblSampleData");
}
if (!m_BuildProbabilityTablesCS)

if (!m_GgxIblSampleData)
{
m_GgxIblSampleData = new RenderTexture(k_GgxIblMaxSampleCount, k_GgxIblMipCountMinusOne, 1, RenderTextureFormat.ARGBFloat);
m_GgxIblSampleData.dimension = TextureDimension.Tex2D;
m_GgxIblSampleData = new RenderTexture(k_GgxIblMaxSampleCount, k_GgxIblMipCountMinusOne, 0, RenderTextureFormat.ARGBFloat, RenderTextureReadWrite.Linear);
m_GgxIblSampleData.useMipMap = false;
m_GgxIblSampleData.autoGenerateMips = false;
m_GgxIblSampleData.enableRandomWrite = true;

m_ComputeGgxIblSampleDataCS.SetTexture(m_ComputeIblGgxSampleDataKernel, "output", m_GgxIblSampleData);
m_ComputeGgxIblSampleDataCS.SetTexture(m_ComputeGgxIblSampleDataKernel, "output", m_GgxIblSampleData);
cmd.DispatchCompute(m_ComputeGgxIblSampleDataCS, m_ComputeIblGgxSampleDataKernel, 1, 1, 1);
cmd.DispatchCompute(m_ComputeGgxIblSampleDataCS, m_ComputeGgxIblSampleDataKernel, 1, 1, 1);
void FilterCubemapGgxCommon(ScriptableRenderContext context, int mipCount,
Texture source, RenderTexture target,
Mesh[] cubemapFaceMesh)
void FilterCubemapCommon(ScriptableRenderContext context,
Texture source, RenderTexture target, int mipCount,
Mesh[] cubemapFaceMesh)
{
// Solid angle associated with a texel of the cubemap.
float invOmegaP = (6.0f * source.width * source.width) / (4.0f * Mathf.PI);

}
// Filters MIP map levels (other than 0) with GGX using BRDF importance sampling.
public void FilterCubemapGgx(ScriptableRenderContext context, int mipCount,
Texture source, RenderTexture target,
Mesh[] cubemapFaceMesh)
public void FilterCubemap(ScriptableRenderContext context,
Texture source, RenderTexture target, int mipCount,
Mesh[] cubemapFaceMesh)
FilterCubemapGgxCommon(context, mipCount, source, target, cubemapFaceMesh);
FilterCubemapCommon(context, source, target, mipCount, cubemapFaceMesh);
public void FilterCubemapGgxMis(ScriptableRenderContext context, int mipCount,
Texture source, RenderTexture target,
RenderTexture conditionalCdf, RenderTexture marginalRowCdf,
Mesh[] cubemapFaceMesh)
public void FilterCubemapMIS(ScriptableRenderContext context,
Texture source, RenderTexture target, int mipCount,
RenderTexture conditionalCdf, RenderTexture marginalRowCdf,
Mesh[] cubemapFaceMesh)
{
// Bind the input cubemap.
m_BuildProbabilityTablesCS.SetTexture(m_ConditionalDensitiesKernel, "envMap", source);

m_GgxConvolveMaterial.SetTexture("_ConditionalDensities", conditionalCdf);
m_GgxConvolveMaterial.SetTexture("_MarginalRowDensities", marginalRowCdf);
FilterCubemapGgxCommon(context, mipCount, source, target, cubemapFaceMesh);
FilterCubemapCommon(context, source, target, mipCount, cubemapFaceMesh);
}
}
}

48
Assets/ScriptableRenderLoop/HDRenderPipeline/Sky/SkyManager.cs


public class BuiltinSkyParameters
{
public Matrix4x4 viewProjMatrix;
public Matrix4x4 invViewProjMatrix;
public Vector3 cameraPosWS;
public Vector4 screenSize;

public RenderTargetIdentifier colorBuffer;
public RenderTargetIdentifier depthBuffer;
public static RenderTargetIdentifier invalidRTI = -1;
public static RenderTargetIdentifier nullRT = -1;
}
public class SkyManager

if (m_SkyboxCubemapRT == null)
{
m_SkyboxCubemapRT = new RenderTexture(resolution, resolution, 1, RenderTextureFormat.ARGBHalf);
m_SkyboxCubemapRT = new RenderTexture(resolution, resolution, 0, RenderTextureFormat.ARGBHalf, RenderTextureReadWrite.Linear);
m_SkyboxCubemapRT.dimension = TextureDimension.Cube;
m_SkyboxCubemapRT.useMipMap = true;
m_SkyboxCubemapRT.autoGenerateMips = true; // Generate regular mipmap for filtered importance sampling

m_SkyboxGGXCubemapRT = new RenderTexture(resolution, resolution, 1, RenderTextureFormat.ARGBHalf);
m_SkyboxGGXCubemapRT = new RenderTexture(resolution, resolution, 0, RenderTextureFormat.ARGBHalf, RenderTextureReadWrite.Linear);
m_SkyboxGGXCubemapRT.dimension = TextureDimension.Cube;
m_SkyboxGGXCubemapRT.useMipMap = true;
m_SkyboxGGXCubemapRT.autoGenerateMips = false;

int height = (int)LightSamplingParameters.TextureHeight;
// + 1 because we store the value of the integral of the cubemap at the end of the texture.
m_SkyboxMarginalRowCdfRT = new RenderTexture(height + 1, 1, 1, RenderTextureFormat.RFloat);
m_SkyboxMarginalRowCdfRT.dimension = TextureDimension.Tex2D;
m_SkyboxMarginalRowCdfRT = new RenderTexture(height + 1, 1, 0, RenderTextureFormat.RFloat, RenderTextureReadWrite.Linear);
m_SkyboxMarginalRowCdfRT.useMipMap = false;
m_SkyboxMarginalRowCdfRT.autoGenerateMips = false;
m_SkyboxMarginalRowCdfRT.enableRandomWrite = true;

// TODO: switch the format to R16 (once it's available) to save some bandwidth.
m_SkyboxConditionalCdfRT = new RenderTexture(width, height, 1, RenderTextureFormat.RFloat);
m_SkyboxConditionalCdfRT.dimension = TextureDimension.Tex2D;
m_SkyboxConditionalCdfRT = new RenderTexture(width, height, 0, RenderTextureFormat.RFloat, RenderTextureReadWrite.Linear);
m_SkyboxConditionalCdfRT.useMipMap = false;
m_SkyboxConditionalCdfRT.autoGenerateMips = false;
m_SkyboxConditionalCdfRT.enableRandomWrite = true;

m_CubemapScreenSize = new Vector4((float)resolution, (float)resolution, 1.0f / (float)resolution, 1.0f / (float)resolution);
}
void RebuildSkyMeshes()
void RebuildSkyMeshes(float nearPlane, float farPlane)
Matrix4x4 cubeProj = Matrix4x4.Perspective(90.0f, 1.0f, 0.1f, 1.0f);
Matrix4x4 cubeProj = Matrix4x4.Perspective(90.0f, 1.0f, nearPlane, farPlane);
new Vector3(0.0f, 1.0f, 0.0f),
new Vector3(0.0f, 1.0f, 0.0f),
new Vector3(0.0f, 1.0f, 0.0f),
new Vector3(0.0f, 1.0f, 0.0f),
new Vector3(0.0f, -1.0f, 0.0f),
new Vector3(0.0f, -1.0f, 0.0f),
new Vector3(0.0f, 1.0f, 0.0f),
new Vector3(0.0f, 1.0f, 0.0f),
new Vector3(0.0f, -1.0f, 0.0f),
new Vector3(0.0f, -1.0f, 0.0f),
};
for (int i = 0; i < 6; ++i)

m_faceCameraInvViewProjectionMatrix[i] = m_faceCameraViewProjectionMatrix[i].inverse;
// When rendering into a texture the render will be flip (due to legacy unity openGL behavior), so we need to flip UV here...
m_CubemapFaceMesh[i] = BuildSkyMesh(Vector3.zero, m_faceCameraInvViewProjectionMatrix[i], true);
m_CubemapFaceMesh[i] = BuildSkyMesh(Vector3.zero, m_faceCameraInvViewProjectionMatrix[i], false);
}
}
}

Shader.SetGlobalTexture("_SkyTexture", m_SkyboxGGXCubemapRT);
}
public void Resize()
public void Resize(float nearPlane, float farPlane)
RebuildSkyMeshes();
RebuildSkyMeshes(nearPlane, farPlane);
}
public void Build()

{
for (int i = 0; i < 6; ++i)
{
Utilities.SetRenderTarget(builtinParams.renderContext, target, ClearFlag.ClearNone, 0, (CubemapFace)i);
builtinParams.viewProjMatrix = m_faceCameraViewProjectionMatrix[i];
builtinParams.depthBuffer = BuiltinSkyParameters.invalidRTI;
builtinParams.depthBuffer = BuiltinSkyParameters.nullRT;
Utilities.SetRenderTarget(builtinParams.renderContext, target, ClearFlag.ClearNone, 0, (CubemapFace)i);
m_Renderer.RenderSky(builtinParams, skyParameters, true);
}
}

if (m_useMIS)
{
m_iblFilterGgx.FilterCubemapGgxMis(renderContext, mipCount, input, target, m_SkyboxConditionalCdfRT, m_SkyboxMarginalRowCdfRT, m_CubemapFaceMesh);
m_iblFilterGgx.FilterCubemapMIS(renderContext, input, target, mipCount, m_SkyboxConditionalCdfRT, m_SkyboxMarginalRowCdfRT, m_CubemapFaceMesh);
m_iblFilterGgx.FilterCubemapGgx(renderContext, mipCount, input, target, m_CubemapFaceMesh);
m_iblFilterGgx.FilterCubemap(renderContext, input, target, mipCount, m_CubemapFaceMesh);
}
}
}

m_BuiltinParameters.renderContext = renderContext;
m_BuiltinParameters.sunLight = sunLight;
m_BuiltinParameters.invViewProjMatrix = camera.invViewProjectionMatrix;
m_BuiltinParameters.viewProjMatrix = camera.viewProjectionMatrix;
m_BuiltinParameters.cameraPosWS = camera.camera.transform.position;
m_BuiltinParameters.screenSize = camera.screenSize;
m_BuiltinParameters.skyMesh = BuildSkyMesh(camera.camera.GetComponent<Transform>().position, m_BuiltinParameters.invViewProjMatrix, false);

Utilities.SetRenderTarget(renderContext, colorBuffer, depthBuffer);
m_Renderer.SetRenderTargets(m_BuiltinParameters);
m_Renderer.RenderSky(m_BuiltinParameters, skyParameters, false);
}
}

1
Assets/ScriptableRenderLoop/HDRenderPipeline/Sky/SkyRenderer.cs


{
abstract public void Build();
abstract public void Cleanup();
abstract public void SetRenderTargets(BuiltinSkyParameters builtinParams);
// renderForCubemap: When rendering into a cube map, no depth buffer is available so user has to make sure not to use depth testing or the depth texture.
abstract public void RenderSky(BuiltinSkyParameters builtinParams, SkyParameters skyParameters, bool renderForCubemap);
abstract public bool IsSkyValid(SkyParameters skyParameters);

2
Assets/ScriptableRenderLoop/HDRenderPipeline/Utilities.cs


public class Utilities
{
public const RendererConfiguration kRendererConfigurationBakedLighting = RendererConfiguration.PerObjectLightProbe | RendererConfiguration.PerObjectReflectionProbes | RendererConfiguration.PerObjectLightmaps | RendererConfiguration.PerObjectLightProbeProxyVolume;
public const RendererConfiguration kRendererConfigurationBakedLighting = RendererConfiguration.PerObjectLightProbe | RendererConfiguration.PerObjectLightmaps | RendererConfiguration.PerObjectLightProbeProxyVolume;
// Render Target Management.

9
Assets/ScriptableRenderLoop/ShaderLibrary/API/D3D11.hlsl


// Do not exist on some platform, in this case we need to have a standard name that call a function that will initialize all parameters to 0
#define ZERO_INITIALIZE(type, name) name = (type)0;
// Texture util abstraction
#define CALCULATE_TEXTURE2D_LOD(textureName, samplerName, coord2) textureName.CalculateLevelOfDetail(samplerName, coord2)
// Texture abstraction
#define TEXTURE2D(textureName) Texture2D textureName

#define SAMPLE_TEXTURE2D(textureName, samplerName, coord2) textureName.Sample(samplerName, coord2)
#define SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod) textureName.SampleLevel(samplerName, coord2, lod)
#define SAMPLE_TEXTURE2D_BIAS(textureName, samplerName, coord2, bias) textureName.SampleBias(samplerName, coord2, bias)
#define SAMPLE_TEXTURE2D_GRAD(textureName, samplerName, coord2, ddx, ddy) textureName.SampleGrad(samplerName, coord2, ddx, ddy)
#define SAMPLE_TEXTURE2D_ARRAY_BIAS(textureName, samplerName, coord2, index, bias) textureName.SampleBias(samplerName, float3(coord2, index), bias)
#define SAMPLE_TEXTURECUBE_BIAS(textureName, samplerName, coord3, bias) textureName.SampleBias(samplerName, coord3, bias)
#define SAMPLE_TEXTURECUBE_ARRAY_BIAS(textureName, samplerName, coord3, index, bias) textureName.SampleBias(samplerName, float4(coord3, index), bias)
#define SAMPLE_TEXTURE3D(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)
#define SAMPLE_TEXTURE2D_SHADOW(textureName, samplerName, coord3) textureName.SampleCmpLevelZero(samplerName, (coord3).xy, (coord3).z)
#define SAMPLE_TEXTURE2D_ARRAY_SHADOW(textureName, samplerName, coord3, index) textureName.SampleCmpLevelZero(samplerName, float3((coord3).xy, index), (coord3).z)

9
Assets/ScriptableRenderLoop/ShaderLibrary/API/PSSL.hlsl


// Do not exist on some platform, in this case we need to have a standard name that call a function that will initialize all parameters to 0
#define ZERO_INITIALIZE(type, name) name = (type)0;
// Texture util abstraction
#define CALCULATE_TEXTURE2D_LOD(textureName, samplerName, coord2) textureName.GetLOD(samplerName, coord2)
// Texture abstraction
#define TEXTURE2D(textureName) Texture2D textureName

#define SAMPLE_TEXTURE2D(textureName, samplerName, coord2) textureName.Sample(samplerName, coord2)
#define SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod) textureName.SampleLevel(samplerName, coord2, lod)
#define SAMPLE_TEXTURE2D_BIAS(textureName, samplerName, coord2, bias) textureName.SampleBias(samplerName, coord2, bias)
#define SAMPLE_TEXTURE2D_GRAD(textureName, samplerName, coord2, ddx, ddy) textureName.SampleGrad(samplerName, coord2, ddx, ddy)
#define SAMPLE_TEXTURE2D_ARRAY_BIAS(textureName, samplerName, coord2, index, bias) textureName.SampleBias(samplerName, float3(coord2, index), bias)
#define SAMPLE_TEXTURECUBE_BIAS(textureName, samplerName, coord3, bias) textureName.SampleBias(samplerName, coord3, bias)
#define SAMPLE_TEXTURECUBE_ARRAY_BIAS(textureName, samplerName, coord3, index, bias) textureName.SampleBias(samplerName, float4(coord3, index), bias)
#define SAMPLE_TEXTURE3D(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)
#define SAMPLE_TEXTURE2D_SHADOW(textureName, samplerName, coord3) textureName.SampleCmpLevelZero(samplerName, (coord3).xy, (coord3).z)
#define SAMPLE_TEXTURE2D_ARRAY_SHADOW(textureName, samplerName, coord3, index) textureName.SampleCmpLevelZero(samplerName, float3((coord3).xy, index), (coord3).z)

19
Assets/ScriptableRenderLoop/ShaderLibrary/Common.hlsl


#include "API/PSSL.hlsl"
#elif defined(SHADER_API_XBOXONE)
#include "API/D3D11_1.hlsl"
#elif defined(SHADER_API_METAL)
#include "API/Metal.hlsl"
#else
#error unsupported shader api
#endif

float4 PositivePow(float4 base, float4 power)
{
return pow(max(abs(base), float4(FLT_EPSILON, FLT_EPSILON, FLT_EPSILON, FLT_EPSILON)), power);
}
// ----------------------------------------------------------------------------
// Texture utilities
// ----------------------------------------------------------------------------
// texelSize is Unity XXX_TexelSize feature parameters
// x contains 1.0/width, y contains 1.0 / height, z contains width, w contains height
float ComputeTextureLOD(float2 uv, float4 texelSize)
{
uv *= texelSize.zw;
float2 ddx_ = ddx(uv);
float2 ddy_ = ddy(uv);
float d = max(dot(ddx_, ddx_), dot(ddy_, ddy_));
return max(0.5 * log2(d), 0.0);
}
// ----------------------------------------------------------------------------

6
Assets/ScriptableRenderLoop/ShaderLibrary/CommonMaterial.hlsl


return float3(oneMinusT, oneMinusT, oneMinusT) + b * t;
}
// MACRO from Legacy Untiy
// Transforms 2D UV by scale/bias property
#define TRANSFORM_TEX(tex, name) ((tex.xy) * name##_ST.xy + name##_ST.zw)
#define GET_TEXELSIZE_NAME(name) (name##_TexelSize)
#endif // UNITY_COMMON_MATERIAL_INCLUDED

292
Assets/ScriptableRenderLoop/fptl/Internal-DeferredComputeShading.compute


#pragma kernel ShadeDeferred_Fptl SHADE_DEFERRED_ENTRY=ShadeDeferred_Fptl USE_FPTL_LIGHTLIST=1 ENABLE_DEBUG=0
#pragma kernel ShadeDeferred_Clustered SHADE_DEFERRED_ENTRY=ShadeDeferred_Clustered USE_CLUSTERED_LIGHTLIST=1 ENABLE_DEBUG=0 //TODO: disabled clustered permutations so far as it leads to the error "All kernels must use same constant buffer layouts"
#pragma kernel ShadeDeferred_Fptl_Debug SHADE_DEFERRED_ENTRY=ShadeDeferred_Fptl_Debug USE_FPTL_LIGHTLIST=1 ENABLE_DEBUG=1
#pragma kernel ShadeDeferred_Clustered_Debug SHADE_DEFERRED_ENTRY=ShadeDeferred_Clustered_Debug USE_CLUSTERED_LIGHTLIST=1 ENABLE_DEBUG=1
#define TILE_SIZE 8
// Hacks to get the header to compile in compute
#define SHADER_TARGET 50
#define UNITY_PBS_USE_BRDF1
#define fixed4 float4
#include "UnityLightingCommon.cginc"
#undef fixed4
float3 EvalMaterial(UnityLight light, UnityIndirect ind);
float3 EvalIndirectSpecular(UnityLight light, UnityIndirect ind);
// uses the optimized single layered light list for opaques only
#ifdef USE_FPTL_LIGHTLIST
#define OPAQUES_ONLY
#endif
#include "TiledLightingTemplate.hlsl"
#include "TiledReflectionTemplate.hlsl"
Texture2D _CameraDepthTexture;
Texture2D _CameraGBufferTexture0;
Texture2D _CameraGBufferTexture1;
Texture2D _CameraGBufferTexture2;
Texture2D _CameraGBufferTexture3;
RWTexture2D<float4> uavOutput : register(u0);
struct v2f {
float4 vertex : SV_POSITION;
float2 texcoord : TEXCOORD0;
};
v2f vert(float4 vertex : POSITION, float2 texcoord : TEXCOORD0)
{
v2f o;
o.vertex = UnityObjectToClipPos(vertex);
o.texcoord = texcoord.xy;
return o;
}
struct StandardData
{
float3 specularColor;
float3 diffuseColor;
float3 normalWorld;
float smoothness;
float occlusion;
float3 emission;
};
struct LocalDataBRDF
{
StandardData gbuf;
// extras
float oneMinusReflectivity;
float3 Vworld;
};
static LocalDataBRDF g_localParams;
StandardData UnityStandardDataFromGbufferAux(float4 gbuffer0, float4 gbuffer1, float4 gbuffer2, float4 gbuffer3)
{
StandardData data;
data.normalWorld = normalize(2 * gbuffer2.xyz - 1);
data.smoothness = gbuffer1.a;
data.diffuseColor = gbuffer0.xyz; data.specularColor = gbuffer1.xyz;
data.occlusion = gbuffer0.a;
data.emission = gbuffer3.xyz;
return data;
}
half3 BRDF3_Direct2(half3 diffColor, half3 specColor, half rlPow4, half smoothness)
{
half LUT_RANGE = 16.0; // must match range in NHxRoughness() function in GeneratedTextures.cpp
// Lookup texture to save instructions
half specular = tex2Dlod(unity_NHxRoughness, half4(rlPow4, SmoothnessToPerceptualRoughness(smoothness), 0, 0)).UNITY_ATTEN_CHANNEL * LUT_RANGE;
#if defined(_SPECULARHIGHLIGHTS_OFF)
specular = 0.0;
#endif
return diffColor + specular * specColor;
}
float3 EvalMaterial(UnityLight light, UnityIndirect ind)
{
StandardData data = g_localParams.gbuf;
return UNITY_BRDF_PBS(data.diffuseColor, data.specularColor, g_localParams.oneMinusReflectivity, data.smoothness, data.normalWorld, g_localParams.Vworld, light, ind);
}
float3 EvalIndirectSpecular(UnityLight light, UnityIndirect ind)
{
StandardData data = g_localParams.gbuf;
return data.occlusion * UNITY_BRDF_PBS(0, data.specularColor, g_localParams.oneMinusReflectivity, data.smoothness, data.normalWorld, g_localParams.Vworld, light, ind).rgb;
}
[numthreads(TILE_SIZE, TILE_SIZE, 1)]
void SHADE_DEFERRED_ENTRY(uint2 dispatchThreadId : SV_DispatchThreadID, uint2 groupId : SV_GroupID)
{
uint2 pixCoord = dispatchThreadId;
float zbufDpth = FetchDepth(_CameraDepthTexture, pixCoord.xy).x;
float linDepth = GetLinearDepth(zbufDpth);
float3 vP = GetViewPosFromLinDepth(pixCoord, linDepth);
float3 vPw = mul(g_mViewToWorld, float4(vP, 1)).xyz;
float3 Vworld = normalize(mul((float3x3) g_mViewToWorld, -vP).xyz); //unity_CameraToWorld
float4 gbuffer0 = _CameraGBufferTexture0.Load(uint3(pixCoord.xy, 0));
float4 gbuffer1 = _CameraGBufferTexture1.Load(uint3(pixCoord.xy, 0));
float4 gbuffer2 = _CameraGBufferTexture2.Load(uint3(pixCoord.xy, 0));
float4 gbuffer3 = _CameraGBufferTexture3.Load(uint3(pixCoord.xy, 0));
StandardData data = UnityStandardDataFromGbufferAux(gbuffer0, gbuffer1, gbuffer2, gbuffer3);
g_localParams.gbuf = data;
g_localParams.oneMinusReflectivity = 1.0 - SpecularStrength(data.specularColor.rgb);
g_localParams.Vworld = Vworld;
uint2 tileCoord = groupId >> 1;
uint numLightsProcessed = 0;
float3 c = data.emission + ExecuteLightList(numLightsProcessed, tileCoord, vP, vPw, Vworld);
uint numReflectionsProcessed = 0;
c += ExecuteReflectionList(numReflectionsProcessed, tileCoord, vP, data.normalWorld, Vworld, data.smoothness);
#if ENABLE_DEBUG
c = OverlayHeatMap(pixCoord & 15, numLightsProcessed, c);
#endif
uavOutput[pixCoord] = float4(c, 1.0);
}
#pragma kernel ShadeDeferred_Fptl SHADE_DEFERRED_ENTRY=ShadeDeferred_Fptl USE_FPTL_LIGHTLIST=1 ENABLE_DEBUG=0
#pragma kernel ShadeDeferred_Clustered SHADE_DEFERRED_ENTRY=ShadeDeferred_Clustered USE_CLUSTERED_LIGHTLIST=1 ENABLE_DEBUG=0 //TODO: disabled clustered permutations so far as it leads to the error "All kernels must use same constant buffer layouts"
#pragma kernel ShadeDeferred_Fptl_Debug SHADE_DEFERRED_ENTRY=ShadeDeferred_Fptl_Debug USE_FPTL_LIGHTLIST=1 ENABLE_DEBUG=1
#pragma kernel ShadeDeferred_Clustered_Debug SHADE_DEFERRED_ENTRY=ShadeDeferred_Clustered_Debug USE_CLUSTERED_LIGHTLIST=1 ENABLE_DEBUG=1
#define TILE_SIZE 8
// Hacks to get the header to compile in compute
#define SHADER_TARGET 50
#define UNITY_PBS_USE_BRDF1
#define fixed4 float4
#include "UnityLightingCommon.cginc"
#undef fixed4
float3 EvalMaterial(UnityLight light, UnityIndirect ind);
float3 EvalIndirectSpecular(UnityLight light, UnityIndirect ind);
// uses the optimized single layered light list for opaques only
#ifdef USE_FPTL_LIGHTLIST
#define OPAQUES_ONLY
#endif
#include "TiledLightingTemplate.hlsl"
#include "TiledReflectionTemplate.hlsl"
UNITY_DECLARE_TEX2D_FLOAT(_CameraDepthTexture);
Texture2D _CameraGBufferTexture0;
Texture2D _CameraGBufferTexture1;
Texture2D _CameraGBufferTexture2;
Texture2D _CameraGBufferTexture3;
RWTexture2D<float4> uavOutput : register(u0);
struct v2f {
float4 vertex : SV_POSITION;
float2 texcoord : TEXCOORD0;
};
v2f vert(float4 vertex : POSITION, float2 texcoord : TEXCOORD0)
{
v2f o;
o.vertex = UnityObjectToClipPos(vertex);
o.texcoord = texcoord.xy;
return o;
}
struct StandardData
{
float3 specularColor;
float3 diffuseColor;
float3 normalWorld;
float smoothness;
float occlusion;
float3 emission;
};
struct LocalDataBRDF
{
StandardData gbuf;
// extras
float oneMinusReflectivity;
float3 Vworld;
};
static LocalDataBRDF g_localParams;
StandardData UnityStandardDataFromGbufferAux(float4 gbuffer0, float4 gbuffer1, float4 gbuffer2, float4 gbuffer3)
{
StandardData data;
data.normalWorld = normalize(2 * gbuffer2.xyz - 1);
data.smoothness = gbuffer1.a;
data.diffuseColor = gbuffer0.xyz; data.specularColor = gbuffer1.xyz;
data.occlusion = gbuffer0.a;
data.emission = gbuffer3.xyz;
return data;
}
half3 BRDF3_Direct2(half3 diffColor, half3 specColor, half rlPow4, half smoothness)
{
half LUT_RANGE = 16.0; // must match range in NHxRoughness() function in GeneratedTextures.cpp
// Lookup texture to save instructions
half specular = tex2Dlod(unity_NHxRoughness, half4(rlPow4, SmoothnessToPerceptualRoughness(smoothness), 0, 0)).UNITY_ATTEN_CHANNEL * LUT_RANGE;
#if defined(_SPECULARHIGHLIGHTS_OFF)
specular = 0.0;
#endif
return diffColor + specular * specColor;
}
float3 EvalMaterial(UnityLight light, UnityIndirect ind)
{
StandardData data = g_localParams.gbuf;
return UNITY_BRDF_PBS(data.diffuseColor, data.specularColor, g_localParams.oneMinusReflectivity, data.smoothness, data.normalWorld, g_localParams.Vworld, light, ind);
}
float3 EvalIndirectSpecular(UnityLight light, UnityIndirect ind)
{
StandardData data = g_localParams.gbuf;
return data.occlusion * UNITY_BRDF_PBS(0, data.specularColor, g_localParams.oneMinusReflectivity, data.smoothness, data.normalWorld, g_localParams.Vworld, light, ind).rgb;
}
[numthreads(TILE_SIZE, TILE_SIZE, 1)]
void SHADE_DEFERRED_ENTRY(uint2 dispatchThreadId : SV_DispatchThreadID, uint2 groupId : SV_GroupID)
{
uint2 pixCoord = dispatchThreadId;
float zbufDpth = FetchDepth(_CameraDepthTexture, pixCoord.xy).x;
float linDepth = GetLinearDepth(zbufDpth);
float3 vP = GetViewPosFromLinDepth(pixCoord, linDepth);
float3 vPw = mul(g_mViewToWorld, float4(vP, 1)).xyz;
float3 Vworld = normalize(mul((float3x3) g_mViewToWorld, -vP).xyz); //unity_CameraToWorld
float4 gbuffer0 = _CameraGBufferTexture0.Load(uint3(pixCoord.xy, 0));
float4 gbuffer1 = _CameraGBufferTexture1.Load(uint3(pixCoord.xy, 0));
float4 gbuffer2 = _CameraGBufferTexture2.Load(uint3(pixCoord.xy, 0));
float4 gbuffer3 = _CameraGBufferTexture3.Load(uint3(pixCoord.xy, 0));
StandardData data = UnityStandardDataFromGbufferAux(gbuffer0, gbuffer1, gbuffer2, gbuffer3);
g_localParams.gbuf = data;
g_localParams.oneMinusReflectivity = 1.0 - SpecularStrength(data.specularColor.rgb);
g_localParams.Vworld = Vworld;
uint2 tileCoord = groupId >> 1;
uint numLightsProcessed = 0;
float3 c = data.emission + ExecuteLightList(numLightsProcessed, tileCoord, vP, vPw, Vworld);
uint numReflectionsProcessed = 0;
c += ExecuteReflectionList(numReflectionsProcessed, tileCoord, vP, data.normalWorld, Vworld, data.smoothness);
#if ENABLE_DEBUG
c = OverlayHeatMap(pixCoord & 15, numLightsProcessed, c);
#endif
uavOutput[pixCoord] = float4(c, 1.0);
}

2
Assets/ScriptableRenderLoop/fptl/Internal-DeferredReflections.shader


#include "TiledReflectionTemplate.hlsl"
Texture2D _CameraDepthTexture;
Texture2D_float _CameraDepthTexture;
Texture2D _CameraGBufferTexture0;
Texture2D _CameraGBufferTexture1;
Texture2D _CameraGBufferTexture2;

2
Assets/ScriptableRenderLoop/fptl/Internal-DeferredShading.shader


#include "TiledLightingTemplate.hlsl"
Texture2D _CameraDepthTexture;
Texture2D_float _CameraDepthTexture;
Texture2D _CameraGBufferTexture0;
Texture2D _CameraGBufferTexture1;
Texture2D _CameraGBufferTexture2;

2
Assets/ScriptableRenderLoop/fptl/LightBoundsDebug.shader


CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma target 5.0
#pragma target 4.5
#include "UnityCG.cginc"
#include "LightDefinitions.cs.hlsl"

6
Assets/ScriptableRenderLoop/fptl/StandardTest.shader


ZWrite [_ZWrite]
CGPROGRAM
#pragma target 5.0
#pragma target 4.5
// -------------------------------------

ZWrite On ZTest LEqual
CGPROGRAM
#pragma target 5.0
#pragma target 4.5
// TODO: figure out what's needed here wrt. alpha test etc.

ZWrite On ZTest LEqual
CGPROGRAM
#pragma target 5.0
#pragma target 4.5
// -------------------------------------

7
Assets/ScriptableRenderLoop/fptl/lightlistbuild-bigtile.compute


const int totNrEdgePairs = 12*nrFrustEdges;
for(int l=0; l<iNrCoarseLights; l++)
{
const int idxCoarse = lightsListLDS[l];
[branch]if(idxCoarse<(uint) g_iNrVisibLights && g_vLightData[idxCoarse].lightType!=SPHERE_LIGHT) // don't bother doing edge tests for sphere lights since these have camera aligned bboxes.
const uint idxCoarse = lightsListLDS[l];
bool canEnter = idxCoarse<(uint) g_iNrVisibLights;
if(canEnter) canEnter = g_vLightData[idxCoarse].lightType!=SPHERE_LIGHT; // don't bother doing edge tests for sphere lights since these have camera aligned bboxes.
[branch]if(canEnter)
{
SFiniteLightBound lgtDat = g_data[idxCoarse];

4
Assets/TestScenes/HDTest/HDRenderLoopTest.meta


fileFormatVersion: 2
guid: 276e673c84b003b4dba1783ac6567cf9
guid: bb067c1f82e9d8648b8909e905f6607b
timeCreated: 1484061606
timeCreated: 1484331444
licenseType: Pro
DefaultImporter:
userData:

737
Assets/TestScenes/HDTest/HDRenderLoopTest.unity
文件差异内容过多而无法显示
查看文件

291
Assets/TestScenes/HDTest/Material/HDRenderLoopMaterials/Terrain.mat


m_PrefabInternal: {fileID: 0}
m_Name: Terrain
m_Shader: {fileID: 4800000, guid: 6e4ae4064600d784cac1e41a9e6f2e59, type: 3}
m_ShaderKeywords: _ALPHACUTOFFENABLE_OFF _DISTORTIONDEPTHTEST_OFF _DISTORTIONONLY_OFF
_EMISSION _NORMALMAP_TANGENT_SPACE
m_ShaderKeywords: _ALPHACUTOFFENABLE_OFF _DETAIL_MAP_WITH_NORMAL _DISTORTIONDEPTHTEST_OFF
_DISTORTIONONLY_OFF _EMISSION _NORMALMAP_TANGENT_SPACE
m_EnableInstancingVariants: 0
disabledShaderPasses:
- DistortionVectors
serializedVersion: 2
serializedVersion: 3
- first:
name: _BaseColorMap
second:
- _AnisotropyMap:
- first:
name: _BumpMap
second:
- _BaseColorMap:
- first:
name: _DetailAlbedoMap
second:
- _BumpMap:
- first:
name: _DetailMask
second:
- _DetailAlbedoMap:
- first:
name: _DetailNormalMap
second:
- _DetailMap:
- first:
name: _DiffuseLightingMap
second:
- _DetailMask:
- first:
name: _DiffuseMap
second:
- _DetailNormalMap:
- first:
name: _EmissionMap
second:
- _DiffuseLightingMap:
- first:
name: _EmissiveColorMap
second:
- _DiffuseMap:
- first:
name: _HeightMap
second:
- _DistortionVectorMap:
- first:
name: _MainTex
second:
- _EmissionMap:
- first:
name: _MaskMap
second:
- _EmissiveColorMap:
- first:
name: _MetallicGlossMap
second:
- _HeightMap:
- first:
name: _NormalMap
second:
- _MainTex:
- first:
name: _OcclusionMap
second:
- _MaskMap:
- first:
name: _ParallaxMap
second:
- _MetallicGlossMap:
- first:
name: _SmoothnessMap
second:
- _NormalMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _OcclusionMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _ParallaxMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _SmoothnessMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _SpecMap:
- first:
name: _SpecMap
second:
- _SpecularOcclusionMap:
- first:
name: _SpecularOcclusionMap
second:
- _SubSurfaceRadiusMap:
- first:
name: _SubSurfaceRadiusMap
second:
- _TangentMap:
- first:
name: _AlphaCutoff
second: 0.5
- first:
name: _AlphaCutoffEnable
second: 0
- first:
name: _BlendMode
second: 0
- first:
name: _BumpScale
second: 1
- first:
name: _CullMode
second: 2
- first:
name: _Cutoff
second: 0.5
- first:
name: _DetailNormalMapScale
second: 1
- first:
name: _DistortionDepthTest
second: 0
- first:
name: _DistortionOnly
second: 0
- first:
name: _DoubleSidedMode
second: 0
- first:
name: _DstBlend
second: 0
- first:
name: _EmissiveColorMode
second: 1
- first:
name: _EmissiveIntensity
second: 0
- first:
name: _GlossMapScale
second: 1
- first:
name: _Glossiness
second: 0.5
- first:
name: _GlossyReflections
second: 1
- first:
name: _HeightBias
second: 0
- first:
name: _HeightMapMode
second: 0
- first:
name: _HeightScale
second: 1
- first:
name: _MaterialId
second: 0
- first:
name: _Metalic
second: 0
- first:
name: _Metallic
second: 0
- first:
name: _Mettalic
second: 0
- first:
name: _Mode
second: 0
- first:
name: _NormalMapSpace
second: 0
- first:
name: _OcclusionStrength
second: 1
- first:
name: _Parallax
second: 0.02
- first:
name: _Smoothness
second: 0.5
- first:
name: _SmoothnessTextureChannel
second: 0
- first:
name: _SpecularHighlights
second: 1
- first:
name: _SrcBlend
second: 1
- first:
name: _SubSurfaceRadius
second: 0
- first:
name: _SurfaceType
second: 0
- first:
name: _UVSec
second: 0
- first:
name: _ZWrite
second: 1
- _AlphaCutoff: 0.5
- _AlphaCutoffEnable: 0
- _Anisotropy: 0
- _BlendMode: 0
- _BumpScale: 1
- _CullMode: 2
- _Cutoff: 0.5
- _DepthOffsetEnable: 0
- _DetailAOScale: 1
- _DetailAlbedoScale: 1
- _DetailHeightScale: 1
- _DetailMapMode: 0
- _DetailNormalMapScale: 1
- _DetailNormalScale: 1
- _DetailSmoothnessScale: 1
- _DistortionDepthTest: 0
- _DistortionEnable: 0
- _DistortionOnly: 0
- _DoubleSidedMode: 0
- _DstBlend: 0
- _EmissiveColorMode: 1
- _EmissiveIntensity: 0
- _EnablePerPixelDisplacement: 0
- _GlossMapScale: 1
- _Glossiness: 0.5
- _GlossyReflections: 1
- _HeightAmplitude: 0.01
- _HeightBias: 0
- _HeightCenter: 0.5
- _HeightMapMode: 0
- _HeightScale: 1
- _MaterialId: 0
- _Metalic: 0
- _Metallic: 0
- _Mettalic: 0
- _Mode: 0
- _NormalMapSpace: 0
- _NormalScale: 1
- _OcclusionStrength: 1
- _PPDMaxSamples: 15
- _PPDMinSamples: 5
- _Parallax: 0.02
- _Smoothness: 0.5
- _SmoothnessTextureChannel: 0
- _SpecularHighlights: 1
- _SrcBlend: 1
- _SubSurfaceRadius: 0
- _SurfaceType: 0
- _TexWorldScale: 1
- _UVBase: 0
- _UVDetail: 0
- _UVMappingPlanar: 0
- _UVSec: 0
- _ZTestMode: 8
- _ZWrite: 1
- first:
name: _BaseColor
second: {r: 1, g: 1, b: 1, a: 1}
- first:
name: _Color
second: {r: 0.5, g: 0.5, b: 0.5, a: 1}
- first:
name: _DiffuseColor
second: {r: 0.7176471, g: 0.7176471, b: 0.7176471, a: 1}
- first:
name: _EmissionColor
second: {r: 0, g: 0, b: 0, a: 1}
- first:
name: _EmissiveColor
second: {r: 0, g: 0, b: 0, a: 1}
- first:
name: _SpecColor
second: {r: 0.04, g: 0.04, b: 0.04, a: 1}
- _BaseColor: {r: 1, g: 1, b: 1, a: 1}
- _Color: {r: 0.5, g: 0.5, b: 0.5, a: 1}
- _DiffuseColor: {r: 0.7176471, g: 0.7176471, b: 0.7176471, a: 1}
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
- _EmissiveColor: {r: 0, g: 0, b: 0, a: 1}
- _SpecColor: {r: 0.04, g: 0.04, b: 0.04, a: 1}
- _UVDetailsMappingMask: {r: 1, g: 0, b: 0, a: 0}
- _UVMappingMask: {r: 1, g: 0, b: 0, a: 0}

25
Assets/TestScenes/HDTest/Material/HDRenderLoopMaterials/test details.mat


m_PrefabInternal: {fileID: 0}
m_Name: test details
m_Shader: {fileID: 4800000, guid: 6e4ae4064600d784cac1e41a9e6f2e59, type: 3}
m_ShaderKeywords: _ALPHACUTOFFENABLE_OFF _DETAIL_MAP _DETAIL_MAP_WITH_NORMAL _DISTORTIONDEPTHTEST_OFF
_DISTORTIONONLY_OFF _EMISSION _NORMALMAP _NORMALMAP_TANGENT_SPACE
m_ShaderKeywords: _ALPHACUTOFFENABLE_OFF _DETAIL_MAP_WITH_NORMAL _DISTORTIONDEPTHTEST_OFF
_DISTORTIONONLY_OFF _EMISSION _NORMALMAP_TANGENT_SPACE
m_EnableInstancingVariants: 0
disabledShaderPasses:
- DistortionVectors
m_SavedProperties:
serializedVersion: 3
m_TexEnvs:

m_Offset: {x: 0, y: 0}
- _DiffuseMap:
m_Texture: {fileID: 2800000, guid: d734753529ca78148a43944515a64bc5, type: 3}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DistortionVectorMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _EmissionMap:

- _CoatRoughness: 0
- _CullMode: 2
- _Cutoff: 0.5
- _DepthOffsetEnable: 0
- _DetailAOScale: 1
- _DetailAlbedoScale: 1
- _DetailHeightScale: 1

- _DetailSmoothnessScale: 1
- _DistortionDepthTest: 0
- _DistortionEnable: 0
- _DistortionOnly: 0
- _DoubleSided: 1
- _DoubleSidedLigthing: 1

- _EmissiveIntensity: 0
- _EnablePerPixelDisplacement: 0
- _HeightAmplitude: 0.01
- _HeightCenter: 0.5
- _HeightMapMode: 0
- _HeightScale: 1
- _MaterialID: 0

- _Mettalic: 0
- _Mode: 0
- _NormalMapSpace: 0
- _NormalScale: 1
- _PPDMaxSamples: 15
- _PPDMinSamples: 5
- _Parallax: 0.02
- _Smoothness: 0.524
- _SmoothnessTextureChannel: 0

- _SubSurfaceRadius: 0
- _SurfaceType: 0
- _TexWorldScale: 1
- _UVBase: 0
- _UVMappingPlanar: 0
- _ZTestMode: 8
- _ZWrite: 1
m_Colors:
- _BaseColor: {r: 0.5588235, g: 0.5588235, b: 0.5588235, a: 1}

- _EmissiveColor: {r: 0, g: 0, b: 0, a: 1}
- _SpecColor: {r: 0.04, g: 0.04, b: 0.04, a: 1}
- _UVDetailsMappingMask: {r: 1, g: 0, b: 0, a: 0}
- _UVMappingMask: {r: 1, g: 0, b: 0, a: 0}

4
ProjectSettings/GraphicsSettings.asset


- {fileID: 15106, guid: 0000000000000000f000000000000000, type: 0}
- {fileID: 10770, guid: 0000000000000000f000000000000000, type: 0}
- {fileID: 10782, guid: 0000000000000000f000000000000000, type: 0}
- {fileID: 4800000, guid: 36c23fe83f8e7a54d8fb168fa6cf2a3d, type: 3}
- {fileID: 4800000, guid: 595434cc3b6405246b6cd3086d0b6f7d, type: 3}
- {fileID: 16001, guid: 0000000000000000f000000000000000, type: 0}
m_PreloadedShaders: []
m_SpritesDefaultMaterial: {fileID: 10754, guid: 0000000000000000f000000000000000,
type: 0}

m_Automatic: 0
m_LightmapStripping: 0
m_FogStripping: 0
m_InstancingStripping: 0
m_LightmapKeepPlain: 1
m_LightmapKeepDirCombined: 1
m_LightmapKeepDynamicPlain: 1

158
ProjectSettings/ProjectSettings.asset


defaultScreenHeight: 768
defaultScreenWidthWeb: 960
defaultScreenHeightWeb: 600
m_StereoRenderingPath: 0
m_ActiveColorSpace: 1
m_MTRendering: 1
m_MobileMTRendering: 0

n3dsDisableStereoscopicView: 0
n3dsEnableSharedListOpt: 1
n3dsEnableVSync: 0
uiUse16BitDepthBuffer: 0
ignoreAlphaClear: 0
xboxOneResolution: 0
xboxOneMonoLoggingLevel: 0

metroInputSource: 0
m_HolographicPauseOnTrackingLoss: 1
xboxOneDisableKinectGpuReservation: 0
singlePassStereoRendering: 0
xboxOneEnable7thCore: 0
vrSettings:
cardboard:
depthFormat: 0
enableTransitionView: 0
daydream:
depthFormat: 0
useSustainedPerformanceMode: 0
hololens:
depthFormat: 1
useHDRDisplay: 0
AndroidMinSdkVersion: 9
AndroidMinSdkVersion: 16
AndroidTargetSdkVersion: 0
apiCompatibilityLevel: 2
stripEngineCode: 1
iPhoneStrippingLevel: 0
iPhoneScriptCallOptimization: 0

serializedVersion: 2
m_Bits: 238
iPhoneSdkVersion: 988
iOSTargetOSVersionString: 6.0
iOSTargetOSVersionString: 8.0
tvOSSdkVersion: 0
tvOSRequireExtendedGameController: 0
tvOSTargetOSVersionString: 9.0

tvOSSmallIconLayers: []
tvOSLargeIconLayers: []
tvOSTopShelfImageLayers: []
tvOSTopShelfImageWideLayers: []
iOSLaunchScreenType: 0
iOSLaunchScreenPortrait: {fileID: 0}
iOSLaunchScreenLandscape: {fileID: 0}

iOSURLSchemes: []
iOSBackgroundModes: 0
iOSMetalForceHardShadows: 0
metalEditorSupport: 1
metalAPIValidation: 1
iOSManualSigningProvisioningProfileID:
tvOSManualSigningProvisioningProfileID:
appleEnableAutomaticSigning: 0
AndroidTargetDevice: 0
AndroidSplashScreenScale: 0
androidSplashScreen: {fileID: 0}

- m_BuildTarget: Standalone
m_StaticBatching: 0
m_DynamicBatching: 0
- m_BuildTarget: iPhone
m_StaticBatching: 0
m_DynamicBatching: 0
m_APIs: 11000000
m_APIs: 1000000011000000
m_Automatic: 1
- m_BuildTarget: iOSSupport
m_APIs: 10000000
m_Automatic: 0
m_BuildTargetVRSettings:
- m_BuildTarget: Android

cameraUsageDescription:
locationUsageDescription:
microphoneUsageDescription:
switchNetLibKey:
switchSocketMemoryPoolSize: 6144
switchSocketAllocatorPoolSize: 128
switchSocketConcurrencyLimit: 14
switchUseCPUProfiler: 0
switchApplicationID: 0x0005000C10000001
switchNSODependencies:
switchTitleNames_0:
switchTitleNames_1:
switchTitleNames_2:
switchTitleNames_3:
switchTitleNames_4:
switchTitleNames_5:
switchTitleNames_6:
switchTitleNames_7:
switchTitleNames_8:
switchTitleNames_9:
switchTitleNames_10:
switchTitleNames_11:
switchTitleNames_12:
switchTitleNames_13:
switchTitleNames_14:
switchPublisherNames_0:
switchPublisherNames_1:
switchPublisherNames_2:
switchPublisherNames_3:
switchPublisherNames_4:
switchPublisherNames_5:
switchPublisherNames_6:
switchPublisherNames_7:
switchPublisherNames_8:
switchPublisherNames_9:
switchPublisherNames_10:
switchPublisherNames_11:
switchPublisherNames_12:
switchPublisherNames_13:
switchPublisherNames_14:
switchIcons_0: {fileID: 0}
switchIcons_1: {fileID: 0}
switchIcons_2: {fileID: 0}
switchIcons_3: {fileID: 0}
switchIcons_4: {fileID: 0}
switchIcons_5: {fileID: 0}
switchIcons_6: {fileID: 0}
switchIcons_7: {fileID: 0}
switchIcons_8: {fileID: 0}
switchIcons_9: {fileID: 0}
switchIcons_10: {fileID: 0}
switchIcons_11: {fileID: 0}
switchIcons_12: {fileID: 0}
switchIcons_13: {fileID: 0}
switchIcons_14: {fileID: 0}
switchSmallIcons_0: {fileID: 0}
switchSmallIcons_1: {fileID: 0}
switchSmallIcons_2: {fileID: 0}
switchSmallIcons_3: {fileID: 0}
switchSmallIcons_4: {fileID: 0}
switchSmallIcons_5: {fileID: 0}
switchSmallIcons_6: {fileID: 0}
switchSmallIcons_7: {fileID: 0}
switchSmallIcons_8: {fileID: 0}
switchSmallIcons_9: {fileID: 0}
switchSmallIcons_10: {fileID: 0}
switchSmallIcons_11: {fileID: 0}
switchSmallIcons_12: {fileID: 0}
switchSmallIcons_13: {fileID: 0}
switchSmallIcons_14: {fileID: 0}
switchManualHTML:
switchAccessibleURLs:
switchLegalInformation:
switchMainThreadStackSize: 1048576
switchPresenceGroupId: 0x0005000C10000001
switchLogoHandling: 0
switchReleaseVersion: 0
switchDisplayVersion: 1.0.0
switchStartupUserAccount: 0
switchTouchScreenUsage: 0
switchSupportedLanguagesMask: 0
switchLogoType: 0
switchApplicationErrorCodeCategory:
switchUserAccountSaveDataSize: 0
switchUserAccountSaveDataJournalSize: 0
switchAttribute: 0
switchCardSpecSize: 4
switchCardSpecClock: 25
switchRatingsMask: 0
switchRatingsInt_0: 0
switchRatingsInt_1: 0
switchRatingsInt_2: 0
switchRatingsInt_3: 0
switchRatingsInt_4: 0
switchRatingsInt_5: 0
switchRatingsInt_6: 0
switchRatingsInt_7: 0
switchRatingsInt_8: 0
switchRatingsInt_9: 0
switchRatingsInt_10: 0
switchRatingsInt_11: 0
switchLocalCommunicationIds_0: 0x0005000C10000001
switchLocalCommunicationIds_1:
switchLocalCommunicationIds_2:
switchLocalCommunicationIds_3:
switchLocalCommunicationIds_4:
switchLocalCommunicationIds_5:
switchLocalCommunicationIds_6:
switchLocalCommunicationIds_7:
switchParentalControl: 0
switchAllowsScreenshot: 1
switchDataLossConfirmation: 0
XboxTitleId:
XboxImageXexPath:
XboxSpaPath:

ps4ParamSfxPath:
ps4VideoOutPixelFormat: 0
ps4VideoOutInitialWidth: 1920
ps4VideoOutBaseModeInitialWidth: 1920
ps4VideoOutReprojectionRate: 120
ps4PronunciationXMLPath:
ps4PronunciationSIGPath:

ps4ApplicationParam4: 0
ps4DownloadDataSize: 0
ps4GarlicHeapSize: 2048
ps4ProGarlicHeapSize: 2560
ps4Passcode: frAQBc8Wsa1xVPfvJcrgRYwTiizs2trQ
ps4UseDebugIl2cppLibs: 0
ps4pnSessions: 1

ps4attribShareSupport: 0
ps4attribExclusiveVR: 0
ps4disableAutoHideSplash: 0
ps4videoRecordingFeaturesUsed: 0
ps4contentSearchFeaturesUsed: 0
ps4attribEyeToEyeDistanceSettingVR: 0
ps4IncludedModules: []
monoEnv:
psp2Splashimage: {fileID: 0}

spritePackerPolicy:
webGLMemorySize: 256
webGLExceptionSupport: 1
webGLNameFilesAsHashes: 0
webGLDataCaching: 0
webGLDebugSymbols: 0
webGLEmscriptenArgs:

incrementalIl2cppBuild:
iOS: 0
additionalIl2CppArgs:
apiCompatibilityLevelPerPlatform: {}
m_RenderingPath: 1
m_MobileRenderingPath: 1
metroPackageName: dev

XboxOneSplashScreen: {fileID: 0}
XboxOneAllowedProductIds: []
XboxOnePersistentLocalStorageSize: 0
vrEditorSettings: {}
xboxOneScriptCompiler: 0
vrEditorSettings:
daydream:
daydreamIconForeground: {fileID: 0}
daydreamIconBackground: {fileID: 0}
cloudServicesEnabled:
Analytics: 0
Build: 0

UNet: 0
Unity_Ads: 0
facebookSdkVersion: 7.8.2
apiCompatibilityLevel: 2
enableNewInputSystem: 0

2
ProjectSettings/ProjectVersion.txt


m_EditorVersion: 5.6.0b5
m_EditorVersion: 5.6.0b6

64
Assets/TestScenes/HDTest/GraphicTest/Two Sided/Material/GroundLeaf_DoubleSidedFlip.mat


m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 0}
m_PrefabInternal: {fileID: 0}
m_Name: GroundLeaf_Albedo
m_Name: GroundLeaf_DoubleSidedFlip
m_ShaderKeywords: _ALPHACUTOFFENABLE_OFF _DISTORTIONDEPTHTEST_OFF _DISTORTIONONLY_OFF
_DOUBLESIDED_LIGHTING_FLIP _EMISSION _MASKMAP _METALLICGLOSSMAP _NORMALMAP _NORMALMAP_TANGENT_SPACE
m_ShaderKeywords: _ALPHATEST_ON _DEPTHOFFSETENABLE_OFF _DETAIL_MAP_WITH_NORMAL _DISTORTIONDEPTHTEST_OFF
_DISTORTIONENABLE_OFF _DISTORTIONONLY_OFF _DOUBLESIDED_LIGHTING_FLIP _EMISSION
_ENABLEPERPIXELDISPLACEMENT_OFF _MASKMAP _METALLICGLOSSMAP _NORMALMAP _NORMALMAP_TANGENT_SPACE
_TESSELLATIONOBJECTSCALE_OFF _TESSELLATION_DISPLACEMENT
m_CustomRenderQueue: -1
stringTagMap: {}
m_EnableInstancingVariants: 0
m_CustomRenderQueue: 2450
stringTagMap:
RenderType: TransparentCutout
disabledShaderPasses:
- DistortionVectors
- _AnisotropyMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _BaseColorMap:
m_Texture: {fileID: 2800000, guid: 00447c5eeb984f54d92c80818840a36b, type: 3}
m_Scale: {x: 1, y: 1}

m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailMask:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}

m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DiffuseLightingMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DistortionVectorMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}

m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _SubSurfaceRadiusMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _TangentMap:
- _AlphaCutoffEnable: 0
- _AlphaCutoffEnable: 1
- _Anisotropy: 0
- _DepthOffsetEnable: 0
- _DetailAOScale: 1
- _DetailAlbedoScale: 1
- _DetailHeightScale: 1
- _DetailMapMode: 0
- _DetailNormalScale: 1
- _DetailSmoothnessScale: 1
- _DistortionEnable: 0
- _EnablePerPixelDisplacement: 0
- _HeightAmplitude: 0.32
- _HeightCenter: 0.68
- _HeightMapMode: 0
- _HeightScale: 1
- _MaterialId: 0

- _Mode: 1
- _NormalMapSpace: 0
- _NormalScale: 1
- _PPDMaxSamples: 15
- _PPDMinSamples: 5
- _Parallax: 0.02
- _Smoothness: 0.5
- _SmoothnessTextureChannel: 0

- _SurfaceType: 0
- _TessellationBackFaceCullEpsilon: -0.375
- _TessellationFactor: 4
- _TessellationFactorMaxDistance: 50
- _TessellationFactorMinDistance: 20
- _TessellationFactorTriangleSize: 100
- _TessellationMode: 1
- _TessellationObjectScale: 0
- _TessellationShapeFactor: 0.75
- _TexWorldScale: 1
- _UVBase: 0
- _UVDetail: 0
- _UVMappingPlanar: 0
- _ZTestMode: 8
- _ZWrite: 1
m_Colors:
- _BaseColor: {r: 1, g: 1, b: 1, a: 1}

- _UVDetailsMappingMask: {r: 1, g: 0, b: 0, a: 0}
- _UVMappingMask: {r: 1, g: 0, b: 0, a: 0}

70
Assets/ScriptableRenderLoop/HDRenderPipeline/Material/Lit/LayeredLitNormalSampling.hlsl


// TODO: Handle BC5 format, currently this code is for DXT5nm
// THis function below must call UnpackNormalmapRGorAG
float3 ADD_FUNC_SUFFIX(SampleLayerNormal)(TEXTURE2D_ARGS(layerTex, layerSampler), LayerUV layerUV, float3 weights, float scale, float bias)
{
if (layerUV.isTriplanar)
{
float3 val = float3(0.0, 0.0, 0.0);
if (weights.x > 0.0)
val += weights.x * UnpackNormalAG(NORMAL_SAMPLE_FUNC(layerTex, layerSampler, layerUV.uvYZ, bias), scale);
if (weights.y > 0.0)
val += weights.y * UnpackNormalAG(NORMAL_SAMPLE_FUNC(layerTex, layerSampler, layerUV.uvZX, bias), scale);
if (weights.z > 0.0)
val += weights.z * UnpackNormalAG(NORMAL_SAMPLE_FUNC(layerTex, layerSampler, layerUV.uvXY, bias), scale);
return normalize(val);
}
else
{
return UnpackNormalAG(NORMAL_SAMPLE_FUNC(layerTex, layerSampler, layerUV.uv, bias), scale);
}
}
// This version is for normalmap with AG encoding only (use with details map)
float3 ADD_FUNC_SUFFIX(SampleLayerNormalAG)(TEXTURE2D_ARGS(layerTex, layerSampler), LayerUV layerUV, float3 weights, float scale, float bias)
{
if (layerUV.isTriplanar)
{
float3 val = float3(0.0, 0.0, 0.0);
if (weights.x > 0.0)
val += weights.x * UnpackNormalAG(NORMAL_SAMPLE_FUNC(layerTex, layerSampler, layerUV.uvYZ, bias), scale);
if (weights.y > 0.0)
val += weights.y * UnpackNormalAG(NORMAL_SAMPLE_FUNC(layerTex, layerSampler, layerUV.uvZX, bias), scale);
if (weights.z > 0.0)
val += weights.z * UnpackNormalAG(NORMAL_SAMPLE_FUNC(layerTex, layerSampler, layerUV.uvXY, bias), scale);
return normalize(val);
}
else
{
return UnpackNormalAG(NORMAL_SAMPLE_FUNC(layerTex, layerSampler, layerUV.uv, bias), scale);
}
}
// This version is for normalmap with RGB encoding only, i.e non encoding. It is necessary to use this abstraction to handle correctly triplanar
// plus consistent with the normal scale parameter
float3 ADD_FUNC_SUFFIX(SampleLayerNormalRGB)(TEXTURE2D_ARGS(layerTex, layerSampler), LayerUV layerUV, float3 weights, float scale, float bias)
{
if (layerUV.isTriplanar)
{
float3 val = float3(0.0, 0.0, 0.0);
if (weights.x > 0.0)
val += weights.x * UnpackNormalRGB(NORMAL_SAMPLE_FUNC(layerTex, layerSampler, layerUV.uvYZ, bias), scale);
if (weights.y > 0.0)
val += weights.y * UnpackNormalRGB(NORMAL_SAMPLE_FUNC(layerTex, layerSampler, layerUV.uvZX, bias), scale);
if (weights.z > 0.0)
val += weights.z * UnpackNormalRGB(NORMAL_SAMPLE_FUNC(layerTex, layerSampler, layerUV.uvXY, bias), scale);
return normalize(val);
}
else
{
return UnpackNormalRGB(NORMAL_SAMPLE_FUNC(layerTex, layerSampler, layerUV.uv, bias), scale);
}
}

9
Assets/ScriptableRenderLoop/HDRenderPipeline/Material/Lit/LayeredLitNormalSampling.hlsl.meta


fileFormatVersion: 2
guid: 541d9773d4d9b4c4f92e026284359f50
timeCreated: 1485010820
licenseType: Pro
ShaderImporter:
defaultTextures: []
userData:
assetBundleName:
assetBundleVariant:

88
Assets/ScriptableRenderLoop/ShaderLibrary/API/Metal.hlsl


// This file assumes SHADER_API_METAL is defined
// TODO: This is a straight copy from D3D11.hlsl. Go through all this stuff and adjust where needed.
#define UNITY_UV_STARTS_AT_TOP 1
#define UNITY_REVERSED_Z 1
#define UNITY_NEAR_CLIP_VALUE (1.0)
// This value will not go through any matrix projection convertion
#define UNITY_RAW_FAR_CLIP_VALUE (0.0)
#define FRONT_FACE_SEMATIC SV_IsFrontFace
#define FRONT_FACE_TYPE bool
#define IS_FRONT_VFACE(VAL, FRONT, BACK) ((VAL) ? (FRONT) : (BACK))
#define CBUFFER_START(name) cbuffer name {
#define CBUFFER_END };
// Initialize arbitrary structure with zero values.
// Do not exist on some platform, in this case we need to have a standard name that call a function that will initialize all parameters to 0
#define ZERO_INITIALIZE(type, name) name = (type)0;
// Texture util abstraction
#define CALCULATE_TEXTURE2D_LOD(textureName, samplerName, coord2) textureName.CalculateLevelOfDetail(samplerName, coord2)
// Texture abstraction
#define TEXTURE2D(textureName) Texture2D textureName
#define TEXTURE2D_ARRAY(textureName) Texture2DArray textureName
#define TEXTURECUBE(textureName) TextureCube textureName
#define TEXTURECUBE_ARRAY(textureName) TextureCubeArray textureName
#define TEXTURE3D(textureName) Texture3D textureName
#define SAMPLER2D(samplerName) SamplerState samplerName
#define SAMPLERCUBE(samplerName) SamplerState samplerName
#define SAMPLER3D(samplerName) SamplerState samplerName
#define SAMPLER2D_SHADOW(samplerName) SamplerComparisonState samplerName
#define SAMPLERCUBE_SHADOW(samplerName) SamplerComparisonState samplerName
#define TEXTURE2D_ARGS(textureName, samplerName) Texture2D textureName, SamplerState samplerName
#define TEXTURE2D_ARRAY_ARGS(textureName, samplerName) Texture2DArray textureName, SamplerState samplerName
#define TEXTURECUBE_ARGS(textureName, samplerName) TextureCube textureName, SamplerState samplerName
#define TEXTURECUBE_ARRAY_ARGS(textureName, samplerName) TextureCubeArray textureName, SamplerState samplerName
#define TEXTURE3D_ARGS(textureName, samplerName) Texture3D textureName, SamplerState samplerName
#define TEXTURE2D_SHADOW_ARGS(textureName, samplerName) Texture2D textureName, SamplerComparisonState samplerName
#define TEXTURE2D_ARRAY_SHADOW_ARGS(textureName, samplerName) Texture2DArray textureName, SamplerComparisonState samplerName
#define TEXTURECUBE_SHADOW_ARGS(textureName, samplerName) TextureCube textureName, SamplerComparisonState samplerName
#define TEXTURE2D_PARAM(textureName, samplerName) textureName, samplerName
#define TEXTURE2D_ARRAY_PARAM(textureName, samplerName) textureName, samplerName
#define TEXTURECUBE_PARAM(textureName, samplerName) textureName, samplerName
#define TEXTURECUBE_ARRAY_PARAM(textureName, samplerName) textureName, samplerName
#define TEXTURE3D_PARAM(textureName, samplerName) textureName, samplerName
#define TEXTURE2D_SHADOW_PARAM(textureName, samplerName) textureName, samplerName
#define TEXTURE2D_ARRAY_SHADOW_PARAM(textureName, samplerName) textureName, samplerName
#define TEXTURECUBE_SHADOW_PARAM(textureName, samplerName) textureName, samplerName
#define SAMPLE_TEXTURE2D(textureName, samplerName, coord2) textureName.Sample(samplerName, coord2)
#define SAMPLE_TEXTURE2D_LOD(textureName, samplerName, coord2, lod) textureName.SampleLevel(samplerName, coord2, lod)
#define SAMPLE_TEXTURE2D_BIAS(textureName, samplerName, coord2, bias) textureName.SampleBias(samplerName, coord2, bias)
#define SAMPLE_TEXTURE2D_GRAD(textureName, samplerName, coord2, ddx, ddy) textureName.SampleGrad(samplerName, coord2, ddx, ddy)
#define SAMPLE_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Sample(samplerName, float3(coord2, index))
#define SAMPLE_TEXTURE2D_ARRAY_LOD(textureName, samplerName, coord2, index, lod) textureName.SampleLevel(samplerName, float3(coord2, index), lod)
#define SAMPLE_TEXTURE2D_ARRAY_BIAS(textureName, samplerName, coord2, index, bias) textureName.SampleBias(samplerName, float3(coord2, index), bias)
#define SAMPLE_TEXTURECUBE(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)
#define SAMPLE_TEXTURECUBE_LOD(textureName, samplerName, coord3, lod) textureName.SampleLevel(samplerName, coord3, lod)
#define SAMPLE_TEXTURECUBE_BIAS(textureName, samplerName, coord3, bias) textureName.SampleBias(samplerName, coord3, bias)
#define SAMPLE_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Sample(samplerName, float4(coord3, index))
#define SAMPLE_TEXTURECUBE_ARRAY_LOD(textureName, samplerName, coord3, index, lod) textureName.SampleLevel(samplerName, float4(coord3, index), lod)
#define SAMPLE_TEXTURECUBE_ARRAY_BIAS(textureName, samplerName, coord3, index, bias) textureName.SampleBias(samplerName, float4(coord3, index), bias)
#define SAMPLE_TEXTURE3D(textureName, samplerName, coord3) textureName.Sample(samplerName, coord3)
#define SAMPLE_TEXTURE2D_SHADOW(textureName, samplerName, coord3) textureName.SampleCmpLevelZero(samplerName, (coord3).xy, (coord3).z)
#define SAMPLE_TEXTURE2D_ARRAY_SHADOW(textureName, samplerName, coord3, index) textureName.SampleCmpLevelZero(samplerName, float3((coord3).xy, index), (coord3).z)
#define SAMPLE_TEXTURECUBE_SHADOW(textureName, samplerName, coord4) textureName.SampleCmpLevelZero(samplerName, (coord3).xyz, (coord3).w)
#define TEXTURE2D_HALF TEXTURE2D
#define TEXTURE2D_FLOAT TEXTURE2D
#define SAMPLER2D_HALF SAMPLER2D
#define SAMPLER2D_FLOAT SAMPLER2D
#define LOAD_TEXTURE2D(textureName, unCoord2) textureName.Load(int3(unCoord2, 0))
#define LOAD_TEXTURE2D_LOD(textureName, unCoord2, lod) textureName.Load(int3(unCoord2, lod))
#define LOAD_TEXTURE2D_MSAA(textureName, unCoord2, sampleIndex) textureName.Load(unCoord2, sampleIndex)
#define LOAD_TEXTURE2D_ARRAY(textureName, unCoord2, index) textureName.Load(int4(unCoord2, index, 0))
#define LOAD_TEXTURE2D_ARRAY_LOD(textureName, unCoord2, index, lod) textureName.Load(int4(unCoord2, index, lod))
#define GATHER_TEXTURE2D(textureName, samplerName, coord2) textureName.Gather(samplerName, coord2)
#define GATHER_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Gather(samplerName, float3(coord2, index))
#define GATHER_TEXTURECUBE(textureName, samplerName, coord3) textureName.Gather(samplerName, coord3)
#define GATHER_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index) textureName.Gather(samplerName, float4(coord3, index))

9
Assets/ScriptableRenderLoop/ShaderLibrary/API/Metal.hlsl.meta


fileFormatVersion: 2
guid: f4d51e77f119d4dc8899ff02b46bb621
timeCreated: 1484817807
licenseType: Pro
ShaderImporter:
defaultTextures: []
userData:
assetBundleName:
assetBundleVariant:

9
Assets/TestScenes/HDTest/GraphicTest.meta


fileFormatVersion: 2
guid: fd89ea613dbd53546805c45cf536b0b4
folderAsset: yes
timeCreated: 1484821419
licenseType: Pro
DefaultImporter:
userData:
assetBundleName:
assetBundleVariant:

9
Assets/TestScenes/HDTest/LayeredLitTest/Mesh/Materials.meta


fileFormatVersion: 2
guid: e8f6ad2e481134b4fa6108a280b52de7
folderAsset: yes
timeCreated: 1484331445
licenseType: Pro
DefaultImporter:
userData:
assetBundleName:
assetBundleVariant:

9
Assets/TestScenes/HDTest/GraphicTest/Common.meta


fileFormatVersion: 2
guid: ebbb689e8fbe63a4a88d6c6552e389fd
folderAsset: yes
timeCreated: 1485165227
licenseType: Pro
DefaultImporter:
userData:
assetBundleName:
assetBundleVariant:

9
Assets/TestScenes/HDTest/GraphicTest/Common/Material.meta


fileFormatVersion: 2
guid: 5f31d17932e081649ae921b0862eea4a
folderAsset: yes
timeCreated: 1485165228
licenseType: Pro
DefaultImporter:
userData:
assetBundleName:
assetBundleVariant:

9
Assets/TestScenes/HDTest/GraphicTest/Common/Textures.meta


fileFormatVersion: 2
guid: 5d7f6a5ce24cb9a4c8af11d5f2b72af4
folderAsset: yes
timeCreated: 1485165228
licenseType: Pro
DefaultImporter:
userData:
assetBundleName:
assetBundleVariant:

9
Assets/TestScenes/HDTest/GraphicTest/Parallax Occlusion Mapping.meta


fileFormatVersion: 2
guid: f964e287612619e4a9d9c8c5f7d8e52c
folderAsset: yes
timeCreated: 1484821419
licenseType: Pro
DefaultImporter:
userData:
assetBundleName:
assetBundleVariant:

9
Assets/TestScenes/HDTest/GraphicTest/Parallax Occlusion Mapping/Material.meta


fileFormatVersion: 2
guid: ea09f087bd8bbbe41abd068d56cb40d6
folderAsset: yes
timeCreated: 1484821419
licenseType: Pro
DefaultImporter:
userData:
assetBundleName:
assetBundleVariant:

9
Assets/TestScenes/HDTest/GraphicTest/Parallax Occlusion Mapping/Textures.meta


fileFormatVersion: 2
guid: 0a646597d80703d48add34acf3a04212
folderAsset: yes
timeCreated: 1484821419
licenseType: Pro
DefaultImporter:
userData:
assetBundleName:
assetBundleVariant:

129
Assets/TestScenes/HDTest/GraphicTest/Parallax Occlusion Mapping/Textures/FourShapesColor.tga
文件差异内容过多而无法显示
查看文件

68
Assets/TestScenes/HDTest/GraphicTest/Parallax Occlusion Mapping/Textures/FourShapesColor.tga.meta


fileFormatVersion: 2
guid: 0353c00d9bc99f14780836a6a51a6d97
timeCreated: 1484821419
licenseType: Pro
TextureImporter:
fileIDToRecycleName: {}
serializedVersion: 4
mipmaps:
mipMapMode: 0
enableMipMap: 1
sRGBTexture: 1
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
isReadable: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
filterMode: -1
aniso: -1
mipBias: -1
wrapMode: -1
nPOTScale: 1
lightmap: 0
compressionQuality: 50
spriteMode: 0
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spritePixelsToUnits: 100
alphaUsage: 1
alphaIsTransparency: 0
spriteTessellationDetail: -1
textureType: 0
textureShape: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
platformSettings:
- buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
spriteSheet:
serializedVersion: 2
sprites: []
outline: []
spritePackingTag:
userData:
assetBundleName:
assetBundleVariant:

17
Assets/TestScenes/HDTest/GraphicTest/Parallax Occlusion Mapping/Textures/FourShapesRelief.tga
文件差异内容过多而无法显示
查看文件

116
Assets/TestScenes/HDTest/GraphicTest/Parallax Occlusion Mapping/Textures/FourShapesRelief.tga.meta


fileFormatVersion: 2
guid: ccbd506f77c77e04eaa274a3d3d417e3
timeCreated: 1484821420
licenseType: Pro
TextureImporter:
fileIDToRecycleName: {}
serializedVersion: 4
mipmaps:
mipMapMode: 0
enableMipMap: 1
sRGBTexture: 0
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
isReadable: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
filterMode: -1
aniso: -1
mipBias: -1
wrapMode: -1
nPOTScale: 1
lightmap: 0
compressionQuality: 50
spriteMode: 0
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spritePixelsToUnits: 100
alphaUsage: 1
alphaIsTransparency: 0
spriteTessellationDetail: -1
textureType: 1
textureShape: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
platformSettings:
- buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
- buildTarget: Standalone
maxTextureSize: 2048
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
- buildTarget: iPhone
maxTextureSize: 2048
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
- buildTarget: tvOS
maxTextureSize: 2048
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
- buildTarget: PS4
maxTextureSize: 2048
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
- buildTarget: Windows Store Apps
maxTextureSize: 2048
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
- buildTarget: WebGL
maxTextureSize: 2048
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
spriteSheet:
serializedVersion: 2
sprites: []
outline: []
spritePackingTag:
userData:
assetBundleName:
assetBundleVariant:

1
Assets/TestScenes/HDTest/GraphicTest/Parallax Occlusion Mapping/Textures/FourShapesReliefHeightmap.tga
文件差异内容过多而无法显示
查看文件

116
Assets/TestScenes/HDTest/GraphicTest/Parallax Occlusion Mapping/Textures/FourShapesReliefHeightmap.tga.meta


fileFormatVersion: 2
guid: db7b513b0c2406e40be832dc28133281
timeCreated: 1484821420
licenseType: Pro
TextureImporter:
fileIDToRecycleName: {}
serializedVersion: 4
mipmaps:
mipMapMode: 0
enableMipMap: 1
sRGBTexture: 1
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
isReadable: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
filterMode: -1
aniso: -1
mipBias: -1
wrapMode: -1
nPOTScale: 1
lightmap: 0
compressionQuality: 50
spriteMode: 0
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spritePixelsToUnits: 100
alphaUsage: 1
alphaIsTransparency: 0
spriteTessellationDetail: -1
textureType: 0
textureShape: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
platformSettings:
- buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
- buildTarget: Standalone
maxTextureSize: 2048
textureFormat: 26
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 1
- buildTarget: iPhone
maxTextureSize: 2048
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
- buildTarget: tvOS
maxTextureSize: 2048
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
- buildTarget: PS4
maxTextureSize: 2048
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
- buildTarget: Windows Store Apps
maxTextureSize: 2048
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
- buildTarget: WebGL
maxTextureSize: 2048
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
spriteSheet:
serializedVersion: 2
sprites: []
outline: []
spritePackingTag:
userData:
assetBundleName:
assetBundleVariant:

533
Assets/TestScenes/HDTest/GraphicTest/Parallax Occlusion Mapping/Textures/RockColor.jpg

之前 之后
宽度: 512  |  高度: 512  |  大小: 125 KiB

68
Assets/TestScenes/HDTest/GraphicTest/Parallax Occlusion Mapping/Textures/RockColor.jpg.meta


fileFormatVersion: 2
guid: 37411c7405e8c1a42ac0a0f50983bd46
timeCreated: 1484821420
licenseType: Pro
TextureImporter:
fileIDToRecycleName: {}
serializedVersion: 4
mipmaps:
mipMapMode: 0
enableMipMap: 1
sRGBTexture: 1
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
isReadable: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
filterMode: -1
aniso: -1
mipBias: -1
wrapMode: -1
nPOTScale: 1
lightmap: 0
compressionQuality: 50
spriteMode: 0
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spritePixelsToUnits: 100
alphaUsage: 1
alphaIsTransparency: 0
spriteTessellationDetail: -1
textureType: 0
textureShape: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
platformSettings:
- buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
spriteSheet:
serializedVersion: 2
sprites: []
outline: []
spritePackingTag:
userData:
assetBundleName:
assetBundleVariant:

130
Assets/TestScenes/HDTest/GraphicTest/Parallax Occlusion Mapping/Textures/RockHeightmap.tga


& %1@Sbmv}�������������������������������������������|seS>-   "'/:JXdow|����������~vnd\UOKKMRZdkpstsrqqpolg_VOPZgr|����������~uiZJ9)"$%''(,3>L]n}�����������������~vmfa^]][WRLFB?=:71*$$  
2GZht|����������������������¿������������������}vjYB,  +ARalty~���������|ulbZQJEBADKV`hnqqpoonlhbXMA>FR_jsy}~�����|vl`P?+  !*6EVgu��������������}rf[RKGGKOQPNJFB>:60'  !'*,-+*(&&$$#!"4J^nz��������������������������������������������ylZB,
!2K]ku|�������������xph_XQLHHLVcmuz||{zyvqi^QB<@JXdnv{������zqdUE2
 &*./-+*,3=L[iu}�����������~reXLEBDJSY_``]YUQMIA7* *4<BEFDB@><;:972-($"1F[kz��������������������������������������������yiU<' 
#6Pbpy���������������yqhaZSMJKTamw~���}ysi\M<45>KXemt{�����zqdTE2 
&08?CC@;6216?JXdnw~��������{pcUH?;=BMYbikkiea]YTMC5'  *:FPWZ[[YXVUTSQOKD>82,% "-@Teu��������������������������������������������veO5!  %:Tfs}����������������wphaYRMKP]ju~����~xodUD3))/<JWajrz����yobQB0
#-8CKSVVSMC;536<FPYcmw�����wk`RE;67=GTblrttqmifb]XNB2$ $6GV`hloonlkjihfd`ZTNF>4+$$*8J[ky�������������������������������������������r`H/ (=Whu~����������������~unf_WQLMVcpy��zrhYJ9) #-:GR]gry~��~vk^L>-!)4@KV^dggc]TH?8458=DLUaltzzvoeYMB944;ER`nv{|{wsolhd`XM@0$ ,ATcnv|����~|{ywsmh`WNC7,''/?N_o~�����������������������������������������|mX@)
,@Xiu}�����������������zsme]UOMR\itz}}yrh\M<-!",6@KYeov{{xocUE7(")2<HT^gosvvrmdYNC;7446:AJU_efcZPE=634:DQ^kv|��zvqnkge`XL?1$
"5J_nz�������������~wof\PB4*&(3@Par�����������������������������������������tdO7#  $0BWht|������������������yrkc[SOOValsvupg[N>0$$+2<HUaioqneXI;/'""%,4=GR]gpw}����zsi^SJ@:41027?GMOKF>7335;EQ^js|���{wspnkhf`XMA3& %#=Tgv����������������|si\N>1'#(1?Pct���������������������������������������ykZD/ !!!!!!""""#&+4BTdpx�����������������~wog`WQORZdjmkeYL?2(!!$'+1:EPZbd`VH<0*()/6?IS\gpx���������yodZOE=5/**-279752027>HT_jry����}xuqoljifaYOC4' )(E[o~�����������������~thYI9+" &1@Seq|�������������������������Ž���������}p`N9(%*.14444455566555469BQ_kt{������������������{tld\UPNSZ`a^UI=3*%$$&(+,-,*+/6>EMPMC7/().6?JT^gpx������������}tj`UK@4)$"#&)+,.3:CMXckrw|�����|xtqnljigc[QD6* //Mcw�������������������}qdUD2$%2CTalsx}����������������������ú��������seS@/#$*07>BEGHIHHIIJJJJIGECACMXcnw�����������������~wog`XPKKNRQME;2,)*.38=??=:4/-/15:=:2*&%+7DR^hpx���������������xodXL=-"#'-5>HR^govz|�������}yuqnllkje^TG9,  !47Ul��������������������yl]M9(&5DOY_dinu~�����������������������������whVD4'!!&.5>EKQTVWXXWWXXZZZXXVRMGEIP[fpy������������������zrkd\SJCBC@<60--06>ELQSSNJB93.+*+,)"$/AQamv}������������������{qeVG4$#,5ALXbksx|~�����������{vronoolh`UI:, 
&=B`v���������������������~rdT@,%08?EINT]iv�����������������ǿ��������ym\I8+$$*4?JRY]acdeffffeggggedb^XPIHKR]hs}�����������������}unh_UI=740.,,.4<FOW^bdc_ZRH>6-'#!#2G[kw���������������������|paO:) +7CO\fnv{��������������ytrrsrpjbWJ:+
 .HOl�����������������������viYE1"#(+/3:CP_n|���������������Ļ�������|qaM<-%$*4BOZbhlopqrsrrsrsttrqolg`XOIHLU_jw�����������������xrkbWI9/*((*/6@KVainrtrnibXMB6+$"2H_p}����������������������yjXB/$!&3CP]iry~������������������{vuuutqkcVG7& 8U]y�����������������������ym]K6%  %-9HXhw�����������������������vhVA1&#'2@P^hpuy{|}~�������~{xtoi`VOJJOWbo{�����������������zslcWG6+&&*09DQ]gqw{~}yuog\QC6,$"2H_r�����������������������r`K6)&*:KZgs{���������������������}yyxxvrkaSC1  'Dem���������¿�������������ym`N:)
&3AQbq}��������������������{n^J6)"$.<N]kt|�����������������{vph_VNJKOXft����������������{tmbUD4*'*2=IUblu~������~ysk`SF:0("$0E]q����������������Ž������zgR=.*/?Rboz���������������¾�������}|{{xsj]M;( #-6Sr{���������¿������������~vk^N<+ 
".=M]iu�������������������ufT?.$!(6HYiv��������������������|vog_WPMMR_mz����������������|tl`Q@1*+3@M[gr{����������~woeYNC90)$&/AXm~������������������������nXB2-3CWgu�����������������Ž�������}yqeWD0 &0:C_}������������������������xncVG6&
*7FS_kv����������������zl[H4& "-?Rcs���������������������{ung_WQMOZiv����������������|ti\L<0-3?M\is}�������������{ri_VK@6,(-<Qgz����������������ļ������s]F505FZjx�������������������ɾ���������wm_L8'&2<FNj�����������������������xndWJ<- 
 %0;GS^jw�������������raN:*$3G[l|�����������������������ysmd]UOMVer~���������������|reWE701;K[ju~���������������|tlcYNA4,,7I`v����������������Ľ������vaI726G]m{��������������������ɽ���������|seT@/# #.:DNUo����������������������~vl`TF9-! &/9CO\jw�����������xiUA/!'9Ocu����������������ƿ������|vpjbZSMSbn{���������������{o`Q@306EVfu�����������������|undYL<1-3BYp����������������½������xbJ838I_p}���������������������Ǻ���������yl\H7+(+6CMV\t���������������������vk^OA4( %(('$$,5AN[gr{�������yn]G4$,AWk}������������������¸����}xrmf^WOR^jv���������������yk[K:23=O`o|�������������������{umaTD6.0<Rh|��������������ſ�������xcK949Lbr��������������������������������}qcQ@414?LU^cy�����������Ŀ��������xl^N>0$!)18<=;70'  )3>IU`iotwxxunbO;*"3I`t�������������������ʿ����~xsniaYOOYdnz��������������xhUC517EYiw��������������������yqh[K;0/7Jau�����������������������xcK:5:Lbs����������������������ȹ��������uhYJ?<?IU_gl���������������������}o`N=-! (1;CJNOMIA7, 
'0:DNV\bfgf`TB0!*<Tk~��������������������ŷ����ytojd\PLS\fr�������������wdN=23<Maq}���������������������|umaR@3.3BWk����������������������uaK95:Lbs����������������������̾���������ymaUKHKT_got���������������������udR>- %/:DLSY\]\XQG;- 
 #+3;BINRSND5&&5Jbx���������������������ɻ����{uple]QKLR\ix�������������vaJ926CVix�������������û�������~xpfWG7//9L_s����������������������q^I75:Ncs���������������������������������{rh_WUW^gnux��������������������|kXC0!)5ALTZ_cegfc^UJ;,   $*06:<93(%2DZq����������������������˾����~wroh`SHCFN\o�������������w_G839K^p}�����������������������{tk^N<1,1?Pey��������������������|lZE63:Mcs~�����������������������Ÿ��������{sle_\_dkqw{��������������������r_J6% -:GT\cfhjlmmkgaWJ;.# 
!%&&"&2BUk������������������������������zuqldWJ??ERg{������������v]E64;Nas���������������ú�������}xodUD5,+3ATi}�������������������ueUA429Mcr}�����������������������ȼ��������{tnhc`afkpvy�������������������zhS=*!.=LXdkoqppqqqrpkdYL?3+# 
%1ASf{������������������������ô����|xtnfYK=8=Jaw�������û���v]C53<Ocu���������������ļ�������ysj]M<0(*4DXm������������������{o`P=108Kaq|��������������������������������ytnhb^^aejpt�������������������p]F1  ->N\hqwzyxvuvvvvsnf\RG>6-$   .>Pbu�������������������������Ķ�����{wqi\L<58D\s�������ƾ���x^C53;Nbt���������������ž��������}xpeVF5)%*5G]p�����������������wjZJ8-,5I_o{������������������������ù������~xrle^XVWZ^di|}}���������������xfP:&,<N^kv}����}||{|{zwqibZRKA8+   (9L]o��������������������������ƹ�����}ysj^N<24?Vn������������y_D506GZn~��������������ž��������{tk^N<,"!)7J_t����������������tfVC2((1E[lx�����������������������ƽ������}vof^ULGFHMUZqqs��������������~p\D/'8K]kw�������������}ytmgb\TJ>0%  !1DVgx��������������������������ɼ�����ztk_P<21:Ph������������{cH6.1>Pfx�������������������������}xocTB/"(8Kax���������������seS>-#$-?Ugt|�����������������������ȿ������{sj_SF;4127?Gaehy�������������yiR:' 2EXiw����������������{wsnjd[OB6-% ):M^o}������������ÿ��������������������|umaS?3/6Ha{������������iO;0.6F[o�������������������������zsgYH4$(:Og���������������scP:(&7M`mv{������������������������������yodVG9,$!!%-6SZ^q}�����������}raI2 &<Qct������������������~{xupjaVK@8/)$"1BUes�������������Ľ�������������ŷ�����~wpdWD5/2AXt������ľ����pWB3-0<Ody�������������������������|tj]M9&+@Xs��������������tbM6$ /DVdntz����������������������¹�����vj[J9* )GQUhu}���������~uiX@* -DYl|���������������������}{wph_VNG?92,'"!*8HZhv�������������ļ�������������ʾ������yrh\I:00<Pl������������xbM;0-4CXo�������������������������}umaQ>(!4Kh��������������raJ2!(:LYcjpv~���������������������������sdR>.
=HJ_jrwz|}}}|{xtl`O8$"3K_q�������������������������|voha[UOHB;4.**0<K[iv�������������ƾ��������������ŷ�����|tlaQA408Ke�������������lWD6./;Ng~������������������������xpdUB+ *A^z�������������r`H0 %3BNW^djs{�������������������������~n]I4$  5>>R]eilmnoonmjf_TD/ (:Qeu���������������������������|vrlgb\UOG>745>JYfs�����������������������������˾�����}vofXH:27F_z������������vbN>2.6F^w������������¾�����������{sgWE-
"8Sp�������������q_G/!$0:DKPV\dmw�����������������������ziWA,
.31BMUYZ\\\]][ZVOF9'"0BWix���������������ļ�������������|wqkf_WNE=;>HUbp�����������������������������ŷ����~xrj]N>57C[u������������}lXG7/3AYr�������������������������}ujZG/
/Je{�����������~o]E/"#*39=ADIOV_js}����������������������tcO9& 
&)"1:BDEEFFGGEDA<5+!,<M_mz�����������������»�������������ytnf]RIC@FQ^l{�������������º��������������˼����xslaSB67AWp�������������r`M;12=Uo��������������������������xl\H/
 '>Xm�����������zkYB/&#)28?BBA@BEJR\gr{��������������������|lYG2!   ',.011333330,'  +8HWfr|�������������������»�������������~yqi^TJDELWeu�������������»��������������������xsmdWE86?Tl�������������vdQ>22=Tm��������������������������zm\H/ 1H\o}��������~sdS>/)+5@HNPMIECCDIR\fr|�������������������q`M;*   #%(*+,,,)&!)8GUbnv~���������������������½�������������zsi]RIEHP]n������������ü���������������²���}wsmeXF86<Pg{������������xfT?32<Sk��������������������������zm[G. $6HZis{����{siZJ9.-3@NX^a]XSNIFFKS]ht}�����������������veR@0#  !%(+,--+'!#0AQ`kty��������������������������������������{rh\PHFJVfx������������Ľ���������������²���}wsmeXF74:Lat������������wfT=21:Qj�������������������������xjWC+ '5DR]fmprrpkdYM?2-1<LZemolha[TMHHLS]it|���������������yiVD4(   &-1578872+$%3DUepx}���������������������������¼����������zqfYOIIP^o������������ž���������������°���}wsmdXE616G[m{�����������ueR<1/7Mez�������������������������ueQ=' 
'1<ENW[^^\XPG=3,-7EVeqx{zvqkcZQLJMT`ku|~|zyz{}����xl\I8+$!"%&'%$!  '18?DHJJGB9/'#(3CVfr{�����������������������������������������xocWNILWgy���������������������������п����}xtmdWD4.1?Rcr|���������}p`N8-*2E]r������������������������{n\H5#  '-4;@EGGD?92,''0>Oaoz����zri_VPLOWcmuz{{xurppqsttph\L</'$',379862,$"%&1;CKPTXXWQH<1*(1?Rbp{�������������������������������Ľ��������wl`UMKQ_p���������������������������ξ����~yundVA0)*5FVeqx|����zrfWG3'$*:Qgy����������������������tdQ=-  #%(,/35663.)$ !&3EYiw��������yocYQNQZdmswvsokgdcccb^VK=1)&)08AFHIGC<3$,1"(2=HOW]bfgf`VJ;0+.:J\kx��������������������������������ǿ��������~th]SMNXh{��������������������������˽�����{vocT=,#")8GUainrsuutqldXL<+!.AWj|���������������������wjYF5) "&),,..///02330-("&6L`o}���������sf[ROSZcjnolga[VSPOLHB:2+)+2<FNUXYXSLC39>*-08@KU\djosutndWG8.,3@Qcs~������������������������������������������zpeYPMQ^p��������������������������Ⱥ�����}wocQ:((5BNW]addda^XPE9,"1EYjy�������������������yl]L;/'%'*/6<@BDDCB@><<;:61*#'8Ncs������������ufYQNRY^cec]TLD?<:8740,,.5>HR[adec`YPBHN<?BIQYbjqw|���zqcSA3,-7GYkz���������������������������������ɿ�������vk`UNNWfx�������������������������Ƹ�����~wnaO7$$/:CIMOOMIE?8/& #3DVeq|����������������zm^N?3,,/6=DJPTVWXXXWUTRPMHA8.%!!(7Mbs�������������vfXOMOSVXUPG>7311111115;CMV^ejlmkhb[PV]LOSW_gnw~������|o_K:/+0<Nbu����������������������������������ĺ�������zpeZPLP\n�������������������������ö�����wl_K3  %,034430,(#  "0?N\iu�������������|m]M@5//4<FNV\aegjklnnmlkie`XM@4+'+6I^o�������������r`QHCBCEC>82.-./247:>CKT\djorssroje[bgX\_cjrz���������zjVC5,,4DYo���������������������������������ɾ�������|sj_TLLTct�������������������������������vk[G/
  """!
 )6BO]jw�����������|m[K>5016?JV^flqux{}�������}wodVG:317FXk{��������������kWG:4110.,+-05:?CGLQV^dkptwyyxvsokckobegls{�����������taN=0+/=Pgy���������������������������������ʾ�������~vncXOKOZi|������������������������������thWA* 
 ",8DR_ku~�������xl\J=4027AMYckrx~��������������zm]MA;;CRct��������ÿ����v_I7,%##$',3;DKRW[`eiotw{}~|zvrnhqthlos{������������~lYG7.-6H_t���������������������������������Ƚ�������~xqh\SLKS`q������������������������������sfR;&  
 $-8CO[entvxxtmdXJ;2.28BN[fov}������������������scSHCDM\l���������ƿ���~eK4&!)4>IS[bfkpuy}��������zvqluxmquy��������������vdR@2-2AXm���������������������������������ƺ�������}xskaWNKNWeu����������������������µ�����rdO7$    '/8BKRX[]\XRJA6.+.8CQ]irz���������������������xhZNILTbw���������¹���jN4""0?LXcjpux|������������yuoy|rvz���������������n[I7/0;Pey��������������������������������¶������|yunf]SMKOZfs���������������������¶�����~rbM6$%*.133321/.-,)'$! #)07;???>;60+&$(2@O]it|�����������������������{l\SOS\o���������Ļ���oR5#&9JXeow{���������������ys|v{���������½�����wdQ>1/6G\p�������������������������������Ƽ�������}{yvqjaXPJINV`mx��������������������������}raK4%!*3<CIMOPOOLJHFC@=940*% !%*-010-+&")7JYgs}�����������������¿������|l`WTXg}��������ú���sV9%+BUdqz�������������������~w�{������������������nZE6/0<Odx��������������������������������������~{zxvrme\TJEDGLVamy������������������������|p_I3'#(3AN[dkpstsqnkhea]YSNIB:3.*&$##$%&(+-//-*$,>Rbo{���������������������������{maYXbu�������Ŀ����v[>(!1I]my���������������������z��������������ƾ�����vcO=1-4BVk�����������������������������ź������|zxwvrnh`XNE@;;@GR_o���������������ǽ������{n^G4++6GYjw����������zupkfaZSLEA<988889:;<<94.$  1FZiv���������������������¾������xj_X]l�������������x_C- %5Ocr���������������������~����������������¹����~mYF6./8I^u���������������������������Ⱦ������~{yywwvsokd\SH>4..18DTg{�������������¸������ym\E504EZo����������������zuoha[WSPOMNNNOOOMIB8+ %8M`p}���������������������¿�������rdZYct������������xaG0# '8Sgx���������������ſ����������������������Ž�����xeQ?2-1=Qh}��������������������������ù�����}yxxxwwwurnh`WK?2'""&/=Oey�����������»�������wjYC64;Qi��������¿�����������|uojfc`______][WOD6%+@Uhw�������������������������������xi]X\i}�����������u`H1$"(:Uj|����������������Ļ�����������������������������q]J9/-5E\q�������������������������ƾ�����{wvvwyz{{ywsnf\PB3%*:Nat������������������uhWB77C\u�����������ü�����������{wspnmllkkjhc[P@/"2I^o��������������������¿���������|naYX`s�����������o[E/$"*;Wl����������������ƾ����������������������ſ�����|iTB3,/;Odx������������������������������}wuux{}�����|wndXI8''7I\m{����������������~sfU@7:Gc}������������ž�������������}zxwuutspleYK9&(:Qfw��������������������������������qdZUYj|���������scQ>+!!*;Wo�����������������ƾ�����������������������Ŀ�����s^J8,*2BWk{����������������������º�����yvvy}���������|pbR@- %4DUcq}��������������|qcR?7;Jg��������������ſ���������������~|zxwvrkaRA-!#1DZn���������������������������������tg]UUbt�������scTD4$'9Vn�����������������û������������������������ſ����zfQ>-&*6G\o|�������������������¿������}yx{������������p^K6$
!.<IXep|������������ym_N<6;Lh���������������Ŀ����������������}{zxuneWF2&#)9Lbv����������������������������������vj^UR[kz�����zm^OA4(&8Sm��������������������������������������������ż����lVB-$"+:M`oy��������������������������}}���������������kWA,  '2>KXeq{���������|thZH85;Mh���������������������������������~{zwqh[J6*'->Rh|����������������������������������xmaVPU`nz��}reXJ=3+#%5Oi����������������Ļ��������������������������������oYB- !-=P_jqv{������������������������������������Ž���{eM6# 
)3?KYeow|���~{vmaRB53;Oh~����������������������������������~zul_N9-)0AUl�����������������������������������{qeZQQW`ioogZNB90,'$!$2Ic}��������������ǿ����������������������������ĸ���oYB+!/?LV^djqx~�����������������������������������ô��tZB+  )4@LXbinqstspkbWI:02=Rj}�����������������������Ŀ�����������~ypcR=/+0AWn�����������������������������������~vk`WQPTX[ZRF=51-,-,+'$&/AZt��������������ļ����������������������������Ÿ���mV>'+7@HMU]elsy~���������������������������������ð��fM3 !*5@KTZ_bcc`\TI=1-2?Vl~�������������������������»����������}tgVA2,0?Vm��������������������¿��������������{rh]SLIHHG@72/0269;93-*-;Oj��������������������������������������������ö��hQ9# #)/4<ENV_gmsx~������������������������������ϼ��pU:"
 "+3;BHMNNMIB:0)*2CZo���������������������������»����������yl\G6.0=Rk�������������������������������������yodWKB<873/029?EIKHA7/-5E]y������������ƾ����������~�����������������Ⱦ���zbJ2
 !&.5=FOW_gnty}����������������������������ư�y\?&   &+/35530,'" &3F^r���������������������������������������~rbN:00;Ph~������������������¿����������������}uiZL?610.05<EMSWXTL@601=Ql������������ù������{�z����������������������r[C+ "(/7@IS[djpuy|������������������������η�aD)   #$$" $4I`r����������������������������������������wgT@209Me|������������������������������������vjYI<3/028@ISZ_cc_WK>517F^z����������Ǿ������xsozvs~���������������û����jQ9$  %,4>GPYagntx}�����������������������Ӽ��gI- #5J_o~����������������������������ſ���������{lYD518Ldx������������������������������������}sfVG<659?HQZchkllh`TG<44>Rl����������������qf`\lll|��������������������vaH1 #+3<FNW`how}��������������������������kM2  "3FXix�����������������������������ļ��������o]H718I`t������������������������������������xm`RF?>@HP[ckqtutrmg]QD95:H_{��������º����m]PJH]ei|������������ÿ������mX@* 
")08BMXbmv|����������������������©�oR7"   ""!-=M]m}���������������������������������������raJ826F[m{���������������������������������xocXOHGKR[eov{~}zwsldYL@88@Sk������þ�����nYH<88R_f}�����������Ŀ������xeP8#   &.8DQ^jt~���������������������Ĭ�tY?)"%&((()+,/11/+& %/>L^q�����������������������������ƾ��������vdN924ATcouwvuuuuwwxxxxvwvvvwx{~����������~vlbYRNNS\gr|�������|wqi`TH>9;G\t�����������n\G6,*,IZe~�����������ü������p]H0 $(**(%!'1=LYfr���������������������ì�w^D. (.48;<==>>?@BB?;50)# "'1=Nbt�����������������������������¼�������yhR<21:JV^a`]ZXWXYZZZZZYYXXXY[`flt|������{ri`WQORYcp|����������{ung\QE<9?Nc{���������~n\J7)$BVc~������������������yjV@*
",49<<:51+%  +8ETcs�����������������������yaI2#$/7>DHJJKLLMMOOONJE@92.)%##(1@Tgx����������������������������ſ�������}mV@3.3>FKKGC@>>>?@@@@???>>??AEKS\hrz�~vndZSNNR[gv������������yslcYMA::BSi�������|kYH9(>R_}����������ž������tcO9% 
$/:AGJJIEA<5.' %2@Pbu������������������Ѿ��xaK5'!$-;CKQTVVWXXYYZ[ZYVSOJE@92*%$)4FXk{����������������������������û�������r\E5+*1576421113455665433211137=FR^gnpnf]UMJKPZhx��������������}wpi`UI>7:FXn������ziWF7,!:N[z�����������������}n]I3
 %1=GOTVVVTPKF>6+ 
!-<Od{�����������������̹��u_I5($)5DNV[^``abcdeedeca^\YUPJB6,&&,9HYk|���������������������������ƾ�������wcK6)##%&'')+-034666554320.,+++/5?IRY\ZRKFCFMYhy����������������{ung]PC85;I\n~���ufUE8-&9JUs���������ļ������xiXB,
&3?KTZ^```^]YTLD9, 
 ,=Qk�����������������ı��pZE3((.=LV_ceghilmnooonlkihec_XOB4+''.9GXk~��������������������������ǿ�������{iQ:) %+16<@CEEEDCB?>;850-*)+06=CED?<<@IVfx�����������������~xrkcXI<44<L]lssmaRC7.)'$!7ELk��������¼�������teQ;((4BMW_cghiihgd_XPF:,  /B[u���������������˼��hS?/(,5ET^fjlmoquwyzzzxvtrqonjd\OA5-)+0:HZn�����������������������������������mU=)",6@HPUZ\\\[YVTROJF@:3.*)(+-0103:CRdv�������������������zvph]PA4/2=KY__XMA60--11/*$ 7ADa|���������������|n^J5$ *6CPZbgkmooppolhc\RF7)  %7Qi~������������������w`L9-)/<M\flpsux|�������~{yxvsng\OB81.,1;J]s����������������������������������mV>)*8FS]fmqtutspmjgc^XRJB91*$! "%(0=L_t��������������������}xslcVF8-+0:EJID<4//16<><6.%8?>Xr���������������vgVB0"%/:FR]ekoqrstuutrojd[PB3# /Hau������������Ǿ����mXD4,,6EVcmsvy}�������������|zvqh]SI@71/2>Pe{���������������������������������|jS;((7IYht}��������~{vqle]TI>1% )5FYn���������������������yuog[M<-'',3773/./4:BIKIB7,9>8Ofz�������������}o_M:+#!$+4@KV_gmrsuvwxyzzwuqldXK;* (@Xl{����������������taM;/+0=O_kty}������������������}yrjbYOE91/6DZq������������������������Ⱦ�������xfN7&'5G[l{��������������}woeYK;*".>Rg{�����������¿���������|wrj_QA.##&(),06?GOUWUMB4=>3FZn������������ufTC4*&*2<GR[dkquwxyzz|}~~}{wqj_RC0

#8Nbpz��������������tdR@2*+5EXfrz���������������������ztnf]QD7/1<Oh|�����������������������Ƽ�������r^F2%"'3DYl}�����������������}seVC."(6I^r�����������������������}xskaTC/""(/8BMV]ab^XK<B>.;L_q����������ylZI:/*-5AKWaiquz|}}}}}~�����}xpfYI7%-BUcmrv{���������{oaQB4*'-;M_mx����������������������{vof[M>1/7G`t�����������������������¸������|jU>.&'2BUi{�������������������~p^K4'!$1BUi|�����������������������~yslbVF/ #.9FR]dillhaUDG?+3?Obr}��������|p`N>3-.5AOZdnu|��������������wmaQ?-  #4FT\adgkpvz||ytldXL>2($&1BUft}��������������Ľ��������~ztlbRB3.1?Viy���������������������ż�������vbM9,)0>Pdw���������������������weQ9+',;M`r�������������������������ztlcWF/ *9GVblrvvuqj^MMC+.5BTcpy�����}sdSC6//6AO\hrz������������������uiZI7(  '7CJNQRUY^abb^YSK?4+#&4I]my����������������ǿ��������|wpeVE3+-7K\jt{�����������������ſ�������nZD3+-9K^p����������������������{iT;.+0ATfw�������������������������{uncWG0 %5FWfry~��~zrgUTG,*,5DS`jrw{~}yrgWG:116AN]it~��������������������~reUD5(  %/479:=BEHHGB=81*"'9Ocs}�����������������Ǽ�������}xpeWE2)(.?LYbgklnooqty�������������������xfP</,3CWjz�����������¿���������~jU</-3EXjz�����������������þ������}uncWG0!-ASdr}������zo]ZN1*'*4ANYahlpokdYI<317AO]kw�����������������������|pbRD5(  #')**,.0110-*&!)=Uhw�������������������Ĺ������}wodTB/%!$/9BINQRSSTUY^gr~���������������p]F5-.:Nbs�����������������������lW>1-3EYjz�������������������������~vndWG0!"3I]n|��������ueaW9/&$'/8AIQW[\YSI=526AO_mz�������������������������zn`QB4%
"####$%%%$",AXk{�������������������ɾ������{ulaQ>+ ")047:;;;;=?CKVbp~�������������wgS>0,2BWjz������������������������mX?1,2BWix������������������Ľ������xodWF0!$7Ncu���������|liaD7*"!%*06<@BA=9215>M^n|���������������������������wk^O?0 
 $&%$#####! ".BXl{���������������������������zqh[K9(#(+./11100138?IUcp}���������wk[G5++5I_q�������������������������oZB2,0>Tfu������������������ž������ypeWF0!%7Pfx����������rqiM@0$!%)+,,--2<J\l{����������������������������sgZJ9( )/10.-+*))('&&'&$"!"'1AViy��������������������������vmaRB2$$(,./00/..,,-16>IVcpz�����}vof[L:,&+7Oew�������������������������q]F4-/<Qds������������������ž������yqeXG0!#5Nfx����������wwoUI8($)0:HYj{����������������������ƿ������znaRA.)4;???=<;:9988999740/05ARfv�������������������̿�����|rgXH8* "(.368:;;:9641.-.07@LXdmtuupibZRG9,#")9Si{�������������������������saK8./9N`q~�����������������ž������yqgYG0! 2Kdw����������z{t\QA0 
",8GWiz������������������������Ƽ�����}rfWG3#&4@INOONMMMMMMMMMLJF@<:;AN`r�������������������Ƚ�����zn_O>0&!"(08?DHJLMMLJGC=83/,-29CMV]_]XOG?8/&(;Wm~�������������������������veP</.6I\m|�����������������ļ�����yqgZH1!/Hbu����������{}wbXJ8(  '7GWhx��������������������������������ui[K9)!!&2@MV[^__^^^]]]]]]\YUOIDACLZn~������������������ù�����tgVC4)$%+4@IPUY[\]]\[XUOHA92.,.38@FGE@70*#(<Yo��������������������������yiU@2.4DXix�����������������ü�����~yqh[I2!-E`s����������{yf_RB1!  !1CUfv���������������������������÷����uj^N=.)+2>MYbgklmnooonnnmmkid^VOIGKVhy�����������������ǽ�����}o_M:-&&-8DPY`dhijkkkihe`YQH>61,++-//-(" (=[q�����������������¾�������|lZE5.2@Seu�����������������º�����~ysi\K4",C\o~���������yzjdZL<+
 );Pbr����������������������������ĸ����~uj^PA527@L[fnswz|~����~}|yvqjbZRLKRbu����������������ɿ������xhWD3)(-8FS_hnrtuvwwvusqmhaYOF<4,'# 
 '=[q��������������������������~q`K9//:L`p}�����������������������~ytk^M7$)@Yk{��������}w}zliaUF5# #5I^n~����������������������������ö����|si^PD:;CNZhrz���������������}vne\SMP^n�����������������������~p`M<.),6FVcov{~�����}|yvrnh`WLA4)   &<[q����������������¾���������ufQ>1.5DXjx����������������¹�����zum`P9%'<Tfv�������}zt}zmle\N=),BVjz�����������������������������´����{qg\OE>CNZfs|������������������xoe[SQZhz����������������������whXE4,,5CUfs}������������}{wsme\PA2# 
%;Yo���������������������������zkXE5.1=Rcs���������������ļ�����zvncS<'#6K]my�����~{xs|{nniaTD0!4L`s�����������������������������ʿ�����zpdYMDCKXeq|��������������������xmbXRU_p������������ǿ�������}o_M<0-2@Sfw���������������~{wri^O=)
#8Ul~��������������������������~p_K7..7IZjw���������������ƽ�����{wodT?*/CTdpx}��~|ywr{{noldYI5#%;Sh{�����������������������������ȼ�����ynbVKEHRanz���������������������~ti^VTXfy����������Ľ��������ufTD5.1;Ncx�������������������~ztj[H1 4Ofy�������������¾�����������scO:-)0?O_nz����������������������|wpfWB+%5FUblsxzzyxvr{{oqmg\M7%)@Yn�����������������������������ĸ�����xlaUIFMZiv��������������ǿ�������{qf\VV^n��������ÿ���������yl\J:0/7G]t����������������������|rdQ9$ .G^r��������������������������scO:*$'2AP_my��������������ĸ�����|yqgXC-'4CP[dlqtuvvr||qrnh^O:&,D]r�����������������������������ʿ������wk`UJISap~���������������ȿ������~vlaXTXcw�����������������~rdQ@3/3@Vm������������������������xkX?(  &=Shz�������������������������{o_L6&%0>L[jw�������������Ź�����~yqgXD. #0<HR\eknqsq|{rspj^O:& /F`t�����������������������������Ż�����~vj_TKLYgv�����������������ƺ������zqg]WV\l�����������������wjYG8/0:Lc{����������ȿ������������|n\B) 1F\q������������������������seUD1"$.:GVfw������������Ź�����~xpeUB,

(2=IS\cimmzzqspj^M8%!1Icv����������������������������ɿ������|tj_TKO]l{�����������������ʾ������}ulbZVXdv���������������{o`N>1.4BXp������������Ⱦ�����������|p^D+  &9Oey�����������������������vhXH8)"*5BRdx�����������·�����}vl_O<( !*4?JT\cfvumqogZJ4#!2Lcv����������������������������ź������zrh^SLRap���������������������������ypg^XV]l��������������}tgVD6.0;Nd|�������������Ĺ����������{p^D+
-BXp����������������������wjYH:.$ '1?Rf{���������Ľ������zreWE3!
 "*4=HRYmmgliaSC/"4New�����������������������������������~xpg^TNUfu�������������������õ������|tlc[VXdw������������}uj[K:/,3DXo��������������ɽ����������yn]C+  %6Ldy��������������������{n]K<0($#$$$# %0?Sj���������������vk\K9(
"+5@Jb`\b_WI8'#5Ofx���������������������������ǽ������}wpg^TOYjy�������������������÷������xpg^VT\n|����������}vl_O?2+-8Lax��������������˿���������}wk[B+ -AYp�������������������~rcQ?2+)+/254/("%0BXn���������������{pcR?-

#.7RSLSQI<,"5Qgy���������������������������ƺ������{vog^TQ\m|�������������������÷�������{tj_UOTboz��������}wmaRB4+)0?Tj���������������µ�������~ztiYA+"$$!(7Nez������������������whWE6-,07>DFD>5+#&3F[o�������������~thYF3" 
(CB;A?8,"6Qhy���������������������������Ĺ�����~zune^TR^p��������������������÷�������}vk_RHJU`jry}����|vnaSC5,),6H^r����������������ö������}yqgW@+$+1431-)%# %0BXn�����������������|n]K;1.2;FOUWTND8,# (5GYm}�����������yn`N:( 50%+)$
"6Shz���������������������������ķ�����}yune]TSas�����������������������������vj\J><CMV^flqtvuskbSE7-)+2?Rfy����������������ö������~{xodT=+"$+2:ADDB?;72,''+8J_t����������������tdQ@4/3=KXahif_TG8-%!"*6DVhx���������{rfWD/  '$  "6Sj|���������������������������Ķ�����}ytme]TUcu�����������������������������viWC5.06=DLS[adec]SD7.)+2=K^o�����������������Ÿ������}zvmaP:,&&/8@HOQQPNKF@91+*1>Qdw��������������zkXE813=L\ku{|yqfYH;/'$%+4BRcq}������|tj^M9& 

   "6Rj|���������������������������õ�����}xtme]TVfw�����������������������������ufT=-%$',17=DKPQOI@5,(*3?L[kz�����������������Ÿ������}zsj]K8,(,8DLTY\\[ZXUNF=3-.5BSfw�������������sbN=54<K]o}�����wk[L?3+'&*2>M\isz~~|xrj_R@-    4Oh{����������������������������������|xtld]TXiz�����������������������������~rbN7(#'+/47::84-'$&/>N\kx������������������ƹ������}yqgXG4,+2@LU]aeeffeb]UJ?4007CSdu�����������yjWE85:H[p��������{m^PC7/(&(.9ES^gmookf^SD3#  #''# 0Kcx��������������������������Ϳ������}xtkc\TZl|�����������������������������zm\G1$#')+-..,($'7J\kx�������������������Ȼ������}wnbS@1,/9HT]dhknpqqplf[NA6017BQcs���������}p^L=69DWm����������|n`RF;0(#$)1<HRY]]\WOD6'  $,3783-#
 +D\r��������������������������ʽ������}xskbZT[n~��������������������·�������vfT@-" %,0110.+%)>Uhv��������������������ʽ������|tj\K:/-3AP\ejnquy|}~|vmaRD9217AQbs��������tdRB87@Pf}�����������zl_SG:.$")1:BGIHE>5)
 !)2:AEEA:/"
%:Ri{�������������������������ƹ������~yskaYU\p���������������������ø������}o^J8)"")2:?AA=70',C\p��������������������Ϳ������{reVC5./:IXdlquy}������teUF9205@Pcu������whXF:7<K_v�������������wj^RF7*&,0332-($+18@GMPPLE:. /F]p~�����������������������ɿ�������~yri_WT^r���������������������ĺ������wgS@0'%+4@KQSTPH>2".Hcv�����������������������������ym_O=0-3ARamuy}����������whVE81/5ASgv����wiZK=79EXn��������������sg[OA1"#'((&" %+28>DINSVXWTMC7)  $7Nbr�������������������������������zrh^UVbu���������������������ź�����~o\H7,'+4AOZacd`WK<( 1Lgz����������������������Ķ�����uiXG7./8I[iu~�������������xgUC6//6DWiw}|thXJ>76?Qg}���������������{ncWH7'"$&&%$#$&).4;BINSWY]_`_^YSJ>0!*=Qbr~������������������������������zqh]UYgy���������������������ĺ�����wdP>0+,3@O]gnpqlcVD."4Oi}����������������������ŷ����}qbP?2-2?Rds���������������wdRA4.09HYgmjbUG<64;H^t����������ž�����vk^P?-%),.0248<AGNU\bgjlmmljgc_XPD7& +=N`p|�����������������������������~xof\V]l}���������������������ù����mXD5--3?N^jsy{zvl^K5#%7Sl�����������������������Ƿ����{m[H8..8G[n~�����������������q^L<0,0:FTYUND:55:EWl������������ù����~rfWF4$(07;>AEJNU[bjqw|����|wqkd]TI<+
,;M_ny����������������������������{ulcZV_p����������������������������vaL;0/4?N]kv~���}teQ:')<Wo�����������������������ȸ����yiWB4.2ARgy������������ž����{hVE5,).6@DA<745:ETg{������������ɿ�����zl^M;*'4=DIMQV[bjs|�����������}uldYN@/! +;L]kw�������������������������{vof^VUbt���������������������Ⱦ����kUB505?N^lx������yjV>+!",@\r�����������������������ȹ����xgS>307J^r��������������¹����p_M<.%%(.11116<GUev��������������ƻ����rcS@.!&2?IPVZ^emv����������������vk_RD2"
+:JZfqy~���������������������|xsme]VQRbv���������������������ĺ����t_K:23>M^n{�������~p\C0&&0E`v�����������������������ɻ����vdO;11=Rg{��������������ź����ueUD2% $(,4>IWfu����������������¶����vhWD0% #.<HSZ_djs}�����������¼�����teVF5#
!,9GT`iqvz|~~�������������{upje^XPKHNav��������������������������|hS@53;J\n}���������t_F3)*5Key�����������������������ʼ����ubL814BYn���������������Ĺ����xiZI6%&1=KYhu�����������������Ƚ����zl[H3(%)6DP[bgnv���������������ĸ���}l[J8 $ $-6ALV_hmruxz{|��������}vog_XRKD=<=G]s��������������������Ƚ����p[G848EXl}����������wbI5+-9Oh{�����������������������̾����t_J715F_t���������������·����yl]M9',;K[jw�������������������´���}m]J5)'-<JW`inw�����������������Ȼ���s_M9!%  !! "#',2:BKU]djoruwz|~����}xqg\PF?83.*,1?Wo��������������������ĸ���ybN>56AQg{�����������ydL6/1>Vl~�����������������������������s^G627Jcy���������������������ym_O=)$4GYiv��������������������Ƹ����p_L6,*0@N[elt}������������������Ƿ��zeP<"% $+/244420/,+*,/4:CKS\bgkoruxz{{wrkaTG;1*$  )8Qk}������������������ɿ����lUC75=M`v������������yeL814C[p�������������������������´���q[D529Mf|��������������ɽ�����ymaSA." +>Tgv���������������������ǹ����r`M7-+2CR^hpx��������������������¯��iS>#% (4<AEGGGEC?;62.-./4:AIRW]aeiknnmibYN@3( "2Lfy������������������ĸ���w_I;6:H[p�������������ycK827G^s�������������������������ô���nV@21:Pi~��������������ƻ�����yncWF4'"%1F]p~���������������������ǹ����sbM8.,3DS`ir{��������������������ʷ��nV?$&&4@IOSVWWVSQLF@940--.27=CHOTWZ]\YTLC8,! .E_t�����������������ƾ����kSA78CTj~�������������wbJ828Jau�������������������������ĵ���jR<11;Qj��������������Ż�����zpfZL;.')4Iau����������������������ķ����ucO:/-4ET`ks~��������������������м��rYA%'  0?KU\_bdddca]WPHA:3.*()+.16;>ACB?;4-% )?Wl|���������������������x_J<8?Ocx��������������t_H728Kbu�������������������������ô��}hO901>Um���������������ƻ�����|sj`TD6,,5H`t����������������������������veQ<0-4CSamu�������������������������u\D'((9IU_fiknooonje_WPH@7.'"  "%')**(%! &7Nbs���������������������mUC:<H\q���������������q]G628Kbu�������������������������²��zdK814CZq���������������Ǽ�����vnf[M?2.4D[p���������������������ź�����whU@2-3AQamw����������������������¬�x^F() !1CQ]gnqtvwxyxuqkd]VNC7,"$0BVgv�������������������ybM?;CTi}���������������o\F617Jat������������������������;���waH728Iav���������������ɿ������xrkaUG7/1=Rgy�������������������Ƚ������zlZE5-0<M_mz����������������������¬�y_F() *;M[fntx{}~�}zuoibZOC4' #'*-,'#$*7HZkw�����������������nXF>@M`v����������������o\F617G^q������������������������Ȼ���s]E63;Ogz�����������������������{vph]N<1.5FZn~�����������������ƾ�������~o_J8..7H\l{���������������������ѿ��x^E'(#3FWcov|���������~xsme[N?/  
"',048<<93+&'/<K\jt|���������������vbOA?HYo�����������������o^I715CZn~�����������������������ö���oYB66@Vm�����������������¸�����~yumdUB2+-8J^o}�������������������������sbM:.+2BWj{���������������������˹��tZA%'.?Qamv������������{uncWH8' (2:?DGJKJE>3*')1>M[grz�������������}hVF?CQe{�����������������qaM912>Shy����������������������Ƚ����lU@67D\r�����������������ø������{xsj[H5)&-9K\ly������������������������rbN9+'-=Rgz���������������������ñ��nS: $
#7J\iu}��������������{sj^P@.
(5BJOSVWWUPG;0(&)2>KXdoy������������oZJ??I[q������������������ueR=109Mat���������������������������{hR=68H`v�����������������ø������~|wn`M7' !)7GVcoy����������������������{m]H4&"'5Kau��������������������Ǹ��~fJ3  )@Sdq|����������������wncUF4  %4BNV\_bbb^YPD9-&%(0:FS`my����������v`M@;BQf|������������������yjWA2/5FZn}��������������������ĺ����ydO<6:Lez��������������������������~yqcO8&$0<IVbmw�������������������}qcQ>+  -CYn�������������������ź���v^B, /GYjw�����������������|qgZJ8$  !/?MYafikkifaZOC6-'%'-5AO^my��������}jUC::GZq�������������������}nZC2,/>Rev�������������������Ž�����vbM;6<Oh}����������������º��������~zqcO7$&0;GS_my����������������{qcSC1!%8Ndy����������������ƾ�����nW;&!3L_o|����������ľ�����tj]N<( ,<KXcjnqrqokgaXNA5-'%&+3>N^my�������s^J;6=Oez�������������������~oZB/'(4FZl|�����������������ý������tbL:6=Qj~��������������������������}xn_K3 
&/:FUbnx�����������|ul`P?1",@Vj}������������ſ�������{hR7#%9Rdt�������������¸����wm`R?*
 )8HWbkquvwusnkf`WMA7.)&%*2>M\jv�����zhS@56AUl��������������������~nW>*! (8L`q���������������¾��������saK:7=Qj~�������������������������zshXD- 
'2>KXckptwy{{{zxuqldYL<-!  !2EXjz��������������������vdM2 *?Xjy�������������������}rdVC. '6GUbkrwzzzwurokg`XOE<4,'&(1<IXeq{��zo]I927F[r��������������������ziQ8%+<Pdt������������������������q`J97=Qj~������������������������{tk^N:& ",6AKSX\`begggfb_XOC7*  #2BQ`p~�����������������q`H0 "1G_p��������������ɼ����wiZI4"%4DTakrx|}}}{wvsplhaZRI?6-(&(.8CP]iprncRA42:Lbv�������������������raI1-@Tgw����������������������p_J96=Qj}������������������������{ul`QB0 
!(/6:>@CFIKLMKHD>6.$  !-8DR_mx���������������zm\D, &";Rhw�����������������zm^M8&!0AR`ksy}��~|ywuqlgb[SKA8/)&(,3=IU^b_VG914@Ti{������������������|tgV?)  0CVhx���������������������}o^H96<Pi|����������������������zsj]OA4&!$(+----.//111/-($

%.9DNXbktz���������|thW?) -,D[o~����������������Ⱥ���rbR=* +<N^jsz~������}{yuqmhb\ULC:1*'')/7BJONG;208H]q����������������{vrldWG2   !2CXjy��������������������|n]G75;Ogz���������������������~xqh\NA4+# "$%&'''()***(&#  &-4=EOX`hnrvxyyxxwrk_O9%#45Odw�����������������˽����ueUA.#"'6GYgrz����������~zvsmhd^WOF=4.)''+17;;70-1?Qgx��������������{sld^WNC5%  #3FZjy�������������������{l\G739Mdw��������������������{uneYM@5-)&&',048;<===><;962-(!"'-4=EOX_eikllljf_TF2"(<?Ym}�����������������������xhWC0'&/@Rboy�������������~ztokeaZRIA92+'&')*+(&)3F\r��������������wlaULD=5-#  $4FYjx������������������yk[F527Ias������������������|vph`UI?60./15;BINRTVWWWVUROIC;3( "&),,,*(&#!!'/7AJQV[\\\ZWPH;*-DIar������������������������{iXD1)*5HZjv~����������������~ysoje]UMD<3,'#!&5Kdy������������{pdWJ?6/)% $4EWhu�����������������xkZE4/4E[n~���������������ztmf_WND;5238?FMT\bgjmnmmkjhea[SJ>0" !&,28=ABB@>;84/+&" $+39>BCCCB?:4*3NRhx������������������������|jYD2,.:N`p{�������������������~ytng_XPH>6.& %5Og|����������|rg\OB6-%! $2CTdq}���������������xjZD2-0?Sfx�������������zriaXPJC<7347>HT^fnv{������~|xupjbVJ:( )29AHNRVVVUSQNJD@:50+&! %(*+++*)&";VZn|������������������˾����}kYD3-0?Tfu����������������������~wqib[SJB7-#"3Mdw��������{qfZND:0)" "0?O^lx��������������viXB/(*6H\n{����������{si]SJB=95325;DP^jv�������������|ul`RA.&1<FNV]aeijjiheb^XSNIC>71*#$C_bs������������������ɼ����}jXC3.3CYjz������������������������yqjd]UMB7,-EYkx����~woeYMC;3-'#  "$$#   +9HXfs~�����������~teT>+""+;M`nw|~}}zvmbUI@9533349@KXfu�����������������}sgWD1#(4AMX`hnrvy|}|{yvrlga\VQIC;3+#$.Lhix�������������������Ÿ����zhVB2.4F\o����������������¾��������yrkd^VLA5&#6GVbimnkf^UKB:3.+)(&'(*-0332/)"  &3AP_n{����������zo`O9'!.?P]ejmnmmmmje\PD:41136:@HTao~�������������������xiYE1%!&2AO\gow}����������ztnhb\UMD<3*"
 &1;Xrq~�������������������������wfTA1/6I`t������������������Ľ������xqjd]TI=,%1=FMPPOKD>83/,,-.1358<?BDDC?91)"
 !,:JZiw��������zrfWG2!!.=HPTWXXXXYWRI>5/.17>EMU_ly������������ƿ�������zlZE1(%,;L[gs{����������������ysmf_XOF<2)!  #+4@Je{y�������������������ɾ�����ueR?107Ldx�������������������ƿ������|uoibZOB0 !*269:9741/..049=?DFILOQRRQMHA92*!  '5DUery~��~zuneZK;) (/489:;<>@?<60,-2;FQ[emx�����������������������|mZE3))3EUcp{�������������������}wpibYPE;1&   )3=FQZp��������������������ź�����rbO<00:Pg|��������������������Ƽ�����wqlf^SF3! !',/010//147;AGKORTVYZ[\\ZWRNG@9/# 
$1AQ^gmoomje^UJ<.  !#$$&&'))(&%(0<IXepy������������������ɾ�����o\F3+-9K[iv����������������������yrkbYNC7)
,8DNV_fz���������������������������o_L902=Tk�����������������������������zsoh`UH5" ")-13456:?DHMRVZ\^_``aaaa_]ZUQKD9,  !.=JSXZZYVRKC:-" "+9JZkw���������������������Ĺ�����p]F4.0=P`n{������������������������xqi_TG8)$5CPZbio��������������������»�����}m\I703AYp����������������������ź�����{upjbVH5##-5:>ACEHLRW[_befgggfeeedcb_^[XSKA3"   +6=ABA?>:5/(  
#1DWjz����������������������ʾ�����r_H6/2@Scr~��������������������������~wodXH7()<KXbjqu��������������������»������ziWD406F^t����������������������Ǿ�����~wrlcWH6$)5AKSWZ\^adhlorttsrpmkihfeca`_][WPF7%  '-12210-*& 
 (:Pdu������������������������·����u`I603BVft����������������¾�����������|sgWF5$,@O]gnvy����������������������������veS@31:Mdx����������������������ȿ������yslbVF4%#.<M[gotwxxz|~������}zuqnjgdba`_^]ZSI:' #(+,,,+*'$  
0E\p�������������������������ź����vbJ824EXhw�����������������¾�����������~rcR?+ "/CS`jry{�����������������½���������tcP<34?Tk~������������������������������zsk`RA1%!&1@Ret������������������ysnjfb`___^ZSI:'  #(-012210-,)&#   '<Shz�������������������������Ǽ����wcK836F[k{�������������������������������zkZG1$ %1FVcnv|~���������������ſ����������rbN;47E\r������������������������¹�����zrh\L<-&'1@Sg{��������������������{tmida`__^[TH:' #'*.28<?BCDCB?=:742-("   2I_t��������������������������ǽ����wcK937G]n}��������������������������������q`M5(#'5IYfpw}��������������ľ�����������qbM;5:Kcx������������������������ú�����zpeVF6+(.<Ody����������������������{rkfbaa`^ZRF8&#+28=ADHNSUXXXWVSPMIEB>92*!  *>Uk~��������������������������ƽ����wcK937I^p���������������������������������vdP8*&+9M]iry~��������������Ŀ������������~p_K:6=Oh|������������������������ļ�����ymaP?1*+6I]s������������������������ypjedb`]WOB4%%-5?HOTY]aeikmmmligb_[WSNIB9/"
"5Lcw���������������������������Ļ����vbJ837I_q���������������������������������ygS;.+1?Samv{�����������������������������zl\H97?Tl�������������������������ż�����wj[H8-)/>Si������������������¹����~tmheb`[SI=0$ &.7?IRZbglpty}���|yupkgc]XQH=/  ,BYo����������������������������������uaJ837I_q���������������¾��������¾������|hT=1/6GZgry~����������������������������sdTA65?Vo�������������������������Ļ�����tfUA3*+5G^t��������������������Ĺ����xpjea]WMA5*$#)3?HQZcjqw|������������ytpke^UJ<,  %8Oez���������������������������Ǿ�����uaJ826H^q��������������ý����������ſ�����~iT>31:M`mv|�����������������������������wiYI914AYr�������������������������¹����~paP</*/=Qh}��������������������������{ske`YPE8.&$(2?LW`hov}����������������zuoi`VH8( 1E\q����������������������������ż�����taK926F\p���������������������������ž����jT>44?Sery�����������������������������xjZI;.*0A\s������������������������ƾ�����zl\K8-+4EZp����������������������ǹ���}tke]UJ<0'$'/<KXckry��������������������|wqjaTD4%*>Ti}�������������ÿ�������������ú�����uaL925D[o����������������������������º����jS=56BXiu|����������������������������ylZH8+##-?]t�������������������������������ufUE3,-9Mbw����������������������˽����ume[RF6+$$+7FUblt{����������������������~ysj_P@0 $5K`u�������������þ��������������ú�����udN;24AXm��������������¼������������Ž����jR<58F[kw}���������������������������~raK8)+?]t�����������������������º�����{m]L<.*/>Th|����������������������������uldZOB2'$&2@O^jt|���������������û��������zrh[K:) -@Wl~�����������������������������ú�����wfR>34?Ul����������������������������Ǿ���iO;58G[juz|~�������������������������wiU>+(>\q�����������������������������rbQ@2))2DZm����������������������������vlcXM@/'%*8HWeqy�����������������Ž��������yocTC0$!'5J`t������������������������������ĺ�����zjWB65?Ul����������������������������Ǿ���|eL936EXdnqrtuv�{v}������������������zm]H2 %:Xn�����������������������������uhWE5*%)6I^q������������������������²���vlcXL>.''.?O^lw�������������������ƽ��������vj[K7*&+:Pfy������������������������������ĺ�����}l[F86>Tm����������������������������Ļ���x`F5/2@PZadcdfgwgbkoruvxy{��������wm`O;& !6Sj|������������������Ž�������vk]L;,#"*9Mar�����������������������������wlbWJ;-')3ETdq~��������������������ƾ�������{oaQ>/*.=Sh|��������������ý��������������¹�����o]H97?Tn���������������������������������qY@0*,8DKOOMMOObPITY]`bcehmsw|~zune[N>, 0Kbw�����������������Ļ������{ri^P@/#):Nbr�����������������������������wlaTG9,',7J[jw����������������������ƽ�������ufVC3,/=Si|�����������������������������ȿ������p_J:8?Uo��������������������������������hP8)"#+36875566J>3<@DEGILPV]cimmid^UMC8+  (@Xp��������������ž������xqjcZOC2$'8Laq�����������������������˿����wk^PB4)(/=Paq�����������������������ƽ������yk[H7./:Ofz�����������������������������ļ������o^I:7?Uo�������������������������þ�����t\E/ #%&&%%&$93%,/12346:>EKQTTPKD;3,#  !7Ngy�������������������uld^XRKB6'"3G\m}����������������������Ƚ����wj\K</()3CWhx�������������������������ĺ�����|paO=1/7Iav����������������������������ƿ�������{kZE76?Un�������������������������������~hO9$/1!&((())*,/269;:61,%
/F`s������������������qeZRLGC>82),?Uhy����������������������ź����vgWF6+&+8K^p���������������������������������tfTC3/5E\r������������������������������������rcR?45?Un����������������������ž�������r[B- !/7&(('''''()*+++($
 (>Xl}��������������sdWKB<742.)% '9Pev����������������������·����tdTA1'&.>Sfx���������������������������·�����xjZG6/2@Xn���������������������������ü�������tfVG7/2>Vn������������������������������zfN6#
!%(*+'8F3420///.-,*(&$  "5Nct�����������~wndXLB:41/-+)%""3K`s���������������������ǿ�����scQ>.'(3F[o����������������������������Ÿ�����zm^K9/0;Qi~�������������������������ƿ������rfVF9-)/>Wn���������������������ƽ�������oZB,
%/7;>>:HSA@=;;;;:9740+%
,BWiv}���~zvsnib[SJB:520//.-+(%! .E[n���������������������Ž�����sbP<-(+9Ndx����������������������������Ź�����|qaO=0/7Kdz��������������������������������}paSC6,$#,>Wm��������������������ù������ucM6# (6CKQRRLW^MKHFFGHHGEB>7/%
 "5HZgottsojd^WPIC=853458:;;:741-*% +?Wiz��������������������ļ�����rbP<-)/?Vl�����������������������������Ƹ�����}sdS?1.3E]t�������������������������������|n_N@4)" ):Si{�������������������ǽ������yhT?,*8HU^bcb[dhWUQQRSUVVTQLD;0"(9JW_cca]VOIB<853469=DIKNNLJGD@;60(! (9Par��������������������º�����rbP<.,1D]t�����������������������������Ÿ�����tfVB2+0?Wo������������������������������}n^N?3*#'6Mcv�������������������·�����|m[G4%"-<K[goqpnfmp_]\\]`cdeda[TI<,  *9CKOOMHB<741125;@HOW\^^]\YVSOKE=4)" &4HYiy�������������������ù�����rbP=/-5Ic{�����������������������������Ź������wiYE3+-:Qj~����������������������������o^L>2+'$" !&2F[o�����������������Ż�����p`M;+ (4AQ`nw~~|wouvfeegjnrtvupkcWI9*  &.4787620/026<DMV^flopolieb_\VPH=1&"%/ATbq~������������������ú����qaO</.8Mi������������������������������Ÿ������yl[G4+,6Ley����������������������������r`N>3,*+,,*&'/>Qfx����������������ļ������scQ?0&""'0<JYiv������w|}mnosw}�����{qfVF6)  !'*,-,-.16=GQ\gpy~���}xtokhd_YPE8,%$,=O]kx������������������Ż����}n_N;//9Pm������������������������������Ÿ������yl[G3((2E]q���������������������������vfRA5-,.4885.*,6F[o~�������������¿�������vfUD5+'(/8ETcs��������~��uvy��������sdTD5(  !%)+.16>GS_kx���������}wsokf^WL?1'&*9JYgu������������������ƻ����{m]K:/0:Sq������������������������������Ź������xjYC/%#+=Thx�������������������������xiWE6.,08@FFA8/,1=Pfv���������������������xhXF9/+-5AN\l{������������{~�����������qbSD5(  %*.38?FQ]jw�������������zuojd\QD7*&*7IXfs������������������ƻ����zl]K:/0;Sr������������������������������Ź������vgU?+!$4HZjv����������������������|thZI:0-19DMSTND7..6G]m|�������������������wiYI;1-08DRbq����������������������������}o`QB4'
 '19?EKS[fs����������������{uohaVI<-'*5HXgs������������������ƺ����zl\K:/0;Sr������������������������������Ĺ�����rcO9'(9HXepx}���������������{uqmhbXJ<2.19EQY__XN>2-1>Qct������������������vgXH<2/1:GVfv������������������������������xj\M?1$ )6BKRY_foy������������������{une[N@1*+4HXgt������������������Ź����xl]L:/.8Po������������������������������·�����{m\H3# ,7DQ\elrvz��������wmd\XTQME;2./8DQ]eihbVF7.-5DVhw���������������}reVH;303;IYix�������������������������ý�����rdVH;-  *9IU_gmry������������ƿ�������{tj_RD4++4GYhv������������������Ÿ����xl]M</-7Kk�����������������������������ʿ������ufS@- %,4>HPX^ciou{���}vmcVJB=9862-+-6CQ^hoqoj_P?2,.9H[lz�������������ym_RE:314=JZkz��������½�����������������ú����xk\OB4%  -;M]jt|�����������������¹������zpdWH7-,4FYjx������������������Ź����{n_O>0.5Hf�����������������������������ȼ�����{m]I8(  #&)+06<BGMT[bjnrspldXL?4,'%$%%&*3?O^irvxuofXG7-+1<M`r����������~sgYLA8316?M]n~���������½�����������������ǽ����|obUH9)  %1@Qcs����������������������������thZK9.-4FZkz������������������Ź����|qcSB4.4Eb�����������������������������÷�����tdR@0&#%)-/0.--/0359>EMUZ^^\WNB6*! '0=L\jsz|}zum`P@3,+3AShw���������{ocTH>8449CPaq�������������������������������������tfZM=.  !+7FWh{������������������������������vi[L;.-4F[l}������������������ƹ����}sgWF815E`����������������������������ɿ�����zkZH7,'*08>@@<8410/./14:@EIIFB9.$#.;K[ku|���~zsi[K<1+-7G\n}�������|n_QD;668>HUdt������������»������������������ú����yl_RD4%'2>L[m~������������������������ĺ�����viZL:.,3E[n������������������ƹ����vj\K<46E_����������������������������Ź����~q`M=0*,3>IPSSOID>951.,,-/1330,%
 ,;K\kw������zrfWG9/,0=Obs������}o^MA957<FP\ix�������������û������������������Ǿ����~qdXJ;,)6CP_o��������������������������Ǽ�����ufVH7,+2DZn������������������ƹ�����xm_N?57F_����������������������������������tfTA4++2>LXaefc_YSLF?82.,*))&# (9K\lx���������{qdTD6-,3ARes~���q`N@848@KYeq~��������������Ž�������������������·����wk^PA2#$2AP_n��������������������������Ƽ����qaPC3((/CZn�������������������ķ�����{pbP@68F_���������������������������Ⱦ����yk[I8.+0;JZfotvtqmhb[TKC;4/+'"

 3GZjx�����������|p`P?2+-5BTcpz}{sdRB746?M\jv�����������������¹������������������ƽ����~qdVF7'!!):JZjz���������������������������Ź����{kZI;,#$-@Xn�������������������¶�����}qbN>46D]~��������������������������ĺ���o^N?1+,6FWgs{����~{wqjcZQH?80)#  '<Qet�������������{l\J9/+-5BQ_jolcTD835=K[lz������������������Ǿ�������������������ù����wi[K;+$$-?Par���������������������������ɿ�����tdR>0#(;Tl������������������ɾ������~q_J9/2@Yz�������������������������ȿ����tcQA4,+1@Rcr~����������zrj`WLB91)  
+CYl{��������������xhVE6-*,4?KU[YQD923;GWgw��������������������ĺ������������������������|n_O?-&'/BTfw���������������������������ĺ����~o^J6'#5Oi�����������������ƻ������|n[E3*-;Tr�������������������������ú���}hTD6-*.9K^o}��������������zqf[QF<2' /H^q���������������tcRB6-*+19AGF@7218DScr������������������������������������������ƻ���qaP@.'(2EWiz��������������������������ȿ�����yiXE/ 1Kg~�����������������ø������zjV>-%&3Kh������������������������������pZF8.+-7EXk{������������������uj^SF8*!1Kas�����������������raQB6-)(*/330./5@O_mz����������������������ƻ������������������������scR@/()3GYk|���������������������������������teT?* .Gd{�������������������������veP7&*>Yt����������������������������ycL;0,-6CSgy���������������������vj\M=-"%4Mbt�����������������p`QC7-%""$'(+1<K[iu�����������������������ʿ�������������������Ȼ���vdR@/)+4J\n}�������������������������ƻ�����|o`P;& *C`x����������������Ǿ�������r_H01G`w���������������������������kT@3-.7ETew���������������ÿ������qbP>0&%*8Odu������������������}o`QC5( !'.8FUeq|��������������������������������������������̿���wdRA/)+7L_p~������������������������ɿ������viZI5" '?]t����������������Ż������|lW?)$6K`q}������������������������t\H7//6EUeu�������������������¼�����veRA601<Rfx�������������������|n^O?."!+5CR`my����������������������������������������������²��xeSB0)+7M`r������������������������¸�����{o`P?-
 %<Yp����������������¸������weM6" '7IWbjqv{�������������������zeO=2/6BTeu����������������������������ygUG?<DWj|�������������ž�����xjYH6&'4AP^ju������������������������˿��������������������ò��ygUB1)+6K_r�����������������������Ǽ������ufUD3" 
"8Tl~��������������Ž������p]E/ &2<DKRX`glqw}��������������nYD604@Pdu������������������������ƽ����|jZOHM]o����������������������raP=+##,<KZgr{�������������������������ȼ������������������������zhVD2)*3G\o~������������������������������yl[H7'  3Ney�������������Ŀ�������wfR;( %+15:?EKPU\clu~����������uaM<23=N`s��������������������������������}m_TUdt���������������º�����xgUB0''0CRbnx��������������������������÷������������������������zjWF3)'/@Vkz����������������������ź�����~qbO;* -F^r���������������������|m[H2# $')+.148<AHQ]jv��������yiTB529H[o�����������������������������Ļ���~n`_ky���������������û�����|kYF2)*4GXgt|�������������������������ƽ��������������������˼���yjXF4'$*8Ndu���������������������ɾ������vgVC/
 &;Rfw�������������������|o_M;+ !"$%&'('()*,.05<GSbq{�����ykZG926BTi{������������������������������ǽ���}lhr~���������������ü������n[H4+-6K\kw�������������������������ľ���������������������Ŷ���vgVE3% $1E[n{��������������������¶�����xk[J6$ /DXj{�����������������{m_O>1&! $)-02333320.,+*)('(-4@N^jrxyxri[L<43<Mbv��������������������������������ɽ���xrz����������������ü������p]J6-.7M^n{������������������������¾���������������������˾����rdSB0")<Rdr|������������������Ĺ�����zl]M;) "4GZn}���������������wj[M?3*%&*17<@BCCCCB?<:751-)&&)1<JV^dfc^UI<417FZn����������������������������������ƶ���z�����������������¼������r_J6-.9N`p}�����������������������������������������������µ���}n_N=,#3GXfpx}����������������������xl\M<,
 &6I^p}������������}pcUH<2,)*07?GKORSSSSRPMIGD?82+&$&,7@FKLJF@70.3?Rgz����������������������������������;��������������������¼������s`J7./:Pcs�����������������������������������������������ø����vgXF5%);JV`hnsy�����������ľ������th[J;,  (9N`p}����������yk\NA60++/5>GQW\`ddeedca^ZVRLE=4,%"#).35640-)).9J_t������������������������������������ó����������������������������taJ7/0<Sfv����������������������������������������������������|p`P>-!!-9CLT[ahq{���������������|pcVH9,   +=O_nz��������xiXH<3,+,2:EPYcinruuvvuspmiea[ULA6,$"%(*++(%$#(4DXm�������������������������������������Ĵ����������������������������taJ7/1>Uiz��������������������������������������������¼������thXH6($*18=CJR]iw�������������uh\OB6* 
 -=L\kx������ziWG9/+*.5?KXcltz�������~{wrnhbYOB5+&(*+*)%""$-=Qg{�������������������������������������ò��}z���������������ÿ�������s_H6/3AXl}�����������������������ľ��������������������������wk^O?0$ "$'*,15=HUdu����������zm`SG<2)!"-:IZjw����{mZH9/**09EQ_kv�������������|xrmdZNA5035641,((+5J_t�������������������������������������̿���tos}����������������������p\F5/5E]p������������������������Ľ�������������������������yocUE6*$"%)*)('%%$%&)-6BQcs�������~rdVJ>5.)% #-9J\lw}~yo`L;/*+2<HWdq|����������������ztmcWK?<BFGD@:424?Uk�������������������������������������ƹ��}jbep��������������������~nZE506H`u������������������������Ľ������������������������zpfYJ</(&)069973/,)%#"$)3@Qbs����xk]OB80,*))((((()+,-,,,,+*)'%##-;M]jprlaR?2++2>L[jv�������������������yri^RGFOSUTPJC??I_t�������������������������������������Ǿ���q\RT_q��������������������{lYC417Kcx������������������������ü����������������������{rh\N@3*'*2<DGGFB>94/)$"#(2ARdqy|xqdVI<3-*+.269;;;<<=>=<;;::9853/*&!%/>MZac\RD6.-2=M]lz���������������������}wmcWMNX_cc_XPLIRh|������������������������������������þ���{bMCDPez�������������������yiV@207Le{�����������Ŀ�������������������|��y�����������{sj_RC7-)+2=IQUUTQLGB<4-'##(4BTcjlg^PB7/**,29@FJNNNNNONMKJIHGGFB@;60)# %0<HNOJA7/.2<L]m{�����������������������ypfZQS`hnold]VQYo�����������������������������������ÿ�����kS>57CXq�������������������wfS>0/6Le|������������þ���������ſ�������x�{rx~��������}xskaUH:/)*1<IU]aba_[VQKC90($$+6ESY[UK?4,))-4>HQX]aaaa`_^][ZXVUTROLHB;4*# %-5:;930/3<JYkz������������������������ypf[SVdmuwtmd]W^s���������������������������������¿������s[C1),8Mh|������������������tbN;.,4Ibz�������������¾��������½������|s{rhouz}��~|xuqkcXJ=2*)/:HU_fjllkie`ZRH<1($%,7BHJD;1*').6@LWbjptuuusrpmkigeca^[XSNG>3*"!&)+,,/4=IXfw�������������������������xoeYSYhry|zrjb[av����������������������������������������ycL7("%1E^r������������������p]I6)(0D]v����������������������Ŀ�������wlrg[cinrsttsqolhaXM?3+(-7ET`hnsuwwvtoiaVJ=0'#$+2673-'%(/8CO[gqz���������|zwsqnkgd_ZSJ?4)! $(.5?LYft����������������¾��������vlaURYit|�~vme]cx���������������������������������������}iUA0% #-?Ugw����������������}kV@.#!)<Sm����������������������þ������{pcgXKSZ_ceffecb`\UL@4+&)2AQ`ksx}�����~wocWI9-$ !$%%$""&-8DP\ht~��������������{wsokf_VL@3)!$,5AN]iu���������������������������uj_TT]lw��xof]cx�����������������������������ÿ�������m[K;/&$&.;M\jv���������������xcM8'#2G`{���������������������ü������vhWZH9AHMQSTTTSRPLF=2(##,:L\lv}���������|qdUE5)!#+6CP\it������������������{vqjbYL?3*#!#+6BP^lw���������������������������sh]SVbq{���ypf^cw�������������������������������������paRG=5/--3;EP[ep}�������������oXB0"*<Sn����������������������������~o_KM9'.38;<====<:71*##/BVgu������������~paP@1%(4AP\iu�����������������������{umdYM@6.*,7DQ_lx���������������������ſ�����rfZSXgu����{qh^bt����������������������������þ�������qdWNIFB>;;=@CIOV_m{�����������ubL8* %3G`{���������������������������yhV?A. #%&'''&&%#$4J_p�������������{l\K:-!#0>M[gs�������������¾���������~wneYL@925AN]kw�����������������������ú����rfZS\ky����}rh^ar������������������������������������tdYQNNONLKJJJIIJNT`o|���������wgS@0'"!!!#,<Ql�������������������Ľ������saM46$ &8Pfx���������������wfUE6*+:JYfr~��������������������������wocWKB:<IWfs�����������������������ƽ�����rfZT^m{����si^^n�����������������������������������yi[TQRVZZZZYXVSPMLNVbq~�������ugVD5+''))%$'2D\v�������������������������|lYC+, 
)>Wm����������������~n^N?2& &5EUcq}�������������������Ž�������~vk_SH@AN\kx������������������������ȿ�����sgZU`p}�����tj_]i}��������������������������ý������o`WUVY_cfffedb^XSNLOXet�����sdTD7.**-11-'$*8Mg�������������������������udN8"%
  1F_u�����������������ueVG:.('.=M]ly���������������������ǽ�������zpdXMDDP_n{������������������������ɿ�����sgZVaq~�����wka\dw�������������������������ƿ������xgZUW[ahloqqppnic\TNMQ[iw���~qcQC7/+-27;94*$%.@Xr�����������������������|lYD. 
 (<Rj������������Ǿ����zk\OB70.4DTds�����������������������Ĺ������~th\PEEO^n{������������������������ɿ����rfZVbr�����ync[as���������������������������������p`UV[aiptxz|||zuog^UONS_lw|yoaPA6.,.4;BDB;0%!&3Ib|����������������������raN9&    5Jaw������������������~oaUH=639HXhw�����������������������ʿ�������wk^QFDM]lz������������������������ǽ����}pdYVbr~�����{pd\^o������������������������¼������yhYSW_gpw}�������{ri]TMOT_imj_O@4.,06>FLMJA4' *<Uo���������������������ufTA-  !'**'"
)@Wn��������������¶����reYMB;7<K[kz������������������������Ĺ������ym`THDKZkz������������������������ƺ����|ocWVcr~�����{ocZ[k�����������������������»�������q`TSZcmw���������~sg[QMMS[]YN?5-,08AJPTUPG9+!"1Gby�������������������whWD2!$.5884/&0Iaw��������������������th\QF?:?N]m}������������������������Ƚ������znaUJEIXjz������������������������÷����zncVUbq}�����xk`VUd{���������������������¼�������yhYQS]ht�����������~pdWOIIMMH>3-+08BLTZ\[UL?0#(;Un�����������������wiYG6%'0;BEEA;2&"4Og~��������������������vk`TJB=AO`p���������������������������������{pcWLEGVhy������������������������������xmbTS_my����~reXNMZr��������������������ü�������o`TPVbn{�������������yl^RHA@=80**.8COW_bda\RE6'"1Hav���������������}tj[I8'
%0<FLOOKE<1&&7Sk���������������������xmcXME?CPbr��������������������������ĸ�����{pdXNFGUgw�����������������������ȼ�����vk_QOZfr|��wk]NCBNe~������������������ü��������tdYPPZgu���������������seVG;4.)&&+4BOZchklhbYK<*&:Rgz�������������zri\M:* )'9ENTWWSMD:/&(8Sk���������������������{qg[PHBCObt��������������������������Ź�����|peYOHFSct�����������������������ĸ�����tgZLHP[gpwxul`RC88BYq�����������������Ž��������xh[QNR^m}���������������yjZI8.&""'0=N[fnstupi`RA-,BVl}����������|vof[O>-  .-?LU[]\YULA7-#!)8Rj~��������������¸����uk_TKDDOcu��������������������������ƻ�����|qfZPHEP`q����������������������ʿ�����|oaSC>BKWagig_TF7.-7Jby���������������ž��������|l]SNPXfu����������ù����}n^L9+##,9IZgqx|}}yrgXG2!!2EZmy��������yrjbXM@1" $54FQY_``]YQH=1&$*8Pg|��������������Ż�����yocWNGENbu��������������������������ƺ�����{qg[QHELZk|���������������������ù�����viZJ934;ENUWVOE9-%$,<Qh�������������þ��������o_TNNT_n~����������ƻ����qaO;*"!(5EUer{�����zo`M7%$4GZhry}|vnf]SG<1$  )<<MV^bcc`]UMB6)%*8Odx��������������ȿ�����|qfZPGEMas��������������������������Ź�����{qf[PGAFTeu��������������������ú�����ym_O?/)(+3:@BB>7/&!!'4DYo�����������������������qbTLLQZgv�����������ƻ����rcQ<+$%/>O`nz�������wgT=)'7IV`hlpqqnh`VMB7.&1FDS[aefec`YQF:,'*6Nbv���������������ĺ�����tg[QHDL_q���������������������������������zpfZNE>@K\m{�������������������������}paRC4'"!%,37;;95/*&&*3>N`p~�������������������qcVJGMUan}�����������÷����~rdS?.'(3CUfu��������~o\E0*8CLSW[^_]WOD;3+%!:PLX_chhgeb\TJ>.)+5L_s���������������ǽ�����vh\QGBI\o�������������������������Ļ������wmbVKA:;CSes������������������������sdUE6+#!#'.5;?@@>:7446:@IU`jt~����������������ym_QG@CMYes�����������ʿ�����}reU@/()4EWix���������ucL6$#-6<ADFIIHC;3,'$###""""$(,FZT^cfijjhf`XNA2*+5I]p���������������ɿ�����vi\PEAFYk|�����������������������ļ������}th\OE=77>L^my�����������������������tgVF8-&$&,3;CJORSSQOMLKJJKNQV[bjt����������|vncWI?87@N[iw�����������ź�����zqeUA0()3BUfw���������zgR=* &.49;<<::72+&#"$(,/123459;Rc\cgikmmlje]SE5,+4F[o���������������Ⱦ�����uhZNC=CTfw�������������������������������ynaSF=724:FWeq{���������������������ugYH9.((+3>HS]ekoqrqpmkgb\WRKIGINVbmv{~~|zvrmg`WLA6.-0=O]ly�����������������xodUC1)*2>Nas���������{jWB1($#&*17<?@>;740*%!!$)29>ABCDFIJ^kbhjlnppomhaWI9.,2DZn��������������Ż�����uhZM?9=M_p������������������������������~tiZLA9646;ER^jsy}�����������������|shZK<0**/8DR_kv���������{rg]PF>99>FPY^bbb`\WRKD<3*# #+<O_n{����������ù�����}vnbTD5,-2<HZm|��������yiXE72237=CIMNNJD=72+&#$*3>GLOQRSTWWhrimnoqrsrokdZM=/,1AWk~�������������ǿ������sgXJ;46CUfw�����������������������������zpcTF?;;<?CJS\dkosuwy|���������|wpeYJ<1++0:GVft��������������yjYI<1**-39=?@@?<951,%':P`o|���������Ž������zsj_SF:338>FSfu��������ufWF<<@DLS[addb[SLC<4-**09FPWZ\]^`aapwmqrrstttrng]QA1,0>Th{������������ſ������}rdUE5--8HYk{���������������������������}uk^OC?@CGLPU\bfijjjjkmoqstttssrsrojbVI<2,+0:GWgw����������������yeQ?/# #&'()('%"%9P`p}��������ľ������~woeZNF>;=@DGP_nz������znaTF@ELU^hpuxwuog_UMD<646?LW_befghihuzpstttvvurni_RC3-0<Rgy��������������������zn`P@/%#+8I\mz�������������������������~xodYJAAELSY`ejmoolhda__abdeeeeeddc_[RF:0**/8FUdt�����������Ŀ�����q[F2!  $8N`p}����������������zri^SJFDDIKLKNYeqx}��|wndYPDBKValw����xof^TKC?>CO[cgjkmmnmy|qstttuuusni_RC3-/<Rfv�������������������thZJ8' +9K]kx����������������������{vpg\QD=AIS^fnsxzzxtmf_YUTTTUUUUUTTSPKB7.(',6CRao~������������ž����xbM5!
  !5L^n|���������������}ukaWNIJMQWXWQNU]flprrojbYQIABN[iv��������}ulbWNGCEP\djnoqqqpz|qsssssttrmf\O?1+/<Reu�������������������wm`RA0!!-=N]jrz~�����������������|zvrme\RH<9@JXfrz�����}ulbYQMJIIHHHHFED@:2*%#'0=JYhu�������������������|gQ8#   
0GZky���������������xncZRMMRY`eeaXRQV[_abb_[UMGB<AN]m{���������vl`UMGFP\elprsttr||pqqpopppmiaUI:-*/=Rds~����������������xodXI9*'4CP\emquwx{}�������~|yvsokf_WND;219GYjx�������~uj`XRNLKKIHFC@<60(#!")4BN[iv�������������ļ����}iS:$
"(++'"
+@Ufu��������������yoe[TOOS\emrqlaWRQRTTUUSPKE@=:>L[k{����������zpdXOGEO[dlqtvvwt}|opnllkkjfaXM@2)'.=Qboy���������������}umdZN@3' #*4>HQY`dhkmptvxyyywvusqnkgb\TMD:2*$%0@Tiz��������}si`ZVROOMKIE@;4-&""%,6BMYer�����������¼�����zfR:&#+6?BA<4( $8L^my������������yoe\TQQU^hrz}|vlaXTRRRTUTRNGA>:=HVgw����������zpcWMEAKXakqtvwwt}{nnjhgfeb^VMA5)"#,<N^jsy}����������}xrjbZQG<4,('),16=ELQVZ\^acfjmnoommjiheb^YRJA80( (8New���������zqh`[WSQNLHD?:4-(&'*/6>FP[iv������������������sbN8'#+4>IRUTND7+/CUdpy���������~vnd\UQSX`ku}����wnea]\\]_^\XPID>>DO_o}��������uj]QG?=ES^gnrsuus|wjifb_^[WQH>2((7HWainrsvwyyyyyxwuqmf_WPJD>:89<?DIMSY\_acddddeffffeca_]\YUQKC;2)!/F^q���������wnf`[UROLHD@<7200358<?BHQ^it����������������viZI5)$$)/7@IS]dfd]SF8)'8JYemty~����~yqjb[URT[dmw�������ztokiiiiihd_XPIEEKWfs~������}uk`SG>65=JV`gkmopnxoba^YUSNIA8-#!/>JT[`beghijklkkjgd_ZTNJIHHKMRX]aehloqrtttsrpmkhda^YVSPOLIE?80( 
';Sfu��������xqib[TPKHD@>;979=BDFFDCDHQ\eoz������������yri^QC4-.3;ENW_gnstpi_RD3%,>MX`fjnqrrqmha[VRORYdoy���������~zwutssssplg_VNIHP[gqy~��|xpg]RF:1*)1=ISZ_adecocUUQLHD?91( $0:CIMPRSVWY[]^^]\YVROMORW[agmsx{~�����������~ztngb[WSONKHE?81' 
/DWeow|~~~|zvrkd]TLGDB@?@@ABFKPQQPLFCBGNU]gov|�����{vqjd\SG=328BMW`hnty||xrh]O?/ #1=HOUY\^__^ZUPLKLOWboy�������������~}|{{zyuoh_SJDGNXahmookg_VLA6+"$.:CJNPSUTbQCD@;72,&! 
 (/379;=@CGKORTTTSQPQTZbipx�������������������~wohb^ZXUSPIA9/%  #4DPY`eikkkjgc^WOGA>>@CEIMOQUY]^\YSKD>=?BHQYafkmopomiea\VPH?847BP\fnuy}���}xpfYI9(",4<BFIKKKIFA>>BHQ^lx������������������}{wslbVJA>AGNUYZZVRJ@7-$'.479;>>O=-0,($  
 "#%(,18?EJNPQRTW[bks{������������������������{tnifcb`^YSK?2# ".7>DIMPPQPNKGB>98:?ELQVZ[^aeghfb[SH@:78;AHOUZ\]_^]ZXTPMHB<76<KYfpx}������{tk`P@. #(-1466541//3=IWft�������������������|yuqjbVJ?878<@CCA>:3+$
 "#&(':'  $/;FNSX[^bfks{���������������������������xspmlkie_WJ;)  #(,.0110/,+*++19BLTZ`degjmnnlhbYNC<645:@GNSTTUTRPPOMLIE?98?N]isz~�����{umaRB0  "*8HYjx������������������}xsnjfb[RG;3-+,-,+($   %-! !(2?N\fmrvz~��������������������������������������{umaQ>- "%'*,-...-,-/28CNYdlrw{{~���~{vmeZSKGFJPU]cfhihgfeedca]VOLQ]ju~����������{qdUD3&"$%'(((*.6DSdu��������������������zupligc[SIB<:9863.*&",TRUEVISION-XFILE.

116
Assets/TestScenes/HDTest/GraphicTest/Parallax Occlusion Mapping/Textures/RockHeightmap.tga.meta


fileFormatVersion: 2
guid: a3f1edea0cb01de42968bf3e4317f387
timeCreated: 1484821420
licenseType: Pro
TextureImporter:
fileIDToRecycleName: {}
serializedVersion: 4
mipmaps:
mipMapMode: 0
enableMipMap: 1
sRGBTexture: 1
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
isReadable: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
filterMode: -1
aniso: -1
mipBias: -1
wrapMode: -1
nPOTScale: 1
lightmap: 0
compressionQuality: 50
spriteMode: 0
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spritePixelsToUnits: 100
alphaUsage: 1
alphaIsTransparency: 0
spriteTessellationDetail: -1
textureType: 0
textureShape: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
platformSettings:
- buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
- buildTarget: Standalone
maxTextureSize: 2048
textureFormat: 26
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 1
- buildTarget: iPhone
maxTextureSize: 2048
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
- buildTarget: tvOS
maxTextureSize: 2048
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
- buildTarget: PS4
maxTextureSize: 2048
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
- buildTarget: Windows Store Apps
maxTextureSize: 2048
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
- buildTarget: WebGL
maxTextureSize: 2048
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
spriteSheet:
serializedVersion: 2
sprites: []
outline: []
spritePackingTag:
userData:
assetBundleName:
assetBundleVariant:

572
Assets/TestScenes/HDTest/GraphicTest/Parallax Occlusion Mapping/Textures/RockRelief.tga

之前 之后

116
Assets/TestScenes/HDTest/GraphicTest/Parallax Occlusion Mapping/Textures/RockRelief.tga.meta


fileFormatVersion: 2
guid: bbc15758a54df6f43a834cbf4e150d45
timeCreated: 1484821420
licenseType: Pro
TextureImporter:
fileIDToRecycleName: {}
serializedVersion: 4
mipmaps:
mipMapMode: 0
enableMipMap: 1
sRGBTexture: 0
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
isReadable: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
filterMode: -1
aniso: -1
mipBias: -1
wrapMode: -1
nPOTScale: 1
lightmap: 0
compressionQuality: 50
spriteMode: 0
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spritePixelsToUnits: 100
alphaUsage: 1
alphaIsTransparency: 0
spriteTessellationDetail: -1
textureType: 1
textureShape: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
platformSettings:
- buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
- buildTarget: Standalone
maxTextureSize: 2048
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
- buildTarget: iPhone
maxTextureSize: 2048
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
- buildTarget: tvOS
maxTextureSize: 2048
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
- buildTarget: PS4
maxTextureSize: 2048
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
- buildTarget: Windows Store Apps
maxTextureSize: 2048
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
- buildTarget: WebGL
maxTextureSize: 2048
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
spriteSheet:
serializedVersion: 2
sprites: []
outline: []
spritePackingTag:
userData:
assetBundleName:
assetBundleVariant:

160
Assets/TestScenes/HDTest/GraphicTest/Parallax Occlusion Mapping/Material/POM - Rock.mat


%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!21 &2100000
Material:
serializedVersion: 6
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 0}
m_PrefabInternal: {fileID: 0}
m_Name: POM - Rock
m_Shader: {fileID: 4800000, guid: 6e4ae4064600d784cac1e41a9e6f2e59, type: 3}
m_ShaderKeywords: _ALPHACUTOFFENABLE_OFF _DEPTHOFFSETENABLE_OFF _DETAIL_MAP_WITH_NORMAL
_DISTORTIONDEPTHTEST_OFF _DISTORTIONENABLE_OFF _DISTORTIONONLY_OFF _HEIGHTMAP
_NORMALMAP _NORMALMAP_TANGENT_SPACE _PER_PIXEL_DISPLACEMENT
m_LightmapFlags: 4
m_EnableInstancingVariants: 0
m_CustomRenderQueue: -1
stringTagMap: {}
disabledShaderPasses:
- DistortionVectors
m_SavedProperties:
serializedVersion: 3
m_TexEnvs:
- _AnisotropyMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _BaseColorMap:
m_Texture: {fileID: 2800000, guid: 37411c7405e8c1a42ac0a0f50983bd46, type: 3}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _BumpMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailAlbedoMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailMask:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailNormalMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DistortionVectorMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _EmissionMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _EmissiveColorMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _HeightMap:
m_Texture: {fileID: 2800000, guid: a3f1edea0cb01de42968bf3e4317f387, type: 3}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MainTex:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MaskMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MetallicGlossMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _NormalMap:
m_Texture: {fileID: 2800000, guid: bbc15758a54df6f43a834cbf4e150d45, type: 3}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _OcclusionMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _ParallaxMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _SpecularOcclusionMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _SubSurfaceRadiusMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _TangentMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
m_Floats:
- _AlphaCutoff: 0.5
- _AlphaCutoffEnable: 0
- _Anisotropy: 0
- _BlendMode: 0
- _BumpScale: 1
- _CullMode: 2
- _Cutoff: 0.5
- _DepthOffsetEnable: 0
- _DetailAOScale: 1
- _DetailAlbedoScale: 1
- _DetailHeightScale: 1
- _DetailMapMode: 0
- _DetailNormalMapScale: 1
- _DetailNormalScale: 1
- _DetailSmoothnessScale: 1
- _DistortionDepthTest: 0
- _DistortionEnable: 0
- _DistortionOnly: 0
- _DoubleSidedMode: 0
- _DstBlend: 0
- _EmissiveColorMode: 1
- _EmissiveIntensity: 0
- _EnablePerPixelDisplacement: 1
- _GlossMapScale: 1
- _Glossiness: 0.5
- _GlossyReflections: 1
- _HeightAmplitude: 0.09
- _HeightCenter: 0.5
- _MaterialId: 0
- _Metallic: 0
- _Mode: 0
- _NormalMapSpace: 0
- _NormalScale: 1
- _OcclusionStrength: 1
- _PPDMaxSamples: 15
- _PPDMinSamples: 5
- _Parallax: 0.02
- _Smoothness: 0.5
- _SmoothnessTextureChannel: 0
- _SpecularHighlights: 1
- _SrcBlend: 1
- _SubSurfaceRadius: 0
- _SurfaceType: 0
- _TexWorldScale: 1
- _UVBase: 0
- _UVDetail: 0
- _UVMappingPlanar: 0
- _UVSec: 0
- _ZTestMode: 8
- _ZWrite: 1
m_Colors:
- _BaseColor: {r: 1, g: 1, b: 1, a: 1}
- _Color: {r: 1, g: 1, b: 1, a: 1}
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
- _EmissiveColor: {r: 0, g: 0, b: 0, a: 1}
- _UVDetailsMappingMask: {r: 1, g: 0, b: 0, a: 0}
- _UVMappingMask: {r: 1, g: 0, b: 0, a: 0}

9
Assets/TestScenes/HDTest/GraphicTest/Parallax Occlusion Mapping/Material/POM - Rock.mat.meta


fileFormatVersion: 2
guid: 1f7b8b008c12d2546b81392e26255cc7
timeCreated: 1484821442
licenseType: Pro
NativeFormatImporter:
mainObjectFileID: 2100000
userData:
assetBundleName:
assetBundleVariant:

9
Assets/TestScenes/HDTest/GraphicTest/Parallax Occlusion Mapping/Material/POM - Wood.mat.meta


fileFormatVersion: 2
guid: 066ad54931fe38b4fa252c05cede10e1
timeCreated: 1484821457
licenseType: Pro
NativeFormatImporter:
mainObjectFileID: 2100000
userData:
assetBundleName:
assetBundleVariant:

160
Assets/TestScenes/HDTest/GraphicTest/Parallax Occlusion Mapping/Material/POM - Wood.mat


%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!21 &2100000
Material:
serializedVersion: 6
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 0}
m_PrefabInternal: {fileID: 0}
m_Name: POM - Wood
m_Shader: {fileID: 4800000, guid: 6e4ae4064600d784cac1e41a9e6f2e59, type: 3}
m_ShaderKeywords: _ALPHACUTOFFENABLE_OFF _DEPTHOFFSETENABLE_OFF _DETAIL_MAP_WITH_NORMAL
_DISTORTIONDEPTHTEST_OFF _DISTORTIONENABLE_OFF _DISTORTIONONLY_OFF _HEIGHTMAP
_NORMALMAP _NORMALMAP_TANGENT_SPACE _PER_PIXEL_DISPLACEMENT
m_LightmapFlags: 4
m_EnableInstancingVariants: 0
m_CustomRenderQueue: -1
stringTagMap: {}
disabledShaderPasses:
- DistortionVectors
m_SavedProperties:
serializedVersion: 3
m_TexEnvs:
- _AnisotropyMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _BaseColorMap:
m_Texture: {fileID: 2800000, guid: 0353c00d9bc99f14780836a6a51a6d97, type: 3}
m_Scale: {x: 2, y: 2}
m_Offset: {x: 0, y: 0}
- _BumpMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailAlbedoMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailMask:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailNormalMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DistortionVectorMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _EmissionMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _EmissiveColorMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _HeightMap:
m_Texture: {fileID: 2800000, guid: db7b513b0c2406e40be832dc28133281, type: 3}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MainTex:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MaskMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MetallicGlossMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _NormalMap:
m_Texture: {fileID: 2800000, guid: ccbd506f77c77e04eaa274a3d3d417e3, type: 3}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _OcclusionMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _ParallaxMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _SpecularOcclusionMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _SubSurfaceRadiusMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _TangentMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
m_Floats:
- _AlphaCutoff: 0.5
- _AlphaCutoffEnable: 0
- _Anisotropy: 0
- _BlendMode: 0
- _BumpScale: 1
- _CullMode: 2
- _Cutoff: 0.5
- _DepthOffsetEnable: 0
- _DetailAOScale: 1
- _DetailAlbedoScale: 1
- _DetailHeightScale: 1
- _DetailMapMode: 0
- _DetailNormalMapScale: 1
- _DetailNormalScale: 1
- _DetailSmoothnessScale: 1
- _DistortionDepthTest: 0
- _DistortionEnable: 0
- _DistortionOnly: 0
- _DoubleSidedMode: 0
- _DstBlend: 0
- _EmissiveColorMode: 1
- _EmissiveIntensity: 0
- _EnablePerPixelDisplacement: 1
- _GlossMapScale: 1
- _Glossiness: 0.5
- _GlossyReflections: 1
- _HeightAmplitude: 0.17
- _HeightCenter: 0.5
- _MaterialId: 0
- _Metallic: 0
- _Mode: 0
- _NormalMapSpace: 0
- _NormalScale: 1
- _OcclusionStrength: 1
- _PPDMaxSamples: 15
- _PPDMinSamples: 1
- _Parallax: 0.02
- _Smoothness: 0.5
- _SmoothnessTextureChannel: 0
- _SpecularHighlights: 1
- _SrcBlend: 1
- _SubSurfaceRadius: 0
- _SurfaceType: 0
- _TexWorldScale: 1
- _UVBase: 0
- _UVDetail: 0
- _UVMappingPlanar: 0
- _UVSec: 0
- _ZTestMode: 8
- _ZWrite: 1
m_Colors:
- _BaseColor: {r: 1, g: 1, b: 1, a: 1}
- _Color: {r: 1, g: 1, b: 1, a: 1}
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
- _EmissiveColor: {r: 0, g: 0, b: 0, a: 1}
- _UVDetailsMappingMask: {r: 1, g: 0, b: 0, a: 0}
- _UVMappingMask: {r: 1, g: 0, b: 0, a: 0}

9
Assets/TestScenes/HDTest/GraphicTest/Tessellation.meta


fileFormatVersion: 2
guid: 0b1052bdba139db4aa743a14446ede87
folderAsset: yes
timeCreated: 1484829080
licenseType: Pro
DefaultImporter:
userData:
assetBundleName:
assetBundleVariant:

9
Assets/TestScenes/HDTest/GraphicTest/Tessellation/Material.meta


fileFormatVersion: 2
guid: b31c0a811fc5b7b4ebec447806d1eb32
folderAsset: yes
timeCreated: 1484821419
licenseType: Pro
DefaultImporter:
userData:
assetBundleName:
assetBundleVariant:

9
Assets/TestScenes/HDTest/GraphicTest/Tessellation/Textures.meta


fileFormatVersion: 2
guid: c7be485d3168a55498cd871c89da7505
folderAsset: yes
timeCreated: 1484821419
licenseType: Pro
DefaultImporter:
userData:
assetBundleName:
assetBundleVariant:

129
Assets/TestScenes/HDTest/GraphicTest/Tessellation/Textures/FourShapesColor.tga
文件差异内容过多而无法显示
查看文件

部分文件因为文件数量过多而无法显示

正在加载...
取消
保存