GitHub
7 年前
当前提交
ab445387
共有 89 个文件被更改,包括 3340 次插入 和 1695 次删除
-
51ScriptableRenderPipeline/Core/CoreRP/Editor/MaterialUpgrader.cs
-
4ScriptableRenderPipeline/Core/CoreRP/ShaderLibrary/EntityLighting.hlsl
-
39ScriptableRenderPipeline/LightweightPipeline/LWRP/Data/LightweightPipelineAsset.cs
-
1ScriptableRenderPipeline/LightweightPipeline/LWRP/Data/LightweightPipelineResources.asset
-
1ScriptableRenderPipeline/LightweightPipeline/LWRP/Data/LightweightPipelineResources.cs
-
30ScriptableRenderPipeline/LightweightPipeline/LWRP/Editor/LightweightAssetEditor.cs
-
101ScriptableRenderPipeline/LightweightPipeline/LWRP/Editor/ShaderGUI/LightweightShaderGUI.cs
-
58ScriptableRenderPipeline/LightweightPipeline/LWRP/Editor/ShaderGUI/LightweightStandardGUI.cs
-
4ScriptableRenderPipeline/LightweightPipeline/LWRP/Editor/ShaderGUI/LightweightStandardParticlesShaderGUI.cs
-
62ScriptableRenderPipeline/LightweightPipeline/LWRP/Editor/ShaderGUI/LightweightStandardSimpleLightingGUI.cs
-
117ScriptableRenderPipeline/LightweightPipeline/LWRP/Editor/ShaderGUI/LightweightUnlitGUI.cs
-
17ScriptableRenderPipeline/LightweightPipeline/LWRP/Editor/ShaderGraph/lightweightPBRExtraPasses.template
-
13ScriptableRenderPipeline/LightweightPipeline/LWRP/Editor/ShaderGraph/lightweightPBRForwardPass.template
-
33ScriptableRenderPipeline/LightweightPipeline/LWRP/Editor/ShaderGraph/lightweightUnlitExtraPasses.template
-
6ScriptableRenderPipeline/LightweightPipeline/LWRP/Editor/ShaderGraph/lightweightUnlitPass.template
-
20ScriptableRenderPipeline/LightweightPipeline/LWRP/LightweightConstantBuffer.cs
-
830ScriptableRenderPipeline/LightweightPipeline/LWRP/LightweightPipeline.cs
-
160ScriptableRenderPipeline/LightweightPipeline/LWRP/LightweightPipelineUtils.cs
-
2ScriptableRenderPipeline/LightweightPipeline/LWRP/LightweightShaderUtils.cs
-
6ScriptableRenderPipeline/LightweightPipeline/LWRP/Materials/Lightweight-Default.mat
-
10ScriptableRenderPipeline/LightweightPipeline/LWRP/Materials/Lightweight-StandardSimpleLighting.mat
-
5ScriptableRenderPipeline/LightweightPipeline/LWRP/ShaderLibrary/Core.hlsl
-
16ScriptableRenderPipeline/LightweightPipeline/LWRP/ShaderLibrary/Input.hlsl
-
87ScriptableRenderPipeline/LightweightPipeline/LWRP/ShaderLibrary/Lighting.hlsl
-
5ScriptableRenderPipeline/LightweightPipeline/LWRP/ShaderLibrary/LightweightPassDepthOnly.hlsl
-
112ScriptableRenderPipeline/LightweightPipeline/LWRP/ShaderLibrary/LightweightPassLit.hlsl
-
5ScriptableRenderPipeline/LightweightPipeline/LWRP/ShaderLibrary/LightweightPassShadow.hlsl
-
84ScriptableRenderPipeline/LightweightPipeline/LWRP/ShaderLibrary/Particles.hlsl
-
155ScriptableRenderPipeline/LightweightPipeline/LWRP/ShaderLibrary/Shadows.hlsl
-
30ScriptableRenderPipeline/LightweightPipeline/LWRP/ShaderLibrary/LightweightPassMetaCommon.hlsl
-
1ScriptableRenderPipeline/LightweightPipeline/LWRP/Shaders/LightweightBlit.shader
-
1ScriptableRenderPipeline/LightweightPipeline/LWRP/Shaders/LightweightCopyDepth.shader
-
12ScriptableRenderPipeline/LightweightPipeline/LWRP/Shaders/LightweightScreenSpaceShadows.shader
-
19ScriptableRenderPipeline/LightweightPipeline/LWRP/Shaders/LightweightStandard.shader
-
9ScriptableRenderPipeline/LightweightPipeline/LWRP/Shaders/LightweightStandardParticles.shader
-
18ScriptableRenderPipeline/LightweightPipeline/LWRP/Shaders/LightweightStandardParticlesSimpleLighting.shader
-
18ScriptableRenderPipeline/LightweightPipeline/LWRP/Shaders/LightweightStandardParticlesUnlit.shader
-
24ScriptableRenderPipeline/LightweightPipeline/LWRP/Shaders/LightweightStandardSimpleLighting.shader
-
59ScriptableRenderPipeline/LightweightPipeline/LWRP/Shaders/LightweightStandardUnlit.shader
-
631ScriptableRenderPipeline/LightweightPipeline/LWRP/LightweightShadowPass.cs
-
11ScriptableRenderPipeline/LightweightPipeline/LWRP/LightweightShadowPass.cs.meta
-
71ScriptableRenderPipeline/LightweightPipeline/LWRP/ShaderLibrary/InputSurfaceCommon.hlsl
-
97ScriptableRenderPipeline/LightweightPipeline/LWRP/ShaderLibrary/InputSurfacePBR.hlsl
-
9ScriptableRenderPipeline/LightweightPipeline/LWRP/ShaderLibrary/InputSurfacePBR.hlsl.meta
-
33ScriptableRenderPipeline/LightweightPipeline/LWRP/ShaderLibrary/InputSurfaceSimple.hlsl
-
9ScriptableRenderPipeline/LightweightPipeline/LWRP/ShaderLibrary/InputSurfaceSimple.hlsl.meta
-
15ScriptableRenderPipeline/LightweightPipeline/LWRP/ShaderLibrary/InputSurfaceUnlit.hlsl
-
9ScriptableRenderPipeline/LightweightPipeline/LWRP/ShaderLibrary/InputSurfaceUnlit.hlsl.meta
-
146ScriptableRenderPipeline/LightweightPipeline/LWRP/ShaderLibrary/LightweightPassLitSimple.hlsl
-
9ScriptableRenderPipeline/LightweightPipeline/LWRP/ShaderLibrary/LightweightPassLitSimple.hlsl.meta
-
22ScriptableRenderPipeline/LightweightPipeline/LWRP/ShaderLibrary/LightweightPassMetaPBR.hlsl
-
9ScriptableRenderPipeline/LightweightPipeline/LWRP/ShaderLibrary/LightweightPassMetaPBR.hlsl.meta
-
17ScriptableRenderPipeline/LightweightPipeline/LWRP/ShaderLibrary/LightweightPassMetaSimple.hlsl
-
9ScriptableRenderPipeline/LightweightPipeline/LWRP/ShaderLibrary/LightweightPassMetaSimple.hlsl.meta
-
33ScriptableRenderPipeline/LightweightPipeline/LWRP/ShaderLibrary/ParticlesPBR.hlsl
-
9ScriptableRenderPipeline/LightweightPipeline/LWRP/ShaderLibrary/ParticlesPBR.hlsl.meta
-
8ScriptableRenderPipeline/LightweightPipeline/LWRP/ShaderLibrary/Terrain.meta
-
82ScriptableRenderPipeline/LightweightPipeline/LWRP/Shaders/LightweightSampling.shader
-
10ScriptableRenderPipeline/LightweightPipeline/LWRP/Shaders/LightweightSampling.shader.meta
-
8ScriptableRenderPipeline/LightweightPipeline/LWRP/Shaders/Terrain.meta
-
9ScriptableRenderPipeline/LightweightPipeline/LWRP/ShaderLibrary/Terrain/InputSurfaceGrass.hlsl.meta
-
31ScriptableRenderPipeline/LightweightPipeline/LWRP/ShaderLibrary/Terrain/InputSurfaceTerrain.hlsl
-
9ScriptableRenderPipeline/LightweightPipeline/LWRP/ShaderLibrary/Terrain/InputSurfaceTerrain.hlsl.meta
-
41ScriptableRenderPipeline/LightweightPipeline/LWRP/ShaderLibrary/Terrain/InputSurfaceTerrainBase.hlsl
-
9ScriptableRenderPipeline/LightweightPipeline/LWRP/ShaderLibrary/Terrain/InputSurfaceTerrainBase.hlsl.meta
-
40ScriptableRenderPipeline/LightweightPipeline/LWRP/ShaderLibrary/Terrain/LightweightPassDepthOnlyGrass.hlsl
-
9ScriptableRenderPipeline/LightweightPipeline/LWRP/ShaderLibrary/Terrain/LightweightPassDepthOnlyGrass.hlsl.meta
-
158ScriptableRenderPipeline/LightweightPipeline/LWRP/ShaderLibrary/Terrain/LightweightPassLitGrass.hlsl
-
9ScriptableRenderPipeline/LightweightPipeline/LWRP/ShaderLibrary/Terrain/LightweightPassLitGrass.hlsl.meta
-
165ScriptableRenderPipeline/LightweightPipeline/LWRP/ShaderLibrary/Terrain/LightweightPassLitTerrain.hlsl
-
9ScriptableRenderPipeline/LightweightPipeline/LWRP/ShaderLibrary/Terrain/LightweightPassLitTerrain.hlsl.meta
-
108ScriptableRenderPipeline/LightweightPipeline/LWRP/ShaderLibrary/Terrain/InputSurfaceGrass.hlsl
-
114ScriptableRenderPipeline/LightweightPipeline/LWRP/Shaders/Terrain/LightweightStandardTerrain.shader
-
69ScriptableRenderPipeline/LightweightPipeline/LWRP/Shaders/Terrain/LightweightStandardTerrainAddPass.shader
-
10ScriptableRenderPipeline/LightweightPipeline/LWRP/Shaders/Terrain/LightweightStandardTerrainAddPass.shader.meta
-
143ScriptableRenderPipeline/LightweightPipeline/LWRP/Shaders/Terrain/LightweightStandardTerrainBase.shader
-
10ScriptableRenderPipeline/LightweightPipeline/LWRP/Shaders/Terrain/LightweightStandardTerrainBase.shader.meta
-
89ScriptableRenderPipeline/LightweightPipeline/LWRP/Shaders/Terrain/LightweightWavingGrass.shader
-
9ScriptableRenderPipeline/LightweightPipeline/LWRP/Shaders/Terrain/LightweightWavingGrass.shader.meta
-
89ScriptableRenderPipeline/LightweightPipeline/LWRP/Shaders/Terrain/LightweightWavingGrassBillboard.shader
-
9ScriptableRenderPipeline/LightweightPipeline/LWRP/Shaders/Terrain/LightweightWavingGrassBillboard.shader.meta
-
179ScriptableRenderPipeline/LightweightPipeline/LWRP/ShaderLibrary/InputSurface.hlsl
-
245ScriptableRenderPipeline/LightweightPipeline/LWRP/Shaders/LightweightStandardTerrain.shader
-
0/ScriptableRenderPipeline/LightweightPipeline/LWRP/ShaderLibrary/LightweightPassMetaCommon.hlsl.meta
-
0/ScriptableRenderPipeline/LightweightPipeline/LWRP/ShaderLibrary/LightweightPassMetaCommon.hlsl
-
0/ScriptableRenderPipeline/LightweightPipeline/LWRP/ShaderLibrary/InputSurfaceCommon.hlsl.meta
-
0/ScriptableRenderPipeline/LightweightPipeline/LWRP/Shaders/Terrain/LightweightStandardTerrain.shader.meta
830
ScriptableRenderPipeline/LightweightPipeline/LWRP/LightweightPipeline.cs
文件差异内容过多而无法显示
查看文件
文件差异内容过多而无法显示
查看文件
|
|||
using System; |
|||
using System.Collections.Generic; |
|||
using UnityEngine.Rendering; |
|||
|
|||
namespace UnityEngine.Experimental.Rendering.LightweightPipeline |
|||
{ |
|||
[Serializable] |
|||
public class ShadowSettings |
|||
{ |
|||
public LightShadows directionalShadowQuality; |
|||
public bool screenSpace; |
|||
public int directionalShadowAtlasWidth; |
|||
public int directionalShadowAtlasHeight; |
|||
public LightShadows localLightsShadowQuality; |
|||
public int localShadowAtlasWidth; |
|||
public int localShadowAtlasHeight; |
|||
public int bufferBitCount; |
|||
|
|||
public float maxShadowDistance; |
|||
public int directionalLightCascadeCount; |
|||
public Vector3 directionalLightCascades; |
|||
|
|||
public RenderTextureFormat shadowmapTextureFormat; |
|||
public RenderTextureFormat screenspaceShadowmapTextureFormat; |
|||
|
|||
static ShadowSettings defaultShadowSettings = null; |
|||
|
|||
public static ShadowSettings Default |
|||
{ |
|||
get |
|||
{ |
|||
if (defaultShadowSettings == null) |
|||
{ |
|||
defaultShadowSettings = new ShadowSettings(); |
|||
defaultShadowSettings.directionalShadowQuality = LightShadows.None; |
|||
defaultShadowSettings.screenSpace = true; |
|||
defaultShadowSettings.directionalShadowAtlasHeight = defaultShadowSettings.directionalShadowAtlasWidth = 2048; |
|||
defaultShadowSettings.localLightsShadowQuality = LightShadows.None; |
|||
defaultShadowSettings.localShadowAtlasWidth = 512; |
|||
defaultShadowSettings.localShadowAtlasHeight = 512; |
|||
defaultShadowSettings.bufferBitCount = 16; |
|||
defaultShadowSettings.directionalLightCascadeCount = 1; |
|||
defaultShadowSettings.directionalLightCascades = new Vector3(0.05F, 0.2F, 0.3F); |
|||
defaultShadowSettings.shadowmapTextureFormat = RenderTextureFormat.Shadowmap; |
|||
defaultShadowSettings.screenspaceShadowmapTextureFormat = RenderTextureFormat.R8; |
|||
} |
|||
return defaultShadowSettings; |
|||
} |
|||
} |
|||
} |
|||
|
|||
public struct ShadowSliceData |
|||
{ |
|||
public Matrix4x4 shadowTransform; |
|||
public int offsetX; |
|||
public int offsetY; |
|||
public int resolution; |
|||
|
|||
public void Clear() |
|||
{ |
|||
shadowTransform = Matrix4x4.identity; |
|||
offsetX = offsetY = 0; |
|||
resolution = 1024; |
|||
} |
|||
} |
|||
|
|||
public class LightweightShadowPass |
|||
{ |
|||
public bool IsDirectionalShadowsEnabled { get { return m_ShadowSettings.directionalShadowQuality != LightShadows.None; } } |
|||
public bool IsLocalShadowsEnabled { get { return m_ShadowSettings.localLightsShadowQuality != LightShadows.None; }} |
|||
public bool RequireScreenSpaceShadowmap { get { return IsDirectionalShadowsEnabled && m_ShadowSettings.screenSpace; } } |
|||
public bool HasDirectionalShadowmap { get { return m_DirectionalShadowmapQuality != LightShadows.None; } } |
|||
public bool HasLocalLightsShadowmap { get { return m_LocalShadowmapQuality != LightShadows.None; } } |
|||
|
|||
public float RenderingDistance { get { return m_ShadowSettings.maxShadowDistance; } } |
|||
|
|||
private const int kMaxCascades = 4; |
|||
|
|||
private int m_ShadowCasterCascadesCount; |
|||
private int m_DirectionalShadowmapID; |
|||
private int m_LocalShadowmapID; |
|||
private int m_ScreenSpaceShadowmapID; |
|||
|
|||
private ShadowSettings m_ShadowSettings = ShadowSettings.Default; |
|||
|
|||
private Material m_ScreenSpaceShadowsMaterial; |
|||
|
|||
private RenderTexture m_DirectionalShadowmapTexture; |
|||
private RenderTexture m_LocalShadowmapTexture; |
|||
private RenderTargetIdentifier m_ScreenSpaceShadowmapTexture; |
|||
|
|||
private RenderTextureDescriptor m_DirectionalShadowmapDescriptor; |
|||
private RenderTextureDescriptor m_LocalShadowmapDescriptor; |
|||
|
|||
private LightShadows m_DirectionalShadowmapQuality; |
|||
private LightShadows m_LocalShadowmapQuality; |
|||
|
|||
private Matrix4x4[] m_DirectionalShadowMatrices; |
|||
private ShadowSliceData[] m_CascadeSlices; |
|||
private Vector4[] m_CascadeSplitDistances; |
|||
private Vector4 m_CascadeSplitRadii; |
|||
|
|||
private Matrix4x4[] m_LocalShadowMatrices; |
|||
private ShadowSliceData[] m_LocalLightSlices; |
|||
private float[] m_LocalShadowStrength; |
|||
|
|||
public LightweightShadowPass(LightweightPipelineAsset pipelineAsset, int maxLocalLightsCount) |
|||
{ |
|||
BuildShadowSettings(pipelineAsset); |
|||
|
|||
m_DirectionalShadowMatrices = new Matrix4x4[kMaxCascades + 1]; |
|||
m_CascadeSlices = new ShadowSliceData[kMaxCascades]; |
|||
m_CascadeSplitDistances = new Vector4[kMaxCascades]; |
|||
|
|||
m_LocalShadowMatrices = new Matrix4x4[maxLocalLightsCount]; |
|||
m_LocalLightSlices = new ShadowSliceData[maxLocalLightsCount]; |
|||
m_LocalShadowStrength = new float[maxLocalLightsCount]; |
|||
|
|||
DirectionalShadowConstantBuffer._WorldToShadow = Shader.PropertyToID("_WorldToShadow"); |
|||
DirectionalShadowConstantBuffer._ShadowData = Shader.PropertyToID("_ShadowData"); |
|||
DirectionalShadowConstantBuffer._DirShadowSplitSpheres = Shader.PropertyToID("_DirShadowSplitSpheres"); |
|||
DirectionalShadowConstantBuffer._DirShadowSplitSphereRadii = Shader.PropertyToID("_DirShadowSplitSphereRadii"); |
|||
DirectionalShadowConstantBuffer._ShadowOffset0 = Shader.PropertyToID("_ShadowOffset0"); |
|||
DirectionalShadowConstantBuffer._ShadowOffset1 = Shader.PropertyToID("_ShadowOffset1"); |
|||
DirectionalShadowConstantBuffer._ShadowOffset2 = Shader.PropertyToID("_ShadowOffset2"); |
|||
DirectionalShadowConstantBuffer._ShadowOffset3 = Shader.PropertyToID("_ShadowOffset3"); |
|||
DirectionalShadowConstantBuffer._ShadowmapSize = Shader.PropertyToID("_ShadowmapSize"); |
|||
|
|||
LocalShadowConstantBuffer._LocalWorldToShadowAtlas = Shader.PropertyToID("_LocalWorldToShadowAtlas"); |
|||
LocalShadowConstantBuffer._LocalShadowStrength = Shader.PropertyToID("_LocalShadowStrength"); |
|||
LocalShadowConstantBuffer._LocalShadowOffset0 = Shader.PropertyToID("_LocalShadowOffset0"); |
|||
LocalShadowConstantBuffer._LocalShadowOffset1 = Shader.PropertyToID("_LocalShadowOffset1"); |
|||
LocalShadowConstantBuffer._LocalShadowOffset2 = Shader.PropertyToID("_LocalShadowOffset2"); |
|||
LocalShadowConstantBuffer._LocalShadowOffset3 = Shader.PropertyToID("_LocalShadowOffset3"); |
|||
LocalShadowConstantBuffer._LocalShadowmapSize = Shader.PropertyToID("_LocalShadowmapSize"); |
|||
|
|||
m_DirectionalShadowmapID = Shader.PropertyToID("_ShadowMap"); |
|||
m_LocalShadowmapID = Shader.PropertyToID("_LocalShadowMapAtlas"); |
|||
m_ScreenSpaceShadowmapID = Shader.PropertyToID("_ScreenSpaceShadowMap"); |
|||
m_ScreenSpaceShadowmapTexture = new RenderTargetIdentifier(m_ScreenSpaceShadowmapID); |
|||
|
|||
m_DirectionalShadowmapDescriptor = new RenderTextureDescriptor(m_ShadowSettings.directionalShadowAtlasWidth, |
|||
m_ShadowSettings.directionalShadowAtlasHeight, m_ShadowSettings.shadowmapTextureFormat, m_ShadowSettings.bufferBitCount); |
|||
|
|||
m_LocalShadowmapDescriptor = new RenderTextureDescriptor(m_ShadowSettings.localShadowAtlasWidth, |
|||
m_ShadowSettings.localShadowAtlasHeight, m_ShadowSettings.shadowmapTextureFormat, m_ShadowSettings.bufferBitCount); |
|||
|
|||
m_ScreenSpaceShadowsMaterial = CoreUtils.CreateEngineMaterial(pipelineAsset.ScreenSpaceShadowShader); |
|||
|
|||
Clear(); |
|||
} |
|||
|
|||
public void InitializeResources(CommandBuffer cmd, RenderTextureDescriptor renderTextureDesc) |
|||
{ |
|||
if (RequireScreenSpaceShadowmap) |
|||
{ |
|||
renderTextureDesc.depthBufferBits = 0; |
|||
renderTextureDesc.colorFormat = m_ShadowSettings.screenspaceShadowmapTextureFormat; |
|||
cmd.GetTemporaryRT(m_ScreenSpaceShadowmapID, renderTextureDesc, FilterMode.Bilinear); |
|||
} |
|||
} |
|||
|
|||
public void Dispose(CommandBuffer cmd) |
|||
{ |
|||
cmd.ReleaseTemporaryRT(m_ScreenSpaceShadowmapID); |
|||
|
|||
if (m_DirectionalShadowmapTexture) |
|||
{ |
|||
RenderTexture.ReleaseTemporary(m_DirectionalShadowmapTexture); |
|||
m_DirectionalShadowmapTexture = null; |
|||
} |
|||
|
|||
if (m_LocalShadowmapTexture) |
|||
{ |
|||
RenderTexture.ReleaseTemporary(m_LocalShadowmapTexture); |
|||
m_LocalShadowmapTexture = null; |
|||
} |
|||
} |
|||
|
|||
public bool Execute(ref CullResults cullResults, ref LightData lightData, ref ScriptableRenderContext context) |
|||
{ |
|||
Clear(); |
|||
|
|||
bool directionalShadowmapRendered = false; |
|||
if (IsDirectionalShadowsEnabled) |
|||
directionalShadowmapRendered = RenderDirectionalCascadeShadowmap(ref cullResults, ref lightData, ref context); |
|||
|
|||
if (IsLocalShadowsEnabled) |
|||
RenderLocalShadowmapAtlas(ref cullResults, ref lightData, ref context); |
|||
|
|||
return directionalShadowmapRendered && m_ShadowSettings.screenSpace; |
|||
} |
|||
|
|||
public void CollectShadows(Camera camera, FrameRenderingConfiguration frameRenderingConfiguration, ref ScriptableRenderContext context) |
|||
{ |
|||
CommandBuffer cmd = CommandBufferPool.Get("Collect Shadows"); |
|||
|
|||
SetShadowCollectPassKeywords(cmd); |
|||
|
|||
// Note: The source isn't actually 'used', but there's an engine peculiarity (bug) that
|
|||
// doesn't like null sources when trying to determine a stereo-ized blit. So for proper
|
|||
// stereo functionality, we use the screen-space shadow map as the source (until we have
|
|||
// a better solution).
|
|||
// An alternative would be DrawProcedural, but that would require further changes in the shader.
|
|||
cmd.SetRenderTarget(m_ScreenSpaceShadowmapTexture); |
|||
cmd.ClearRenderTarget(true, true, Color.white); |
|||
cmd.Blit(m_ScreenSpaceShadowmapTexture, m_ScreenSpaceShadowmapTexture, m_ScreenSpaceShadowsMaterial); |
|||
|
|||
LightweightUtils.StartStereoRendering(camera, ref context, frameRenderingConfiguration); |
|||
|
|||
context.ExecuteCommandBuffer(cmd); |
|||
|
|||
LightweightUtils.StopStereoRendering(camera, ref context, frameRenderingConfiguration); |
|||
|
|||
CommandBufferPool.Release(cmd); |
|||
} |
|||
|
|||
private void BuildShadowSettings(LightweightPipelineAsset pipelineAsset) |
|||
{ |
|||
// Until we can have keyword stripping forcing single cascade hard shadows on gles2
|
|||
bool supportsScreenSpaceShadows = SystemInfo.graphicsDeviceType != GraphicsDeviceType.OpenGLES2; |
|||
bool supportsLocalShadows = Application.isMobilePlatform || Application.platform == RuntimePlatform.WebGLPlayer; |
|||
|
|||
m_ShadowSettings = ShadowSettings.Default; |
|||
m_ShadowSettings.directionalShadowQuality = (LightShadows)pipelineAsset.ShadowSetting; |
|||
|
|||
m_ShadowSettings.screenSpace = supportsScreenSpaceShadows; |
|||
m_ShadowSettings.directionalLightCascadeCount = (m_ShadowSettings.screenSpace) ? pipelineAsset.CascadeCount : 1; |
|||
|
|||
m_ShadowSettings.directionalShadowAtlasWidth = pipelineAsset.ShadowAtlasResolution; |
|||
m_ShadowSettings.directionalShadowAtlasHeight = pipelineAsset.ShadowAtlasResolution; |
|||
m_ShadowSettings.maxShadowDistance = pipelineAsset.ShadowDistance; |
|||
m_ShadowSettings.shadowmapTextureFormat = SystemInfo.SupportsRenderTextureFormat(RenderTextureFormat.Shadowmap) |
|||
? RenderTextureFormat.Shadowmap |
|||
: RenderTextureFormat.Depth; |
|||
|
|||
m_ShadowSettings.screenspaceShadowmapTextureFormat = SystemInfo.SupportsRenderTextureFormat(RenderTextureFormat.R8) |
|||
? RenderTextureFormat.R8 |
|||
: RenderTextureFormat.ARGB32; |
|||
|
|||
switch (m_ShadowSettings.directionalLightCascadeCount) |
|||
{ |
|||
case 1: |
|||
m_ShadowSettings.directionalLightCascades = new Vector3(1.0f, 0.0f, 0.0f); |
|||
break; |
|||
|
|||
case 2: |
|||
m_ShadowSettings.directionalLightCascades = new Vector3(pipelineAsset.Cascade2Split, 1.0f, 0.0f); |
|||
break; |
|||
|
|||
default: |
|||
m_ShadowSettings.directionalLightCascades = pipelineAsset.Cascade4Split; |
|||
break; |
|||
} |
|||
|
|||
// Until we can have keyword stripping we disable local light shadows on mobile
|
|||
m_ShadowSettings.localLightsShadowQuality = (supportsLocalShadows) ? LightShadows.Hard : LightShadows.None; |
|||
} |
|||
|
|||
private void Clear() |
|||
{ |
|||
m_DirectionalShadowmapTexture = null; |
|||
m_LocalShadowmapTexture = null; |
|||
m_DirectionalShadowmapQuality = LightShadows.None; |
|||
m_LocalShadowmapQuality = LightShadows.None; |
|||
|
|||
for (int i = 0; i < m_DirectionalShadowMatrices.Length; ++i) |
|||
m_DirectionalShadowMatrices[i] = Matrix4x4.identity; |
|||
|
|||
for (int i = 0; i < m_LocalShadowMatrices.Length; ++i) |
|||
m_LocalShadowMatrices[i] = Matrix4x4.identity; |
|||
|
|||
for (int i = 0; i < m_CascadeSplitDistances.Length; ++i) |
|||
m_CascadeSplitDistances[i] = new Vector4(0.0f, 0.0f, 0.0f, 0.0f); |
|||
|
|||
m_CascadeSplitRadii = new Vector4(0.0f, 0.0f, 0.0f, 0.0f); |
|||
|
|||
for (int i = 0; i < m_CascadeSlices.Length; ++i) |
|||
m_CascadeSlices[i].Clear(); |
|||
|
|||
for (int i = 0; i < m_LocalLightSlices.Length; ++i) |
|||
m_LocalLightSlices[i].Clear(); |
|||
|
|||
for (int i = 0; i < m_LocalShadowStrength.Length; ++i) |
|||
m_LocalShadowStrength[i] = 0.0f; |
|||
} |
|||
|
|||
private void SetShadowCollectPassKeywords(CommandBuffer cmd) |
|||
{ |
|||
CoreUtils.SetKeyword(cmd, "_SHADOWS_SOFT", m_DirectionalShadowmapQuality == LightShadows.Soft); |
|||
CoreUtils.SetKeyword(cmd, "_SHADOWS_CASCADE", m_ShadowSettings.directionalLightCascadeCount > 1); |
|||
} |
|||
|
|||
private bool RenderDirectionalCascadeShadowmap(ref CullResults cullResults, ref LightData lightData, ref ScriptableRenderContext context) |
|||
{ |
|||
int shadowLightIndex = lightData.mainLightIndex; |
|||
if (shadowLightIndex == -1) |
|||
return false; |
|||
|
|||
VisibleLight shadowLight = lightData.visibleLights[shadowLightIndex]; |
|||
Light light = shadowLight.light; |
|||
Debug.Assert(shadowLight.lightType == LightType.Directional); |
|||
|
|||
if (light.shadows == LightShadows.None) |
|||
return false; |
|||
|
|||
CommandBuffer cmd = CommandBufferPool.Get("Prepare Directional Shadowmap"); |
|||
m_ShadowCasterCascadesCount = m_ShadowSettings.directionalLightCascadeCount; |
|||
|
|||
int shadowResolution = GetMaxTileResolutionInAtlas(m_ShadowSettings.directionalShadowAtlasWidth, m_ShadowSettings.directionalShadowAtlasHeight, m_ShadowCasterCascadesCount); |
|||
float shadowNearPlane = light.shadowNearPlane; |
|||
|
|||
Bounds bounds; |
|||
if (!cullResults.GetShadowCasterBounds(shadowLightIndex, out bounds)) |
|||
return false; |
|||
|
|||
Matrix4x4 view, proj; |
|||
var settings = new DrawShadowsSettings(cullResults, shadowLightIndex); |
|||
|
|||
m_DirectionalShadowmapTexture = RenderTexture.GetTemporary(m_DirectionalShadowmapDescriptor); |
|||
m_DirectionalShadowmapTexture.filterMode = FilterMode.Bilinear; |
|||
m_DirectionalShadowmapTexture.wrapMode = TextureWrapMode.Clamp; |
|||
|
|||
CoreUtils.SetRenderTarget(cmd, m_DirectionalShadowmapTexture, ClearFlag.Depth); |
|||
|
|||
bool success = false; |
|||
for (int cascadeIndex = 0; cascadeIndex < m_ShadowCasterCascadesCount; ++cascadeIndex) |
|||
{ |
|||
success = cullResults.ComputeDirectionalShadowMatricesAndCullingPrimitives(shadowLightIndex, |
|||
cascadeIndex, m_ShadowCasterCascadesCount, m_ShadowSettings.directionalLightCascades, shadowResolution, shadowNearPlane, out view, out proj, |
|||
out settings.splitData); |
|||
|
|||
float cullingSphereRadius = settings.splitData.cullingSphere.w; |
|||
m_CascadeSplitDistances[cascadeIndex] = settings.splitData.cullingSphere; |
|||
m_CascadeSplitRadii[cascadeIndex] = cullingSphereRadius * cullingSphereRadius; |
|||
|
|||
if (!success) |
|||
break; |
|||
|
|||
m_CascadeSlices[cascadeIndex].offsetX = (cascadeIndex % 2) * shadowResolution; |
|||
m_CascadeSlices[cascadeIndex].offsetY = (cascadeIndex / 2) * shadowResolution; |
|||
m_CascadeSlices[cascadeIndex].resolution = shadowResolution; |
|||
m_CascadeSlices[cascadeIndex].shadowTransform = GetShadowTransform(proj, view); |
|||
|
|||
// If we have shadow cascades baked into the atlas we bake cascade transform
|
|||
// in each shadow matrix to save shader ALU and L/S
|
|||
if (m_ShadowCasterCascadesCount > 1) |
|||
ApplySliceTransform(ref m_CascadeSlices[cascadeIndex], m_ShadowSettings.directionalShadowAtlasWidth, m_ShadowSettings.directionalShadowAtlasHeight); |
|||
|
|||
SetupShadowCasterConstants(cmd, ref shadowLight, proj, shadowResolution); |
|||
RenderShadowSlice(cmd, ref context, ref m_CascadeSlices[cascadeIndex], proj, view, settings); |
|||
} |
|||
|
|||
if (success) |
|||
{ |
|||
m_DirectionalShadowmapQuality = (m_ShadowSettings.directionalShadowQuality != LightShadows.Soft) ? LightShadows.Hard : light.shadows; |
|||
|
|||
// In order to avoid shader variants explosion we only do hard shadows when sampling shadowmap in the lit pass.
|
|||
// GLES2 platform is forced to hard single cascade shadows.
|
|||
if (!m_ShadowSettings.screenSpace) |
|||
m_DirectionalShadowmapQuality = LightShadows.Hard; |
|||
|
|||
SetupDirectionalShadowReceiverConstants(cmd, shadowLight, ref context); |
|||
} |
|||
|
|||
context.ExecuteCommandBuffer(cmd); |
|||
CommandBufferPool.Release(cmd); |
|||
return success; |
|||
} |
|||
|
|||
private void RenderLocalShadowmapAtlas(ref CullResults cullResults, ref LightData lightData, ref ScriptableRenderContext context) |
|||
{ |
|||
List<int> localLightIndices = lightData.localLightIndices; |
|||
List<VisibleLight> visibleLights = lightData.visibleLights; |
|||
|
|||
int shadowCastingLightsCount = 0; |
|||
int localLightsCount = localLightIndices.Count; |
|||
for (int i = 0; i < localLightsCount; ++i) |
|||
{ |
|||
VisibleLight shadowLight = visibleLights[localLightIndices[i]]; |
|||
|
|||
if (shadowLight.lightType == LightType.Spot && shadowLight.light.shadows != LightShadows.None) |
|||
shadowCastingLightsCount++; |
|||
} |
|||
|
|||
if (shadowCastingLightsCount == 0) |
|||
return; |
|||
|
|||
CommandBuffer cmd = CommandBufferPool.Get("Prepare Local Lights Shadowmap"); |
|||
Matrix4x4 view, proj; |
|||
Bounds bounds; |
|||
|
|||
// TODO: Add support to point light shadows. We make a simplification here that only works
|
|||
// for spot lights and with max spot shadows per pass.
|
|||
int atlasWidth = m_ShadowSettings.localShadowAtlasWidth; |
|||
int atlasHeight = m_ShadowSettings.localShadowAtlasHeight; |
|||
int sliceResolution = GetMaxTileResolutionInAtlas(atlasWidth, atlasHeight, shadowCastingLightsCount); |
|||
int shadowSampling = 0; |
|||
|
|||
m_LocalShadowmapTexture = RenderTexture.GetTemporary(m_LocalShadowmapDescriptor); |
|||
m_LocalShadowmapTexture.filterMode = FilterMode.Bilinear; |
|||
m_LocalShadowmapTexture.wrapMode = TextureWrapMode.Clamp; |
|||
|
|||
CoreUtils.SetRenderTarget(cmd, m_LocalShadowmapTexture, ClearFlag.Depth); |
|||
|
|||
for (int i = 0; i < localLightsCount; ++i) |
|||
{ |
|||
int shadowLightIndex = localLightIndices[i]; |
|||
VisibleLight shadowLight = visibleLights[shadowLightIndex]; |
|||
Light light = shadowLight.light; |
|||
|
|||
// TODO: Add support to point light shadows
|
|||
if (shadowLight.lightType != LightType.Spot || shadowLight.light.shadows == LightShadows.None) |
|||
continue; |
|||
|
|||
if (!cullResults.GetShadowCasterBounds(shadowLightIndex, out bounds)) |
|||
continue; |
|||
|
|||
var settings = new DrawShadowsSettings(cullResults, shadowLightIndex); |
|||
|
|||
if (cullResults.ComputeSpotShadowMatricesAndCullingPrimitives(shadowLightIndex, out view, out proj, out settings.splitData)) |
|||
{ |
|||
// This way of computing the shadow slice only work for spots and with most 4 shadow casting lights per pass
|
|||
// Change this when point lights are supported.
|
|||
Debug.Assert(localLightsCount <= 4 && shadowLight.lightType == LightType.Spot); |
|||
|
|||
// TODO: We need to pass bias and scale list to shader to be able to support multiple
|
|||
// shadow casting local lights.
|
|||
m_LocalLightSlices[i].offsetX = (i % 2) * sliceResolution; |
|||
m_LocalLightSlices[i].offsetY = (i / 2) * sliceResolution; |
|||
m_LocalLightSlices[i].resolution = sliceResolution; |
|||
m_LocalLightSlices[i].shadowTransform = GetShadowTransform(proj, view); |
|||
|
|||
if (shadowCastingLightsCount > 1) |
|||
ApplySliceTransform(ref m_LocalLightSlices[i], atlasWidth, atlasHeight); |
|||
|
|||
SetupShadowCasterConstants(cmd, ref shadowLight, proj, sliceResolution); |
|||
RenderShadowSlice(cmd, ref context, ref m_LocalLightSlices[i], proj, view, settings); |
|||
m_LocalShadowStrength[i] = light.shadowStrength; |
|||
shadowSampling = Math.Max(shadowSampling, (int)light.shadows); |
|||
} |
|||
} |
|||
|
|||
SetupLocalLightsShadowReceiverConstants(cmd, ref context); |
|||
|
|||
m_LocalShadowmapQuality = (LightShadows)Math.Min(shadowSampling, (int)m_ShadowSettings.directionalShadowQuality); |
|||
context.ExecuteCommandBuffer(cmd); |
|||
CommandBufferPool.Release(cmd); |
|||
} |
|||
|
|||
private Matrix4x4 GetShadowTransform(Matrix4x4 proj, Matrix4x4 view) |
|||
{ |
|||
// Currently CullResults ComputeDirectionalShadowMatricesAndCullingPrimitives doesn't
|
|||
// apply z reversal to projection matrix. We need to do it manually here.
|
|||
if (SystemInfo.usesReversedZBuffer) |
|||
{ |
|||
proj.m20 = -proj.m20; |
|||
proj.m21 = -proj.m21; |
|||
proj.m22 = -proj.m22; |
|||
proj.m23 = -proj.m23; |
|||
} |
|||
|
|||
Matrix4x4 worldToShadow = proj * view; |
|||
|
|||
var textureScaleAndBias = Matrix4x4.identity; |
|||
textureScaleAndBias.m00 = 0.5f; |
|||
textureScaleAndBias.m11 = 0.5f; |
|||
textureScaleAndBias.m22 = 0.5f; |
|||
textureScaleAndBias.m03 = 0.5f; |
|||
textureScaleAndBias.m23 = 0.5f; |
|||
textureScaleAndBias.m13 = 0.5f; |
|||
|
|||
// Apply texture scale and offset to save a MAD in shader.
|
|||
return textureScaleAndBias * worldToShadow; |
|||
} |
|||
|
|||
private void ApplySliceTransform(ref ShadowSliceData shadowSliceData, int atlasWidth, int atlasHeight) |
|||
{ |
|||
Matrix4x4 sliceTransform = Matrix4x4.identity; |
|||
float oneOverAtlasWidth = 1.0f / atlasWidth; |
|||
float oneOverAtlasHeight = 1.0f / atlasHeight; |
|||
sliceTransform.m00 = shadowSliceData.resolution * oneOverAtlasWidth; |
|||
sliceTransform.m11 = shadowSliceData.resolution * oneOverAtlasHeight; |
|||
sliceTransform.m03 = shadowSliceData.offsetX * oneOverAtlasWidth; |
|||
sliceTransform.m13 = shadowSliceData.offsetY * oneOverAtlasHeight; |
|||
|
|||
// Apply shadow slice scale and offset
|
|||
shadowSliceData.shadowTransform = sliceTransform * shadowSliceData.shadowTransform; |
|||
} |
|||
|
|||
private void RenderShadowSlice(CommandBuffer cmd, ref ScriptableRenderContext context, ref ShadowSliceData shadowSliceData, |
|||
Matrix4x4 proj, Matrix4x4 view, DrawShadowsSettings settings) |
|||
{ |
|||
cmd.SetViewport(new Rect(shadowSliceData.offsetX, shadowSliceData.offsetY, shadowSliceData.resolution, shadowSliceData.resolution)); |
|||
cmd.EnableScissorRect(new Rect(shadowSliceData.offsetX + 4, shadowSliceData.offsetY + 4, shadowSliceData.resolution - 8, shadowSliceData.resolution - 8)); |
|||
|
|||
cmd.SetViewProjectionMatrices(view, proj); |
|||
context.ExecuteCommandBuffer(cmd); |
|||
cmd.Clear(); |
|||
context.DrawShadows(ref settings); |
|||
cmd.DisableScissorRect(); |
|||
context.ExecuteCommandBuffer(cmd); |
|||
cmd.Clear(); |
|||
} |
|||
|
|||
private int GetMaxTileResolutionInAtlas(int atlasWidth, int atlasHeight, int tileCount) |
|||
{ |
|||
int resolution = Mathf.Min(atlasWidth, atlasHeight); |
|||
if (tileCount > Mathf.Log(resolution)) |
|||
{ |
|||
Debug.LogError( |
|||
String.Format( |
|||
"Cannot fit {0} tiles into current shadowmap atlas of size ({1}, {2}). ShadowMap Resolution set to zero.", |
|||
tileCount, atlasWidth, atlasHeight)); |
|||
return 0; |
|||
} |
|||
|
|||
int currentTileCount = atlasWidth / resolution * atlasHeight / resolution; |
|||
while (currentTileCount < tileCount) |
|||
{ |
|||
resolution = resolution >> 1; |
|||
currentTileCount = atlasWidth / resolution * atlasHeight / resolution; |
|||
} |
|||
return resolution; |
|||
} |
|||
|
|||
private void SetupShadowCasterConstants(CommandBuffer cmd, ref VisibleLight visibleLight, Matrix4x4 proj, float cascadeResolution) |
|||
{ |
|||
Light light = visibleLight.light; |
|||
float bias = 0.0f; |
|||
float normalBias = 0.0f; |
|||
|
|||
// Use same kernel radius as built-in pipeline so we can achieve same bias results
|
|||
// with the default light bias parameters.
|
|||
const float kernelRadius = 3.65f; |
|||
|
|||
if (visibleLight.lightType == LightType.Directional) |
|||
{ |
|||
// Scale bias by cascade's world space depth range.
|
|||
// Directional shadow lights have orthogonal projection.
|
|||
// proj.m22 = -2 / (far - near) since the projection's depth range is [-1.0, 1.0]
|
|||
// In order to be correct we should multiply bias by 0.5 but this introducing aliasing along cascades more visible.
|
|||
float sign = (SystemInfo.usesReversedZBuffer) ? 1.0f : -1.0f; |
|||
bias = light.shadowBias * proj.m22 * sign; |
|||
|
|||
// Currently only square POT cascades resolutions are used.
|
|||
// We scale normalBias
|
|||
double frustumWidth = 2.0 / (double)proj.m00; |
|||
double frustumHeight = 2.0 / (double)proj.m11; |
|||
float texelSizeX = (float)(frustumWidth / (double)cascadeResolution); |
|||
float texelSizeY = (float)(frustumHeight / (double)cascadeResolution); |
|||
float texelSize = Mathf.Max(texelSizeX, texelSizeY); |
|||
|
|||
// Since we are applying normal bias on caster side we want an inset normal offset
|
|||
// thus we use a negative normal bias.
|
|||
normalBias = -light.shadowNormalBias * texelSize * kernelRadius; |
|||
} |
|||
else if (visibleLight.lightType == LightType.Spot) |
|||
{ |
|||
float sign = (SystemInfo.usesReversedZBuffer) ? -1.0f : 1.0f; |
|||
bias = light.shadowBias * sign; |
|||
normalBias = 0.0f; |
|||
} |
|||
else |
|||
{ |
|||
Debug.LogWarning("Only spot and directional shadow casters are supported in lightweight pipeline"); |
|||
} |
|||
|
|||
Vector3 lightDirection = -visibleLight.localToWorld.GetColumn(2); |
|||
cmd.SetGlobalVector("_ShadowBias", new Vector4(bias, normalBias, 0.0f, 0.0f)); |
|||
cmd.SetGlobalVector("_LightDirection", new Vector4(lightDirection.x, lightDirection.y, lightDirection.z, 0.0f)); |
|||
} |
|||
|
|||
private void SetupDirectionalShadowReceiverConstants(CommandBuffer cmd, VisibleLight shadowLight, ref ScriptableRenderContext context) |
|||
{ |
|||
Light light = shadowLight.light; |
|||
|
|||
int cascadeCount = m_ShadowCasterCascadesCount; |
|||
for (int i = 0; i < kMaxCascades; ++i) |
|||
m_DirectionalShadowMatrices[i] = (cascadeCount >= i) ? m_CascadeSlices[i].shadowTransform : Matrix4x4.identity; |
|||
|
|||
// We setup and additional a no-op WorldToShadow matrix in the last index
|
|||
// because the ComputeCascadeIndex function in Shadows.hlsl can return an index
|
|||
// out of bounds. (position not inside any cascade) and we want to avoid branching
|
|||
Matrix4x4 noOpShadowMatrix = Matrix4x4.zero; |
|||
noOpShadowMatrix.m33 = (SystemInfo.usesReversedZBuffer) ? 1.0f : 0.0f; |
|||
m_DirectionalShadowMatrices[kMaxCascades] = noOpShadowMatrix; |
|||
|
|||
float invShadowAtlasWidth = 1.0f / m_ShadowSettings.directionalShadowAtlasWidth; |
|||
float invShadowAtlasHeight = 1.0f / m_ShadowSettings.directionalShadowAtlasHeight; |
|||
float invHalfShadowAtlasWidth = 0.5f * invShadowAtlasWidth; |
|||
float invHalfShadowAtlasHeight = 0.5f * invShadowAtlasHeight; |
|||
cmd.SetGlobalTexture(m_DirectionalShadowmapID, m_DirectionalShadowmapTexture); |
|||
cmd.SetGlobalMatrixArray(DirectionalShadowConstantBuffer._WorldToShadow, m_DirectionalShadowMatrices); |
|||
cmd.SetGlobalVector(DirectionalShadowConstantBuffer._ShadowData, new Vector4(light.shadowStrength, 0.0f, 0.0f, 0.0f)); |
|||
cmd.SetGlobalVectorArray(DirectionalShadowConstantBuffer._DirShadowSplitSpheres, m_CascadeSplitDistances); |
|||
cmd.SetGlobalVector(DirectionalShadowConstantBuffer._DirShadowSplitSphereRadii, m_CascadeSplitRadii); |
|||
cmd.SetGlobalVector(DirectionalShadowConstantBuffer._ShadowOffset0, new Vector4(-invHalfShadowAtlasWidth, -invHalfShadowAtlasHeight, 0.0f, 0.0f)); |
|||
cmd.SetGlobalVector(DirectionalShadowConstantBuffer._ShadowOffset1, new Vector4(invHalfShadowAtlasWidth, -invHalfShadowAtlasHeight, 0.0f, 0.0f)); |
|||
cmd.SetGlobalVector(DirectionalShadowConstantBuffer._ShadowOffset2, new Vector4(-invHalfShadowAtlasWidth, invHalfShadowAtlasHeight, 0.0f, 0.0f)); |
|||
cmd.SetGlobalVector(DirectionalShadowConstantBuffer._ShadowOffset3, new Vector4(invHalfShadowAtlasWidth, invHalfShadowAtlasHeight, 0.0f, 0.0f)); |
|||
cmd.SetGlobalVector(DirectionalShadowConstantBuffer._ShadowmapSize, new Vector4(invShadowAtlasWidth, invShadowAtlasHeight, |
|||
m_ShadowSettings.directionalShadowAtlasWidth, m_ShadowSettings.directionalShadowAtlasHeight)); |
|||
context.ExecuteCommandBuffer(cmd); |
|||
cmd.Clear(); |
|||
} |
|||
|
|||
private void SetupLocalLightsShadowReceiverConstants(CommandBuffer cmd, ref ScriptableRenderContext context) |
|||
{ |
|||
for (int i = 0; i < m_LocalLightSlices.Length; ++i) |
|||
m_LocalShadowMatrices[i] = m_LocalLightSlices[i].shadowTransform; |
|||
|
|||
float invShadowAtlasWidth = 1.0f / m_ShadowSettings.localShadowAtlasWidth; |
|||
float invShadowAtlasHeight = 1.0f / m_ShadowSettings.localShadowAtlasHeight; |
|||
float invHalfShadowAtlasWidth = 0.5f * invShadowAtlasWidth; |
|||
float invHalfShadowAtlasHeight = 0.5f * invShadowAtlasHeight; |
|||
|
|||
cmd.SetGlobalTexture(m_LocalShadowmapID, m_LocalShadowmapTexture); |
|||
cmd.SetGlobalMatrixArray(LocalShadowConstantBuffer._LocalWorldToShadowAtlas, m_LocalShadowMatrices); |
|||
cmd.SetGlobalFloatArray(LocalShadowConstantBuffer._LocalShadowStrength, m_LocalShadowStrength); |
|||
cmd.SetGlobalVector(LocalShadowConstantBuffer._LocalShadowOffset0, new Vector4(-invHalfShadowAtlasWidth, -invHalfShadowAtlasHeight, 0.0f, 0.0f)); |
|||
cmd.SetGlobalVector(LocalShadowConstantBuffer._LocalShadowOffset1, new Vector4(invHalfShadowAtlasWidth, -invHalfShadowAtlasHeight, 0.0f, 0.0f)); |
|||
cmd.SetGlobalVector(LocalShadowConstantBuffer._LocalShadowOffset2, new Vector4(-invHalfShadowAtlasWidth, invHalfShadowAtlasHeight, 0.0f, 0.0f)); |
|||
cmd.SetGlobalVector(LocalShadowConstantBuffer._LocalShadowOffset3, new Vector4(invHalfShadowAtlasWidth, invHalfShadowAtlasHeight, 0.0f, 0.0f)); |
|||
cmd.SetGlobalVector(LocalShadowConstantBuffer._LocalShadowmapSize, new Vector4(invShadowAtlasWidth, invShadowAtlasHeight, |
|||
m_ShadowSettings.localShadowAtlasWidth, m_ShadowSettings.localShadowAtlasHeight)); |
|||
context.ExecuteCommandBuffer(cmd); |
|||
cmd.Clear(); |
|||
} |
|||
}; |
|||
} |
|
|||
fileFormatVersion: 2 |
|||
guid: 51015cd4dddd59d4b95f01cf645067bd |
|||
MonoImporter: |
|||
externalObjects: {} |
|||
serializedVersion: 2 |
|||
defaultReferences: [] |
|||
executionOrder: 0 |
|||
icon: {instanceID: 0} |
|||
userData: |
|||
assetBundleName: |
|||
assetBundleVariant: |
|
|||
#ifndef LIGHTWEIGHT_INPUT_SURFACE_COMMON_INCLUDED |
|||
#define LIGHTWEIGHT_INPUT_SURFACE_COMMON_INCLUDED |
|||
|
|||
#include "Core.hlsl" |
|||
#include "CoreRP/ShaderLibrary/Packing.hlsl" |
|||
#include "CoreRP/ShaderLibrary/CommonMaterial.hlsl" |
|||
|
|||
TEXTURE2D(_MainTex); SAMPLER(sampler_MainTex); |
|||
TEXTURE2D(_BumpMap); SAMPLER(sampler_BumpMap); |
|||
TEXTURE2D(_EmissionMap); SAMPLER(sampler_EmissionMap); |
|||
|
|||
// Must match Lightweigth ShaderGraph master node |
|||
struct SurfaceData |
|||
{ |
|||
half3 albedo; |
|||
half3 specular; |
|||
half metallic; |
|||
half smoothness; |
|||
half3 normalTS; |
|||
half3 emission; |
|||
half occlusion; |
|||
half alpha; |
|||
}; |
|||
|
|||
/////////////////////////////////////////////////////////////////////////////// |
|||
// Material Property Helpers // |
|||
/////////////////////////////////////////////////////////////////////////////// |
|||
half Alpha(half albedoAlpha, half4 color, half cutoff) |
|||
{ |
|||
#if !defined(_SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A) && !defined(_GLOSSINESS_FROM_BASE_ALPHA) |
|||
half alpha = albedoAlpha * color.a; |
|||
#else |
|||
half alpha = color.a; |
|||
#endif |
|||
|
|||
#if defined(_ALPHATEST_ON) |
|||
clip(alpha - cutoff); |
|||
#endif |
|||
|
|||
return alpha; |
|||
} |
|||
|
|||
half4 SampleAlbedoAlpha(float2 uv, TEXTURE2D_ARGS(albedoAlphaMap, sampler_albedoAlphaMap)) |
|||
{ |
|||
return SAMPLE_TEXTURE2D(albedoAlphaMap, sampler_albedoAlphaMap, uv); |
|||
} |
|||
|
|||
half3 SampleNormal(float2 uv, TEXTURE2D_ARGS(bumpMap, sampler_bumpMap), half scale = 1.0h) |
|||
{ |
|||
#if _NORMALMAP |
|||
half4 n = SAMPLE_TEXTURE2D(bumpMap, sampler_bumpMap, uv); |
|||
#if BUMP_SCALE_NOT_SUPPORTED |
|||
return UnpackNormal(n); |
|||
#else |
|||
return UnpackNormalScale(n, scale); |
|||
#endif |
|||
#else |
|||
return half3(0.0h, 0.0h, 1.0h); |
|||
#endif |
|||
} |
|||
|
|||
half3 SampleEmission(float2 uv, half3 emissionColor, TEXTURE2D_ARGS(emissionMap, sampler_emissionMap)) |
|||
{ |
|||
#ifndef _EMISSION |
|||
return 0; |
|||
#else |
|||
return SAMPLE_TEXTURE2D(emissionMap, sampler_emissionMap, uv).rgb * emissionColor; |
|||
#endif |
|||
} |
|||
|
|||
#endif // LIGHTWEIGHT_INPUT_SURFACE_COMMON_INCLUDED |
|
|||
#ifndef LIGHTWEIGHT_INPUT_SURFACE_PBR_INCLUDED |
|||
#define LIGHTWEIGHT_INPUT_SURFACE_PBR_INCLUDED |
|||
|
|||
#include "Core.hlsl" |
|||
#include "CoreRP/ShaderLibrary/CommonMaterial.hlsl" |
|||
#include "InputSurfaceCommon.hlsl" |
|||
|
|||
CBUFFER_START(UnityPerMaterial) |
|||
float4 _MainTex_ST; |
|||
half4 _Color; |
|||
half4 _SpecColor; |
|||
half4 _EmissionColor; |
|||
half _Cutoff; |
|||
half _Glossiness; |
|||
half _GlossMapScale; |
|||
half _Metallic; |
|||
half _BumpScale; |
|||
half _OcclusionStrength; |
|||
CBUFFER_END |
|||
|
|||
TEXTURE2D(_OcclusionMap); SAMPLER(sampler_OcclusionMap); |
|||
TEXTURE2D(_MetallicGlossMap); SAMPLER(sampler_MetallicGlossMap); |
|||
TEXTURE2D(_SpecGlossMap); SAMPLER(sampler_SpecGlossMap); |
|||
|
|||
#ifdef _SPECULAR_SETUP |
|||
#define SAMPLE_METALLICSPECULAR(uv) SAMPLE_TEXTURE2D(_SpecGlossMap, sampler_SpecGlossMap, uv) |
|||
#else |
|||
#define SAMPLE_METALLICSPECULAR(uv) SAMPLE_TEXTURE2D(_MetallicGlossMap, sampler_MetallicGlossMap, uv) |
|||
#endif |
|||
|
|||
half4 SampleMetallicSpecGloss(float2 uv, half albedoAlpha) |
|||
{ |
|||
half4 specGloss; |
|||
|
|||
#ifdef _METALLICSPECGLOSSMAP |
|||
specGloss = SAMPLE_METALLICSPECULAR(uv); |
|||
#ifdef _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A |
|||
specGloss.a = albedoAlpha * _GlossMapScale; |
|||
#else |
|||
specGloss.a *= _GlossMapScale; |
|||
#endif |
|||
#else // _METALLICSPECGLOSSMAP |
|||
#if _SPECULAR_SETUP |
|||
specGloss.rgb = _SpecColor.rgb; |
|||
#else |
|||
specGloss.rgb = _Metallic.rrr; |
|||
#endif |
|||
|
|||
#ifdef _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A |
|||
specGloss.a = albedoAlpha * _GlossMapScale; |
|||
#else |
|||
specGloss.a = _Glossiness; |
|||
#endif |
|||
#endif |
|||
|
|||
return specGloss; |
|||
} |
|||
|
|||
half SampleOcclusion(float2 uv) |
|||
{ |
|||
#ifdef _OCCLUSIONMAP |
|||
#if (SHADER_TARGET < 30) |
|||
// SM20: instruction count limitation |
|||
// SM20: simpler occlusion |
|||
return SAMPLE_TEXTURE2D(_OcclusionMap, sampler_OcclusionMap, uv).g; |
|||
#else |
|||
half occ = SAMPLE_TEXTURE2D(_OcclusionMap, sampler_OcclusionMap, uv).g; |
|||
return LerpWhiteTo(occ, _OcclusionStrength); |
|||
#endif |
|||
#else |
|||
return 1.0; |
|||
#endif |
|||
} |
|||
|
|||
inline void InitializeStandardLitSurfaceData(float2 uv, out SurfaceData outSurfaceData) |
|||
{ |
|||
half4 albedoAlpha = SampleAlbedoAlpha(uv, TEXTURE2D_PARAM(_MainTex, sampler_MainTex)); |
|||
outSurfaceData.alpha = Alpha(albedoAlpha.a, _Color, _Cutoff); |
|||
|
|||
half4 specGloss = SampleMetallicSpecGloss(uv, albedoAlpha.a); |
|||
outSurfaceData.albedo = albedoAlpha.rgb * _Color.rgb; |
|||
|
|||
#if _SPECULAR_SETUP |
|||
outSurfaceData.metallic = 1.0h; |
|||
outSurfaceData.specular = specGloss.rgb; |
|||
#else |
|||
outSurfaceData.metallic = specGloss.r; |
|||
outSurfaceData.specular = half3(0.0h, 0.0h, 0.0h); |
|||
#endif |
|||
|
|||
outSurfaceData.smoothness = specGloss.a; |
|||
outSurfaceData.normalTS = SampleNormal(uv, TEXTURE2D_PARAM(_BumpMap, sampler_BumpMap), _BumpScale); |
|||
outSurfaceData.occlusion = SampleOcclusion(uv); |
|||
outSurfaceData.emission = SampleEmission(uv, _EmissionColor.rgb, TEXTURE2D_PARAM(_EmissionMap, sampler_EmissionMap)); |
|||
} |
|||
|
|||
#endif // LIGHTWEIGHT_INPUT_SURFACE_PBR_INCLUDED |
|
|||
fileFormatVersion: 2 |
|||
guid: c46f85bf266d7496d9b3659acfbdc711 |
|||
ShaderImporter: |
|||
externalObjects: {} |
|||
defaultTextures: [] |
|||
nonModifiableTextures: [] |
|||
userData: |
|||
assetBundleName: |
|||
assetBundleVariant: |
|
|||
#ifndef LIGHTWEIGHT_INPUT_SURFACE_SIMPLE_INCLUDED |
|||
#define LIGHTWEIGHT_INPUT_SURFACE_SIMPLE_INCLUDED |
|||
|
|||
#include "Core.hlsl" |
|||
#include "InputSurfaceCommon.hlsl" |
|||
|
|||
CBUFFER_START(UnityPerMaterial) |
|||
float4 _MainTex_ST; |
|||
half4 _Color; |
|||
half4 _SpecColor; |
|||
half4 _EmissionColor; |
|||
half _Cutoff; |
|||
half _Shininess; |
|||
CBUFFER_END |
|||
|
|||
TEXTURE2D(_SpecGlossMap); SAMPLER(sampler_SpecGlossMap); |
|||
|
|||
half4 SampleSpecularGloss(half2 uv, half alpha, half4 specColor, TEXTURE2D_ARGS(specGlossMap, sampler_specGlossMap)) |
|||
{ |
|||
half4 specularGloss = half4(0.0h, 0.0h, 0.0h, 1.0h); |
|||
#ifdef _SPECGLOSSMAP |
|||
specularGloss = SAMPLE_TEXTURE2D(specGlossMap, sampler_specGlossMap, uv); |
|||
#elif defined(_SPECULAR_COLOR) |
|||
specularGloss = specColor; |
|||
#endif |
|||
|
|||
#ifdef _GLOSSINESS_FROM_BASE_ALPHA |
|||
specularGloss.a = alpha; |
|||
#endif |
|||
return specularGloss; |
|||
} |
|||
|
|||
#endif // LIGHTWEIGHT_INPUT_SURFACE_SIMPLE_INCLUDED |
|
|||
fileFormatVersion: 2 |
|||
guid: ad863d097888f42c6bcf419efb2946c5 |
|||
ShaderImporter: |
|||
externalObjects: {} |
|||
defaultTextures: [] |
|||
nonModifiableTextures: [] |
|||
userData: |
|||
assetBundleName: |
|||
assetBundleVariant: |
|
|||
#ifndef LIGHTWEIGHT_INPUT_SURFACE_UNLIT_INCLUDED |
|||
#define LIGHTWEIGHT_INPUT_SURFACE_UNLIT_INCLUDED |
|||
|
|||
#include "Core.hlsl" |
|||
#include "InputSurfaceCommon.hlsl" |
|||
|
|||
CBUFFER_START(UnityPerMaterial) |
|||
float4 _MainTex_ST; |
|||
half4 _Color; |
|||
half _Cutoff; |
|||
half _Glossiness; |
|||
half _Metallic; |
|||
CBUFFER_END |
|||
|
|||
#endif // LIGHTWEIGHT_INPUT_SURFACE_UNLIT_INCLUDED |
|
|||
fileFormatVersion: 2 |
|||
guid: e7ba75cc852b14b7f934978b5697bf1b |
|||
ShaderImporter: |
|||
externalObjects: {} |
|||
defaultTextures: [] |
|||
nonModifiableTextures: [] |
|||
userData: |
|||
assetBundleName: |
|||
assetBundleVariant: |
|
|||
#ifndef LIGHTWEIGHT_PASS_LIT_INCLUDED |
|||
#define LIGHTWEIGHT_PASS_LIT_INCLUDED |
|||
|
|||
#include "LWRP/ShaderLibrary/Lighting.hlsl" |
|||
|
|||
struct LightweightVertexInput |
|||
{ |
|||
float4 vertex : POSITION; |
|||
float3 normal : NORMAL; |
|||
float4 tangent : TANGENT; |
|||
float2 texcoord : TEXCOORD0; |
|||
float2 lightmapUV : TEXCOORD1; |
|||
UNITY_VERTEX_INPUT_INSTANCE_ID |
|||
}; |
|||
|
|||
struct LightweightVertexOutput |
|||
{ |
|||
float2 uv : TEXCOORD0; |
|||
DECLARE_LIGHTMAP_OR_SH(lightmapUV, vertexSH, 1); |
|||
|
|||
float4 posWSShininess : TEXCOORD2; // xyz: posWS, w: Shininess * 128 |
|||
|
|||
#ifdef _NORMALMAP |
|||
half4 normal : TEXCOORD3; // xyz: normal, w: viewDir.x |
|||
half4 tangent : TEXCOORD4; // xyz: tangent, w: viewDir.y |
|||
half4 binormal : TEXCOORD5; // xyz: binormal, w: viewDir.z |
|||
#else |
|||
half3 normal : TEXCOORD3; |
|||
half3 viewDir : TEXCOORD4; |
|||
#endif |
|||
|
|||
half4 fogFactorAndVertexLight : TEXCOORD6; // x: fogFactor, yzw: vertex light |
|||
|
|||
#ifdef _SHADOWS_ENABLED |
|||
float4 shadowCoord : TEXCOORD7; |
|||
#endif |
|||
|
|||
float4 clipPos : SV_POSITION; |
|||
UNITY_VERTEX_INPUT_INSTANCE_ID |
|||
UNITY_VERTEX_OUTPUT_STEREO |
|||
}; |
|||
|
|||
void InitializeInputData(LightweightVertexOutput IN, half3 normalTS, out InputData inputData) |
|||
{ |
|||
inputData.positionWS = IN.posWSShininess.xyz; |
|||
|
|||
#ifdef _NORMALMAP |
|||
half3 viewDir = half3(IN.normal.w, IN.tangent.w, IN.binormal.w); |
|||
inputData.normalWS = TangentToWorldNormal(normalTS, IN.tangent.xyz, IN.binormal.xyz, IN.normal.xyz); |
|||
#else |
|||
half3 viewDir = IN.viewDir; |
|||
inputData.normalWS = FragmentNormalWS(IN.normal); |
|||
#endif |
|||
|
|||
inputData.viewDirectionWS = FragmentViewDirWS(viewDir); |
|||
#ifdef _SHADOWS_ENABLED |
|||
inputData.shadowCoord = IN.shadowCoord; |
|||
#else |
|||
inputData.shadowCoord = float4(0, 0, 0, 0); |
|||
#endif |
|||
inputData.fogCoord = IN.fogFactorAndVertexLight.x; |
|||
inputData.vertexLighting = IN.fogFactorAndVertexLight.yzw; |
|||
inputData.bakedGI = SAMPLE_GI(IN.lightmapUV, IN.vertexSH, inputData.normalWS); |
|||
} |
|||
|
|||
/////////////////////////////////////////////////////////////////////////////// |
|||
// Vertex and Fragment functions // |
|||
/////////////////////////////////////////////////////////////////////////////// |
|||
|
|||
// Used in Standard (Simple Lighting) shader |
|||
LightweightVertexOutput LitPassVertexSimple(LightweightVertexInput v) |
|||
{ |
|||
LightweightVertexOutput o = (LightweightVertexOutput)0; |
|||
|
|||
UNITY_SETUP_INSTANCE_ID(v); |
|||
UNITY_TRANSFER_INSTANCE_ID(v, o); |
|||
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); |
|||
|
|||
o.uv = TRANSFORM_TEX(v.texcoord, _MainTex); |
|||
|
|||
o.posWSShininess.xyz = TransformObjectToWorld(v.vertex.xyz); |
|||
o.posWSShininess.w = _Shininess * 128.0; |
|||
o.clipPos = TransformWorldToHClip(o.posWSShininess.xyz); |
|||
|
|||
half3 viewDir = VertexViewDirWS(GetCameraPositionWS() - o.posWSShininess.xyz); |
|||
|
|||
#ifdef _NORMALMAP |
|||
o.normal.w = viewDir.x; |
|||
o.tangent.w = viewDir.y; |
|||
o.binormal.w = viewDir.z; |
|||
#else |
|||
o.viewDir = viewDir; |
|||
#endif |
|||
|
|||
// initializes o.normal and if _NORMALMAP also o.tangent and o.binormal |
|||
OUTPUT_NORMAL(v, o); |
|||
|
|||
// We either sample GI from lightmap or SH. |
|||
// Lightmap UV and vertex SH coefficients use the same interpolator ("float2 lightmapUV" for lightmap or "half3 vertexSH" for SH) |
|||
// see DECLARE_LIGHTMAP_OR_SH macro. |
|||
// The following funcions initialize the correct variable with correct data |
|||
OUTPUT_LIGHTMAP_UV(v.lightmapUV, unity_LightmapST, o.lightmapUV); |
|||
OUTPUT_SH(o.normal.xyz, o.vertexSH); |
|||
|
|||
half3 vertexLight = VertexLighting(o.posWSShininess.xyz, o.normal.xyz); |
|||
half fogFactor = ComputeFogFactor(o.clipPos.z); |
|||
o.fogFactorAndVertexLight = half4(fogFactor, vertexLight); |
|||
|
|||
#ifdef _SHADOWS_ENABLED |
|||
#if SHADOWS_SCREEN |
|||
o.shadowCoord = ComputeShadowCoord(o.clipPos); |
|||
#else |
|||
o.shadowCoord = TransformWorldToShadowCoord(o.posWSShininess.xyz); |
|||
#endif |
|||
#endif |
|||
|
|||
return o; |
|||
} |
|||
|
|||
// Used for StandardSimpleLighting shader |
|||
half4 LitPassFragmentSimple(LightweightVertexOutput IN) : SV_Target |
|||
{ |
|||
UNITY_SETUP_INSTANCE_ID(IN); |
|||
|
|||
float2 uv = IN.uv; |
|||
half4 diffuseAlpha = SampleAlbedoAlpha(uv, TEXTURE2D_PARAM(_MainTex, sampler_MainTex)); |
|||
half3 diffuse = diffuseAlpha.rgb * _Color.rgb; |
|||
|
|||
half alpha = diffuseAlpha.a * _Color.a; |
|||
AlphaDiscard(alpha, _Cutoff); |
|||
#ifdef _ALPHAPREMULTIPLY_ON |
|||
diffuse *= alpha; |
|||
#endif |
|||
|
|||
half3 normalTS = SampleNormal(uv, TEXTURE2D_PARAM(_BumpMap, sampler_BumpMap)); |
|||
half3 emission = SampleEmission(uv, _EmissionColor.rgb, TEXTURE2D_PARAM(_EmissionMap, sampler_EmissionMap)); |
|||
half4 specularGloss = SampleSpecularGloss(uv, diffuseAlpha.a, _SpecColor, TEXTURE2D_PARAM(_SpecGlossMap, sampler_SpecGlossMap)); |
|||
half shininess = IN.posWSShininess.w; |
|||
|
|||
InputData inputData; |
|||
InitializeInputData(IN, normalTS, inputData); |
|||
|
|||
return LightweightFragmentBlinnPhong(inputData, diffuse, specularGloss, shininess, emission, alpha); |
|||
}; |
|||
|
|||
#endif |
|
|||
fileFormatVersion: 2 |
|||
guid: ee447e65526c7db45a978c16b28827a9 |
|||
timeCreated: 1488965025 |
|||
licenseType: Pro |
|||
ShaderImporter: |
|||
defaultTextures: [] |
|||
userData: |
|||
assetBundleName: |
|||
assetBundleVariant: |
|
|||
#ifndef LIGHTWEIGHT_PASS_META_PBR_INCLUDED |
|||
#define LIGHTWEIGHT_PASS_META_PBR_INCLUDED |
|||
|
|||
#include "LightweightPassMetaCommon.hlsl" |
|||
|
|||
half4 LightweightFragmentMeta(MetaVertexOuput i) : SV_Target |
|||
{ |
|||
SurfaceData surfaceData; |
|||
InitializeStandardLitSurfaceData(i.uv, surfaceData); |
|||
|
|||
BRDFData brdfData; |
|||
InitializeBRDFData(surfaceData.albedo, surfaceData.metallic, surfaceData.specular, surfaceData.smoothness, surfaceData.alpha, brdfData); |
|||
|
|||
MetaInput o; |
|||
o.Albedo = brdfData.diffuse + brdfData.specular * brdfData.roughness * 0.5; |
|||
o.SpecularColor = surfaceData.specular; |
|||
o.Emission = surfaceData.emission; |
|||
|
|||
return MetaFragment(o); |
|||
} |
|||
|
|||
#endif // LIGHTWEIGHT_PASS_META_PBR_INCLUDED |
|
|||
fileFormatVersion: 2 |
|||
guid: dcf4e762d48204e33b575f8007e3d563 |
|||
ShaderImporter: |
|||
externalObjects: {} |
|||
defaultTextures: [] |
|||
nonModifiableTextures: [] |
|||
userData: |
|||
assetBundleName: |
|||
assetBundleVariant: |
|
|||
#ifndef LIGHTWEIGHT_PASS_META_SIMPLE_INCLUDED |
|||
#define LIGHTWEIGHT_PASS_META_SIMPLE_INCLUDED |
|||
|
|||
#include "LightweightPassMetaCommon.hlsl" |
|||
|
|||
half4 LightweightFragmentMetaSimple(MetaVertexOuput i) : SV_Target |
|||
{ |
|||
float2 uv = i.uv; |
|||
MetaInput o; |
|||
o.Albedo = _Color.rgb * SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, uv).rgb; |
|||
o.SpecularColor = SampleSpecularGloss(uv, 1.0h, _SpecColor, TEXTURE2D_PARAM(_SpecGlossMap, sampler_SpecGlossMap)).xyz; |
|||
o.Emission = SampleEmission(uv, _EmissionColor.rgb, TEXTURE2D_PARAM(_EmissionMap, sampler_EmissionMap)); |
|||
|
|||
return MetaFragment(o); |
|||
} |
|||
|
|||
#endif // LIGHTWEIGHT_PASS_META_SIMPLE_INCLUDED |
|
|||
fileFormatVersion: 2 |
|||
guid: ffc632d1e38ef4682807a89afb2b966f |
|||
ShaderImporter: |
|||
externalObjects: {} |
|||
defaultTextures: [] |
|||
nonModifiableTextures: [] |
|||
userData: |
|||
assetBundleName: |
|||
assetBundleVariant: |
|
|||
#ifndef LIGHTWEIGHT_PARTICLES_PBR_INCLUDED |
|||
#define LIGHTWEIGHT_PARTICLES_PBR_INCLUDED |
|||
|
|||
#include "Particles.hlsl" |
|||
|
|||
TEXTURE2D(_MetallicGlossMap); SAMPLER(sampler_MetallicGlossMap); |
|||
|
|||
void InitializeSurfaceData(VertexOutputLit IN, out SurfaceData surfaceData) |
|||
{ |
|||
half4 albedo = SampleAlbedo(IN, TEXTURE2D_PARAM(_MainTex, sampler_MainTex)); |
|||
|
|||
#if defined(_METALLICGLOSSMAP) |
|||
half2 metallicGloss = readTexture(TEXTURE2D_PARAM(_MetallicGlossMap, sampler_MetallicGlossMap), IN).ra * half2(1.0, _Glossiness); |
|||
#else |
|||
half2 metallicGloss = half2(_Metallic, _Glossiness); |
|||
#endif |
|||
|
|||
half3 normalTS = SampleNormalTS(IN, TEXTURE2D_PARAM(_BumpMap, sampler_BumpMap), _BumpScale); |
|||
half3 emission = SampleEmission(IN, _EmissionColor.rgb, TEXTURE2D_PARAM(_EmissionMap, sampler_EmissionMap)); |
|||
|
|||
surfaceData.albedo = albedo.rgb; |
|||
surfaceData.specular = half3(0.0h, 0.0h, 0.0h); |
|||
surfaceData.normalTS = normalTS; |
|||
surfaceData.emission = emission; |
|||
surfaceData.metallic = metallicGloss.r; |
|||
surfaceData.smoothness = metallicGloss.g; |
|||
surfaceData.occlusion = 1.0; |
|||
|
|||
surfaceData.albedo = AlphaModulate(surfaceData.albedo, albedo.a); |
|||
surfaceData.alpha = AlphaBlendAndTest(albedo.a, _Cutoff); |
|||
} |
|||
|
|||
#endif // LIGHTWEIGHT_PARTICLES_PBR_INCLUDED |
|
|||
fileFormatVersion: 2 |
|||
guid: a3129e299d0744bb7bd42c2cea7cea2b |
|||
ShaderImporter: |
|||
externalObjects: {} |
|||
defaultTextures: [] |
|||
nonModifiableTextures: [] |
|||
userData: |
|||
assetBundleName: |
|||
assetBundleVariant: |
|
|||
fileFormatVersion: 2 |
|||
guid: efa36c22af7d342ad888a01f6eecabb4 |
|||
folderAsset: yes |
|||
DefaultImporter: |
|||
externalObjects: {} |
|||
userData: |
|||
assetBundleName: |
|||
assetBundleVariant: |
|
|||
Shader "Hidden/LightweightPipeline/Sampling" |
|||
{ |
|||
Properties |
|||
{ |
|||
_MainTex("Albedo", 2D) = "white" {} |
|||
} |
|||
|
|||
HLSLINCLUDE |
|||
#include "LWRP/ShaderLibrary/Core.hlsl" |
|||
|
|||
struct VertexInput |
|||
{ |
|||
float4 vertex : POSITION; |
|||
float2 texcoord : TEXCOORD0; |
|||
}; |
|||
|
|||
struct Interpolators |
|||
{ |
|||
float4 pos : SV_POSITION; |
|||
float2 texcoord : TEXCOORD0; |
|||
}; |
|||
|
|||
Interpolators Vertex(VertexInput i) |
|||
{ |
|||
Interpolators o; |
|||
UNITY_SETUP_INSTANCE_ID(i); |
|||
UNITY_TRANSFER_INSTANCE_ID(i, o); |
|||
|
|||
o.pos = TransformObjectToHClip(i.vertex.xyz); |
|||
o.texcoord.xy = i.texcoord; |
|||
return o; |
|||
} |
|||
|
|||
half4 DownsampleBox4Tap(TEXTURE2D_ARGS(tex, samplerTex), float2 uv, float2 texelSize, float amount) |
|||
{ |
|||
float4 d = texelSize.xyxy * float4(-amount, -amount, amount, amount); |
|||
|
|||
half4 s; |
|||
s = (SAMPLE_TEXTURE2D(tex, samplerTex, uv + d.xy)); |
|||
s += (SAMPLE_TEXTURE2D(tex, samplerTex, uv + d.zy)); |
|||
s += (SAMPLE_TEXTURE2D(tex, samplerTex, uv + d.xw)); |
|||
s += (SAMPLE_TEXTURE2D(tex, samplerTex, uv + d.zw)); |
|||
|
|||
return s * 0.25h; |
|||
} |
|||
|
|||
ENDHLSL |
|||
|
|||
SubShader |
|||
{ |
|||
Tags { "RenderType" = "Opaque" "RenderPipeline" = "LightweightPipeline"} |
|||
LOD 100 |
|||
|
|||
// 0 - Downsample - Box filtering |
|||
Pass |
|||
{ |
|||
Tags { "LightMode" = "LightweightForward"} |
|||
|
|||
ZTest Always |
|||
ZWrite Off |
|||
|
|||
HLSLPROGRAM |
|||
// Required to compile gles 2.0 with standard srp library |
|||
#pragma prefer_hlslcc gles |
|||
#pragma vertex Vertex |
|||
#pragma fragment FragBoxDownsample |
|||
|
|||
TEXTURE2D(_MainTex); |
|||
SAMPLER(sampler_MainTex); |
|||
float4 _MainTex_TexelSize; |
|||
|
|||
float _SampleOffset; |
|||
|
|||
half4 FragBoxDownsample(Interpolators i) : SV_Target |
|||
{ |
|||
half4 col = DownsampleBox4Tap(TEXTURE2D_PARAM(_MainTex, sampler_MainTex), i.texcoord, _MainTex_TexelSize.xy, _SampleOffset); |
|||
return half4(col.rgb, 1); |
|||
} |
|||
ENDHLSL |
|||
} |
|||
} |
|||
} |
|
|||
fileFormatVersion: 2 |
|||
guid: 04c410c9937594faa893a11dceb85f7e |
|||
timeCreated: 1505729520 |
|||
licenseType: Pro |
|||
ShaderImporter: |
|||
externalObjects: {} |
|||
defaultTextures: [] |
|||
userData: |
|||
assetBundleName: |
|||
assetBundleVariant: |
|
|||
fileFormatVersion: 2 |
|||
guid: cf2defa266cfe43e59a7230ff55c6107 |
|||
folderAsset: yes |
|||
DefaultImporter: |
|||
externalObjects: {} |
|||
userData: |
|||
assetBundleName: |
|||
assetBundleVariant: |
|
|||
fileFormatVersion: 2 |
|||
guid: ca55f7593a02f4c1ab1bdbc03282d7af |
|||
ShaderImporter: |
|||
externalObjects: {} |
|||
defaultTextures: [] |
|||
nonModifiableTextures: [] |
|||
userData: |
|||
assetBundleName: |
|||
assetBundleVariant: |
|
|||
#ifndef LIGHTWEIGHT_INPUT_SURFACE_PBR_INCLUDED |
|||
#define LIGHTWEIGHT_INPUT_SURFACE_PBR_INCLUDED |
|||
|
|||
#include "LWRP/ShaderLibrary/Core.hlsl" |
|||
#include "CoreRP/ShaderLibrary/CommonMaterial.hlsl" |
|||
#include "LWRP/ShaderLibrary/InputSurfaceCommon.hlsl" |
|||
|
|||
CBUFFER_START(_Terrain) |
|||
half _Metallic0, _Metallic1, _Metallic2, _Metallic3; |
|||
half _Smoothness0, _Smoothness1, _Smoothness2, _Smoothness3; |
|||
|
|||
float4 _Control_ST; |
|||
half4 _Splat0_ST, _Splat1_ST, _Splat2_ST, _Splat3_ST; |
|||
CBUFFER_END |
|||
|
|||
TEXTURE2D(_Control); SAMPLER(sampler_Control); |
|||
TEXTURE2D(_Splat0); SAMPLER(sampler_Splat0); |
|||
TEXTURE2D(_Splat1); |
|||
TEXTURE2D(_Splat2); |
|||
TEXTURE2D(_Splat3); |
|||
|
|||
#ifdef _TERRAIN_NORMAL_MAP |
|||
TEXTURE2D(_Normal0); SAMPLER(sampler_Normal0); |
|||
TEXTURE2D(_Normal1); |
|||
TEXTURE2D(_Normal2); |
|||
TEXTURE2D(_Normal3); |
|||
#endif |
|||
|
|||
TEXTURE2D(_SpecGlossMap); SAMPLER(sampler_SpecGlossMap); |
|||
|
|||
#endif // LIGHTWEIGHT_INPUT_SURFACE_PBR_INCLUDED |
|
|||
fileFormatVersion: 2 |
|||
guid: a817cb90496894b368593402e13b040c |
|||
ShaderImporter: |
|||
externalObjects: {} |
|||
defaultTextures: [] |
|||
nonModifiableTextures: [] |
|||
userData: |
|||
assetBundleName: |
|||
assetBundleVariant: |
|
|||
#ifndef LIGHTWEIGHT_INPUT_SURFACE_TERRAIN_BASE_INCLUDED |
|||
#define LIGHTWEIGHT_INPUT_SURFACE_TERRAIN_BASE_INCLUDED |
|||
|
|||
#include "LWRP/ShaderLibrary/Core.hlsl" |
|||
#include "CoreRP/ShaderLibrary/CommonMaterial.hlsl" |
|||
#include "LWRP/ShaderLibrary/InputSurfaceCommon.hlsl" |
|||
|
|||
CBUFFER_START(UnityPerMaterial) |
|||
float4 _MainTex_ST; |
|||
half4 _Color; |
|||
half _Cutoff; |
|||
CBUFFER_END |
|||
|
|||
TEXTURE2D(_MetallicTex); SAMPLER(sampler_MetallicTex); |
|||
|
|||
half4 SampleMetallicSpecGloss(float2 uv, half albedoAlpha) |
|||
{ |
|||
half4 specGloss; |
|||
specGloss = SAMPLE_TEXTURE2D(_MetallicTex, sampler_MetallicTex, uv); |
|||
specGloss.a = albedoAlpha; |
|||
return specGloss; |
|||
} |
|||
|
|||
inline void InitializeStandardLitSurfaceData(float2 uv, out SurfaceData outSurfaceData) |
|||
{ |
|||
half4 albedoSmoothness= SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, uv); |
|||
outSurfaceData.alpha = 1; |
|||
|
|||
half4 specGloss = SampleMetallicSpecGloss(uv, albedoSmoothness.a); |
|||
outSurfaceData.albedo = albedoSmoothness.rgb; |
|||
|
|||
outSurfaceData.metallic = specGloss.r; |
|||
outSurfaceData.specular = half3(0.0h, 0.0h, 0.0h); |
|||
|
|||
outSurfaceData.smoothness = specGloss.a; |
|||
outSurfaceData.normalTS = SampleNormal(uv, TEXTURE2D_PARAM(_BumpMap, sampler_BumpMap)); |
|||
outSurfaceData.occlusion = 1; |
|||
outSurfaceData.emission = 0; |
|||
} |
|||
|
|||
#endif // LIGHTWEIGHT_INPUT_SURFACE_TERRAIN_BASE_INCLUDED |
|
|||
fileFormatVersion: 2 |
|||
guid: fbd614929e4f04b8584f224142f1259d |
|||
ShaderImporter: |
|||
externalObjects: {} |
|||
defaultTextures: [] |
|||
nonModifiableTextures: [] |
|||
userData: |
|||
assetBundleName: |
|||
assetBundleVariant: |
|
|||
#ifndef LIGHTWEIGHT_PASS_DEPTH_ONLY_INCLUDED |
|||
#define LIGHTWEIGHT_PASS_DEPTH_ONLY_INCLUDED |
|||
|
|||
#include "LWRP/ShaderLibrary/Core.hlsl" |
|||
|
|||
struct VertexInput |
|||
{ |
|||
float4 position : POSITION; |
|||
half4 color : COLOR; |
|||
float2 texcoord : TEXCOORD0; |
|||
UNITY_VERTEX_INPUT_INSTANCE_ID |
|||
}; |
|||
|
|||
struct VertexOutput |
|||
{ |
|||
float2 uv : TEXCOORD0; |
|||
half4 color : TEXCOORD1; |
|||
float4 clipPos : SV_POSITION; |
|||
}; |
|||
|
|||
VertexOutput DepthOnlyVertex(VertexInput v) |
|||
{ |
|||
VertexOutput o = (VertexOutput)0; |
|||
UNITY_SETUP_INSTANCE_ID(v); |
|||
|
|||
o.uv = TRANSFORM_TEX(v.texcoord, _MainTex); |
|||
// MeshGrass v.color.a: 1 on top vertices, 0 on bottom vertices |
|||
// _WaveAndDistance.z == 0 for MeshLit |
|||
float waveAmount = v.color.a * _WaveAndDistance.z; |
|||
o.color = TerrainWaveGrass (v.position, waveAmount, v.color); |
|||
o.clipPos = TransformObjectToHClip(v.position.xyz); |
|||
return o; |
|||
} |
|||
|
|||
half4 DepthOnlyFragment(VertexOutput IN) : SV_TARGET |
|||
{ |
|||
Alpha(SampleAlbedoAlpha(IN.uv, TEXTURE2D_PARAM(_MainTex, sampler_MainTex)).a, IN.color, _Cutoff); |
|||
return 0; |
|||
} |
|||
#endif |
|
|||
fileFormatVersion: 2 |
|||
guid: 4f907bbd39d214935a038247d3b26b9b |
|||
timeCreated: 1488965025 |
|||
licenseType: Pro |
|||
ShaderImporter: |
|||
defaultTextures: [] |
|||
userData: |
|||
assetBundleName: |
|||
assetBundleVariant: |
|
|||
#ifndef LIGHTWEIGHT_PASS_LIT_INCLUDED |
|||
#define LIGHTWEIGHT_PASS_LIT_INCLUDED |
|||
|
|||
#include "LWRP/ShaderLibrary/Lighting.hlsl" |
|||
|
|||
struct GrassVertexInput |
|||
{ |
|||
float4 vertex : POSITION; |
|||
float3 normal : NORMAL; |
|||
float4 tangent : TANGENT; |
|||
half4 color : COLOR; |
|||
float2 texcoord : TEXCOORD0; |
|||
float2 lightmapUV : TEXCOORD1; |
|||
UNITY_VERTEX_INPUT_INSTANCE_ID |
|||
}; |
|||
|
|||
struct GrassVertexOutput |
|||
{ |
|||
float2 uv : TEXCOORD0; |
|||
DECLARE_LIGHTMAP_OR_SH(lightmapUV, vertexSH, 1); |
|||
|
|||
float4 posWSShininess : TEXCOORD2; // xyz: posWS, w: Shininess * 128 |
|||
|
|||
half3 normal : TEXCOORD3; |
|||
half3 viewDir : TEXCOORD4; |
|||
|
|||
half4 fogFactorAndVertexLight : TEXCOORD5; // x: fogFactor, yzw: vertex light |
|||
|
|||
#ifdef _SHADOWS_ENABLED |
|||
float4 shadowCoord : TEXCOORD6; |
|||
#endif |
|||
half4 color : TEXCOORD7; |
|||
|
|||
float4 clipPos : SV_POSITION; |
|||
UNITY_VERTEX_INPUT_INSTANCE_ID |
|||
UNITY_VERTEX_OUTPUT_STEREO |
|||
}; |
|||
|
|||
void InitializeInputData(GrassVertexOutput IN, out InputData inputData) |
|||
{ |
|||
inputData.positionWS = IN.posWSShininess.xyz; |
|||
|
|||
half3 viewDir = IN.viewDir; |
|||
inputData.normalWS = FragmentNormalWS(IN.normal); |
|||
|
|||
inputData.viewDirectionWS = FragmentViewDirWS(viewDir); |
|||
#ifdef _SHADOWS_ENABLED |
|||
inputData.shadowCoord = IN.shadowCoord; |
|||
#else |
|||
inputData.shadowCoord = float4(0, 0, 0, 0); |
|||
#endif |
|||
inputData.fogCoord = IN.fogFactorAndVertexLight.x; |
|||
inputData.vertexLighting = IN.fogFactorAndVertexLight.yzw; |
|||
inputData.bakedGI = SAMPLE_GI(IN.lightmapUV, IN.vertexSH, inputData.normalWS); |
|||
} |
|||
|
|||
void InitializeVertData(GrassVertexInput IN, inout GrassVertexOutput vertData) |
|||
{ |
|||
vertData.uv = IN.texcoord; |
|||
|
|||
vertData.posWSShininess.xyz = TransformObjectToWorld(IN.vertex.xyz); |
|||
vertData.posWSShininess.w = 32; |
|||
vertData.clipPos = TransformWorldToHClip(vertData.posWSShininess.xyz); |
|||
|
|||
half3 viewDir = VertexViewDirWS(GetCameraPositionWS() - vertData.posWSShininess.xyz); |
|||
vertData.viewDir = viewDir; |
|||
// initializes o.normal and if _NORMALMAP also o.tangent and o.binormal |
|||
OUTPUT_NORMAL(IN, vertData); |
|||
|
|||
// We either sample GI from lightmap or SH. |
|||
// Lightmap UV and vertex SH coefficients use the same interpolator ("float2 lightmapUV" for lightmap or "half3 vertexSH" for SH) |
|||
// see DECLARE_LIGHTMAP_OR_SH macro. |
|||
// The following funcions initialize the correct variable with correct data |
|||
OUTPUT_LIGHTMAP_UV(IN.lightmapUV, unity_LightmapST, vertData.lightmapUV); |
|||
OUTPUT_SH(vertData.normal.xyz, vertData.vertexSH); |
|||
|
|||
half3 vertexLight = VertexLighting(vertData.posWSShininess.xyz, vertData.normal.xyz); |
|||
half fogFactor = ComputeFogFactor(vertData.clipPos.z); |
|||
vertData.fogFactorAndVertexLight = half4(fogFactor, vertexLight); |
|||
|
|||
#ifdef _SHADOWS_ENABLED |
|||
#if SHADOWS_SCREEN |
|||
vertData.shadowCoord = ComputeShadowCoord(vertData.clipPos); |
|||
#else |
|||
vertData.shadowCoord = TransformWorldToShadowCoord(vertData.posWSShininess.xyz); |
|||
#endif |
|||
#endif |
|||
} |
|||
|
|||
/////////////////////////////////////////////////////////////////////////////// |
|||
// Vertex and Fragment functions // |
|||
/////////////////////////////////////////////////////////////////////////////// |
|||
|
|||
// Grass: appdata_full usage |
|||
// color - .xyz = color, .w = wave scale |
|||
// normal - normal |
|||
// tangent.xy - billboard extrusion |
|||
// texcoord - UV coords |
|||
// texcoord1 - 2nd UV coords |
|||
|
|||
GrassVertexOutput WavingGrassVert(GrassVertexInput v) |
|||
{ |
|||
GrassVertexOutput o = (GrassVertexOutput)0; |
|||
UNITY_SETUP_INSTANCE_ID(v); |
|||
UNITY_TRANSFER_INSTANCE_ID(v, o); |
|||
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); |
|||
|
|||
// MeshGrass v.color.a: 1 on top vertices, 0 on bottom vertices |
|||
// _WaveAndDistance.z == 0 for MeshLit |
|||
float waveAmount = v.color.a * _WaveAndDistance.z; |
|||
o.color = TerrainWaveGrass (v.vertex, waveAmount, v.color); |
|||
|
|||
InitializeVertData(v, o); |
|||
|
|||
return o; |
|||
} |
|||
|
|||
GrassVertexOutput WavingGrassBillboardVert(GrassVertexInput v) |
|||
{ |
|||
GrassVertexOutput o = (GrassVertexOutput)0; |
|||
UNITY_SETUP_INSTANCE_ID(v); |
|||
UNITY_TRANSFER_INSTANCE_ID(v, o); |
|||
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); |
|||
|
|||
TerrainBillboardGrass (v.vertex, v.tangent.xy); |
|||
// wave amount defined by the grass height |
|||
float waveAmount = v.tangent.y; |
|||
o.color = TerrainWaveGrass (v.vertex, waveAmount, v.color); |
|||
|
|||
InitializeVertData(v, o); |
|||
|
|||
return o; |
|||
} |
|||
|
|||
// Used for StandardSimpleLighting shader |
|||
half4 LitPassFragmentGrass(GrassVertexOutput IN) : SV_Target |
|||
{ |
|||
UNITY_SETUP_INSTANCE_ID(IN); |
|||
|
|||
float2 uv = IN.uv; |
|||
half4 diffuseAlpha = SampleAlbedoAlpha(uv, TEXTURE2D_PARAM(_MainTex, sampler_MainTex)); |
|||
half3 diffuse = diffuseAlpha.rgb * IN.color.rgb; |
|||
|
|||
half alpha = diffuseAlpha.a; |
|||
AlphaDiscard(alpha, _Cutoff); |
|||
alpha *= IN.color.a; |
|||
|
|||
half3 emission = 0; |
|||
half4 specularGloss = 0.1;// SampleSpecularGloss(uv, diffuseAlpha.a, _SpecColor, TEXTURE2D_PARAM(_SpecGlossMap, sampler_SpecGlossMap)); |
|||
half shininess = IN.posWSShininess.w; |
|||
|
|||
InputData inputData; |
|||
InitializeInputData(IN, inputData); |
|||
|
|||
return LightweightFragmentBlinnPhong(inputData, diffuse, specularGloss, shininess, emission, alpha); |
|||
}; |
|||
|
|||
#endif |
|
|||
fileFormatVersion: 2 |
|||
guid: b4bc78a1364154f15b718a412e9710b6 |
|||
timeCreated: 1488965025 |
|||
licenseType: Pro |
|||
ShaderImporter: |
|||
defaultTextures: [] |
|||
userData: |
|||
assetBundleName: |
|||
assetBundleVariant: |
|
|||
#ifndef LIGHTWEIGHT_PASS_LIT_TERRAIN_INCLUDED |
|||
#define LIGHTWEIGHT_PASS_LIT_TERRAIN_INCLUDED |
|||
|
|||
#include "LWRP/ShaderLibrary/Lighting.hlsl" |
|||
|
|||
struct VertexInput |
|||
{ |
|||
float4 vertex : POSITION; |
|||
float4 tangent : TANGENT; |
|||
float3 normal : NORMAL; |
|||
float2 texcoord : TEXCOORD0; |
|||
float2 texcoord1 : TEXCOORD1; |
|||
}; |
|||
|
|||
struct VertexOutput |
|||
{ |
|||
float4 uvSplat01 : TEXCOORD0; // xy: splat0, zw: splat1 |
|||
float4 uvSplat23 : TEXCOORD1; // xy: splat2, zw: splat3 |
|||
float4 uvControlAndLM : TEXCOORD2; // xy: control, zw: lightmap |
|||
half3 normal : TEXCOORD3; |
|||
#if _TERRAIN_NORMAL_MAP |
|||
half3 tangent : TEXCOORD4; |
|||
half3 binormal : TEXCOORD5; |
|||
#endif |
|||
half4 fogFactorAndVertexLight : TEXCOORD6; // x: fogFactor, yzw: vertex light |
|||
float3 positionWS : TEXCOORD7; |
|||
float4 shadowCoord : TEXCOORD8; |
|||
float4 clipPos : SV_POSITION; |
|||
}; |
|||
|
|||
void InitializeInputData(VertexOutput IN, half3 normalTS, out InputData input) |
|||
{ |
|||
input = (InputData)0; |
|||
|
|||
input.positionWS = IN.positionWS; |
|||
|
|||
#ifdef _TERRAIN_NORMAL_MAP |
|||
input.normalWS = TangentToWorldNormal(normalTS, IN.tangent, IN.binormal, IN.normal); |
|||
#else |
|||
input.normalWS = normalize(IN.normal); |
|||
#endif |
|||
|
|||
input.viewDirectionWS = SafeNormalize(GetCameraPositionWS() - IN.positionWS); |
|||
#ifdef _SHADOWS_ENABLED |
|||
input.shadowCoord = IN.shadowCoord; |
|||
#else |
|||
input.shadowCoord = float4(0, 0, 0, 0); |
|||
#endif |
|||
input.fogCoord = IN.fogFactorAndVertexLight.x; |
|||
input.vertexLighting = IN.fogFactorAndVertexLight.yzw; |
|||
|
|||
#ifdef LIGHTMAP_ON |
|||
input.bakedGI = SampleLightmap(IN.uvControlAndLM.zw, input.normalWS); |
|||
#endif |
|||
} |
|||
|
|||
void SplatmapMix(VertexOutput IN, half4 defaultAlpha, out half4 splat_control, out half weight, out half4 mixedDiffuse, inout half3 mixedNormal) |
|||
{ |
|||
splat_control = SAMPLE_TEXTURE2D(_Control, sampler_Control, IN.uvControlAndLM.xy); |
|||
weight = dot(splat_control, 1); |
|||
|
|||
#if !defined(SHADER_API_MOBILE) && defined(TERRAIN_SPLAT_ADDPASS) |
|||
clip(weight == 0.0f ? -1 : 1); |
|||
#endif |
|||
|
|||
// Normalize weights before lighting and restore weights in final modifier functions so that the overal |
|||
// lighting result can be correctly weighted. |
|||
splat_control /= (weight + 1e-3f); |
|||
|
|||
mixedDiffuse = 0.0f; |
|||
mixedDiffuse += splat_control.r * SAMPLE_TEXTURE2D(_Splat0, sampler_Splat0, IN.uvSplat01.xy) * half4(1.0, 1.0, 1.0, defaultAlpha.r); |
|||
mixedDiffuse += splat_control.g * SAMPLE_TEXTURE2D(_Splat1, sampler_Splat0, IN.uvSplat01.zw) * half4(1.0, 1.0, 1.0, defaultAlpha.g); |
|||
mixedDiffuse += splat_control.b * SAMPLE_TEXTURE2D(_Splat2, sampler_Splat0, IN.uvSplat23.xy) * half4(1.0, 1.0, 1.0, defaultAlpha.b); |
|||
mixedDiffuse += splat_control.a * SAMPLE_TEXTURE2D(_Splat3, sampler_Splat0, IN.uvSplat23.zw) * half4(1.0, 1.0, 1.0, defaultAlpha.a); |
|||
|
|||
#ifdef _TERRAIN_NORMAL_MAP |
|||
half4 nrm = 0.0f; |
|||
nrm += splat_control.r * SAMPLE_TEXTURE2D(_Normal0, sampler_Normal0, IN.uvSplat01.xy); |
|||
nrm += splat_control.g * SAMPLE_TEXTURE2D(_Normal1, sampler_Normal0, IN.uvSplat01.zw); |
|||
nrm += splat_control.b * SAMPLE_TEXTURE2D(_Normal2, sampler_Normal0, IN.uvSplat23.xy); |
|||
nrm += splat_control.a * SAMPLE_TEXTURE2D(_Normal3, sampler_Normal0, IN.uvSplat23.zw); |
|||
mixedNormal = UnpackNormal(nrm); |
|||
#else |
|||
mixedNormal = half3(0, 0, 1); |
|||
#endif |
|||
} |
|||
|
|||
void SplatmapFinalColor(inout half4 color, half fogCoord) |
|||
{ |
|||
color.rgb *= color.a; |
|||
#ifdef TERRAIN_SPLAT_ADDPASS |
|||
ApplyFogColor(color.rgb, half3(0,0,0), fogCoord); |
|||
#else |
|||
ApplyFog(color.rgb, fogCoord); |
|||
#endif |
|||
} |
|||
|
|||
/////////////////////////////////////////////////////////////////////////////// |
|||
// Vertex and Fragment functions // |
|||
/////////////////////////////////////////////////////////////////////////////// |
|||
|
|||
// Used in Standard Terrain shader |
|||
VertexOutput SplatmapVert(VertexInput v) |
|||
{ |
|||
VertexOutput o = (VertexOutput)0; |
|||
|
|||
float3 positionWS = TransformObjectToWorld(v.vertex.xyz); |
|||
float4 clipPos = TransformWorldToHClip(positionWS); |
|||
|
|||
o.uvSplat01.xy = TRANSFORM_TEX(v.texcoord, _Splat0); |
|||
o.uvSplat01.zw = TRANSFORM_TEX(v.texcoord, _Splat1); |
|||
o.uvSplat23.xy = TRANSFORM_TEX(v.texcoord, _Splat2); |
|||
o.uvSplat23.zw = TRANSFORM_TEX(v.texcoord, _Splat3); |
|||
o.uvControlAndLM.xy = TRANSFORM_TEX(v.texcoord, _Control); |
|||
o.uvControlAndLM.zw = v.texcoord1 * unity_LightmapST.xy + unity_LightmapST.zw; |
|||
|
|||
#ifdef _TERRAIN_NORMAL_MAP |
|||
float4 vertexTangent = float4(cross(v.normal, float3(0, 0, 1)), -1.0); |
|||
OutputTangentToWorld(vertexTangent, v.normal, o.tangent, o.binormal, o.normal); |
|||
#else |
|||
o.normal = TransformObjectToWorldNormal(v.normal); |
|||
#endif |
|||
o.fogFactorAndVertexLight.x = ComputeFogFactor(clipPos.z); |
|||
o.fogFactorAndVertexLight.yzw = VertexLighting(positionWS, o.normal); |
|||
o.positionWS = positionWS; |
|||
o.clipPos = clipPos; |
|||
|
|||
#ifdef _SHADOWS_ENABLED |
|||
#if SHADOWS_SCREEN |
|||
o.shadowCoord = ComputeShadowCoord(o.clipPos); |
|||
#else |
|||
o.shadowCoord = TransformWorldToShadowCoord(positionWS); |
|||
#endif |
|||
#endif |
|||
|
|||
return o; |
|||
} |
|||
|
|||
// Used in Standard Terrain shader |
|||
half4 SpatmapFragment(VertexOutput IN) : SV_TARGET |
|||
{ |
|||
half4 splat_control; |
|||
half weight; |
|||
half4 mixedDiffuse; |
|||
half4 defaultSmoothness = half4(_Smoothness0, _Smoothness1, _Smoothness2, _Smoothness3); |
|||
half3 normalTS; |
|||
SplatmapMix(IN, defaultSmoothness, splat_control, weight, mixedDiffuse, normalTS); |
|||
|
|||
half3 albedo = mixedDiffuse.rgb; |
|||
half smoothness = mixedDiffuse.a; |
|||
half metallic = dot(splat_control, half4(_Metallic0, _Metallic1, _Metallic2, _Metallic3)); |
|||
half3 specular = half3(0, 0, 0); |
|||
half alpha = weight; |
|||
|
|||
InputData inputData; |
|||
InitializeInputData(IN, normalTS, inputData); |
|||
half4 color = LightweightFragmentPBR(inputData, albedo, metallic, specular, smoothness, /* occlusion */ 1.0, /* emission */ half3(0, 0, 0), alpha); |
|||
|
|||
SplatmapFinalColor(color, inputData.fogCoord); |
|||
|
|||
return half4(color.rgb, 1); |
|||
} |
|||
|
|||
#endif // LIGHTWEIGHT_PASS_LIT_TERRAIN_INCLUDED |
|||
|
|
|||
fileFormatVersion: 2 |
|||
guid: ad25529ea2516421ab5f1a2440bee139 |
|||
timeCreated: 1488965025 |
|||
licenseType: Pro |
|||
ShaderImporter: |
|||
defaultTextures: [] |
|||
userData: |
|||
assetBundleName: |
|||
assetBundleVariant: |
|
|||
#ifndef LIGHTWEIGHT_INPUT_SURFACE_GRASS_INCLUDED |
|||
#define LIGHTWEIGHT_INPUT_SURFACE_GRASS_INCLUDED |
|||
|
|||
#include "LWRP/ShaderLibrary/Core.hlsl" |
|||
#include "LWRP/ShaderLibrary/InputSurfaceCommon.hlsl" |
|||
|
|||
// Terrain engine shader helpers |
|||
CBUFFER_START(TerrainGrass) |
|||
half4 _WavingTint; |
|||
float4 _WaveAndDistance; // wind speed, wave size, wind amount, max sqr distance |
|||
float4 _CameraPosition; // .xyz = camera position, .w = 1 / (max sqr distance) |
|||
float3 _CameraRight, _CameraUp; |
|||
CBUFFER_END |
|||
|
|||
CBUFFER_START(UnityPerMaterial) |
|||
float4 _MainTex_ST; |
|||
half4 _Color; |
|||
half4 _SpecColor; |
|||
half4 _EmissionColor; |
|||
half _Cutoff; |
|||
half _Shininess; |
|||
CBUFFER_END |
|||
|
|||
// ---- Grass helpers |
|||
|
|||
// Calculate a 4 fast sine-cosine pairs |
|||
// val: the 4 input values - each must be in the range (0 to 1) |
|||
// s: The sine of each of the 4 values |
|||
// c: The cosine of each of the 4 values |
|||
void FastSinCos (float4 val, out float4 s, out float4 c) { |
|||
val = val * 6.408849 - 3.1415927; |
|||
// powers for taylor series |
|||
float4 r5 = val * val; // wavevec ^ 2 |
|||
float4 r6 = r5 * r5; // wavevec ^ 4; |
|||
float4 r7 = r6 * r5; // wavevec ^ 6; |
|||
float4 r8 = r6 * r5; // wavevec ^ 8; |
|||
|
|||
float4 r1 = r5 * val; // wavevec ^ 3 |
|||
float4 r2 = r1 * r5; // wavevec ^ 5; |
|||
float4 r3 = r2 * r5; // wavevec ^ 7; |
|||
|
|||
|
|||
//Vectors for taylor's series expansion of sin and cos |
|||
float4 sin7 = {1, -0.16161616, 0.0083333, -0.00019841}; |
|||
float4 cos8 = {-0.5, 0.041666666, -0.0013888889, 0.000024801587}; |
|||
|
|||
// sin |
|||
s = val + r1 * sin7.y + r2 * sin7.z + r3 * sin7.w; |
|||
|
|||
// cos |
|||
c = 1 + r5 * cos8.x + r6 * cos8.y + r7 * cos8.z + r8 * cos8.w; |
|||
} |
|||
|
|||
half4 TerrainWaveGrass (inout float4 vertex, float waveAmount, half4 color) |
|||
{ |
|||
half4 _waveXSize = half4(0.012, 0.02, 0.06, 0.024) * _WaveAndDistance.y; |
|||
half4 _waveZSize = half4 (0.006, .02, 0.02, 0.05) * _WaveAndDistance.y; |
|||
half4 waveSpeed = half4 (1.2, 2, 1.6, 4.8); |
|||
|
|||
half4 _waveXmove = half4(0.024, 0.04, -0.12, 0.096); |
|||
half4 _waveZmove = half4 (0.006, .02, -0.02, 0.1); |
|||
|
|||
float4 waves; |
|||
waves = vertex.x * _waveXSize; |
|||
waves += vertex.z * _waveZSize; |
|||
|
|||
// Add in time to model them over time |
|||
waves += _WaveAndDistance.x * waveSpeed; |
|||
|
|||
float4 s, c; |
|||
waves = frac (waves); |
|||
FastSinCos (waves, s,c); |
|||
|
|||
s = s * s; |
|||
|
|||
s = s * s; |
|||
|
|||
half lighting = dot (s, normalize (half4 (1,1,.4,.2))) * 0.7; |
|||
|
|||
s = s * waveAmount; |
|||
|
|||
half3 waveMove = 0; |
|||
waveMove.x = dot (s, _waveXmove); |
|||
waveMove.z = dot (s, _waveZmove); |
|||
|
|||
vertex.xz -= waveMove.xz * _WaveAndDistance.z; |
|||
|
|||
// apply color animation |
|||
half3 waveColor = lerp (0.5, _WavingTint.rgb, lighting); |
|||
|
|||
// Fade the grass out before detail distance. |
|||
// Saturate because Radeon HD drivers on OS X 10.4.10 don't saturate vertex colors properly. |
|||
half3 offset = vertex.xyz - _CameraPosition.xyz; |
|||
color.a = saturate (2 * (_WaveAndDistance.w - dot (offset, offset)) * _CameraPosition.w); |
|||
|
|||
return half4(2 * waveColor * color.rgb, color.a); |
|||
} |
|||
|
|||
void TerrainBillboardGrass( inout float4 pos, float2 offset ) |
|||
{ |
|||
float3 grasspos = pos.xyz - _CameraPosition.xyz; |
|||
if (dot(grasspos, grasspos) > _WaveAndDistance.w) |
|||
offset = 0.0; |
|||
pos.xyz += offset.x * _CameraRight.xyz; |
|||
pos.y += offset.y; |
|||
} |
|||
|
|||
#endif // LIGHTWEIGHT_INPUT_SURFACE_GRASS_INCLUDED |
|
|||
Shader "LightweightPipeline/Terrain/Standard Terrain" |
|||
{ |
|||
Properties |
|||
{ |
|||
// set by terrain engine |
|||
[HideInInspector] _Control("Control (RGBA)", 2D) = "red" {} |
|||
[HideInInspector] _Splat3("Layer 3 (A)", 2D) = "grey" {} |
|||
[HideInInspector] _Splat2("Layer 2 (B)", 2D) = "grey" {} |
|||
[HideInInspector] _Splat1("Layer 1 (G)", 2D) = "grey" {} |
|||
[HideInInspector] _Splat0("Layer 0 (R)", 2D) = "grey" {} |
|||
[HideInInspector] _Normal3("Normal 3 (A)", 2D) = "bump" {} |
|||
[HideInInspector] _Normal2("Normal 2 (B)", 2D) = "bump" {} |
|||
[HideInInspector] _Normal1("Normal 1 (G)", 2D) = "bump" {} |
|||
[HideInInspector] _Normal0("Normal 0 (R)", 2D) = "bump" {} |
|||
[HideInInspector][Gamma] _Metallic0("Metallic 0", Range(0.0, 1.0)) = 0.0 |
|||
[HideInInspector][Gamma] _Metallic1("Metallic 1", Range(0.0, 1.0)) = 0.0 |
|||
[HideInInspector][Gamma] _Metallic2("Metallic 2", Range(0.0, 1.0)) = 0.0 |
|||
[HideInInspector][Gamma] _Metallic3("Metallic 3", Range(0.0, 1.0)) = 0.0 |
|||
[HideInInspector] _Smoothness0("Smoothness 0", Range(0.0, 1.0)) = 0.5 |
|||
[HideInInspector] _Smoothness1("Smoothness 1", Range(0.0, 1.0)) = 0.5 |
|||
[HideInInspector] _Smoothness2("Smoothness 2", Range(0.0, 1.0)) = 0.5 |
|||
[HideInInspector] _Smoothness3("Smoothness 3", Range(0.0, 1.0)) = 0.5 |
|||
|
|||
// used in fallback on old cards & base map |
|||
[HideInInspector] _MainTex("BaseMap (RGB)", 2D) = "grey" {} |
|||
[HideInInspector] _Color("Main Color", Color) = (1,1,1,1) |
|||
} |
|||
|
|||
SubShader |
|||
{ |
|||
Tags { "Queue" = "Geometry-100" "RenderType" = "Opaque" "RenderPipeline" = "LightweightPipeline" "IgnoreProjector" = "True"} |
|||
|
|||
Pass |
|||
{ |
|||
Tags { "LightMode" = "LightweightForward" } |
|||
HLSLPROGRAM |
|||
// Required to compile gles 2.0 with standard srp library |
|||
#pragma prefer_hlslcc gles |
|||
#pragma exclude_renderers d3d11_9x |
|||
#pragma target 3.0 |
|||
|
|||
#pragma vertex SplatmapVert |
|||
#pragma fragment SpatmapFragment |
|||
|
|||
#define _METALLICSPECGLOSSMAP 1 |
|||
#define _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A 1 |
|||
|
|||
// ------------------------------------- |
|||
// Lightweight Pipeline keywords |
|||
#pragma multi_compile _ _ADDITIONAL_LIGHTS |
|||
#pragma multi_compile _ _VERTEX_LIGHTS |
|||
#pragma multi_compile _ _MIXED_LIGHTING_SUBTRACTIVE |
|||
#pragma multi_compile _ _SHADOWS_ENABLED |
|||
|
|||
// ------------------------------------- |
|||
// Unity defined keywords |
|||
#pragma multi_compile _ DIRLIGHTMAP_COMBINED |
|||
#pragma multi_compile _ LIGHTMAP_ON |
|||
#pragma multi_compile_fog |
|||
|
|||
#pragma multi_compile __ _TERRAIN_NORMAL_MAP |
|||
|
|||
#include "LWRP/ShaderLibrary/Terrain/InputSurfaceTerrain.hlsl" |
|||
#include "LWRP/ShaderLibrary/Terrain/LightweightPassLitTerrain.hlsl" |
|||
|
|||
ENDHLSL |
|||
} |
|||
|
|||
Pass |
|||
{ |
|||
Tags{"LightMode" = "ShadowCaster"} |
|||
|
|||
ZWrite On |
|||
|
|||
HLSLPROGRAM |
|||
// Required to compile gles 2.0 with standard srp library |
|||
#pragma prefer_hlslcc gles |
|||
#pragma exclude_renderers d3d11_9x |
|||
#pragma target 2.0 |
|||
|
|||
#pragma vertex ShadowPassVertex |
|||
#pragma fragment ShadowPassFragment |
|||
|
|||
#include "LWRP/ShaderLibrary/InputSurfacePBR.hlsl" |
|||
#include "LWRP/ShaderLibrary/LightweightPassShadow.hlsl" |
|||
ENDHLSL |
|||
} |
|||
|
|||
Pass |
|||
{ |
|||
Tags{"LightMode" = "DepthOnly"} |
|||
|
|||
ZWrite On |
|||
ColorMask 0 |
|||
|
|||
HLSLPROGRAM |
|||
// Required to compile gles 2.0 with standard srp library |
|||
#pragma prefer_hlslcc gles |
|||
#pragma exclude_renderers d3d11_9x |
|||
#pragma target 2.0 |
|||
|
|||
#pragma vertex DepthOnlyVertex |
|||
#pragma fragment DepthOnlyFragment |
|||
|
|||
#include "LWRP/ShaderLibrary/InputSurfacePBR.hlsl" |
|||
#include "LWRP/ShaderLibrary/LightweightPassDepthOnly.hlsl" |
|||
ENDHLSL |
|||
} |
|||
} |
|||
Dependency "AddPassShader" = "Hidden/LightweightPipeline/Terrain/Standard Terrain Add Pass" |
|||
Dependency "BaseMapShader" = "Hidden/LightweightPipeline/Terrain/Standard Terrain Base" |
|||
|
|||
Fallback "Hidden/InternalErrorShader" |
|||
} |
|
|||
Shader "Hidden/LightweightPipeline/Terrain/Standard Terrain Add Pass" |
|||
{ |
|||
Properties |
|||
{ |
|||
// set by terrain engine |
|||
[HideInInspector] _Control("Control (RGBA)", 2D) = "red" {} |
|||
[HideInInspector] _Splat3("Layer 3 (A)", 2D) = "white" {} |
|||
[HideInInspector] _Splat2("Layer 2 (B)", 2D) = "white" {} |
|||
[HideInInspector] _Splat1("Layer 1 (G)", 2D) = "white" {} |
|||
[HideInInspector] _Splat0("Layer 0 (R)", 2D) = "white" {} |
|||
[HideInInspector] _Normal3("Normal 3 (A)", 2D) = "bump" {} |
|||
[HideInInspector] _Normal2("Normal 2 (B)", 2D) = "bump" {} |
|||
[HideInInspector] _Normal1("Normal 1 (G)", 2D) = "bump" {} |
|||
[HideInInspector] _Normal0("Normal 0 (R)", 2D) = "bump" {} |
|||
[HideInInspector][Gamma] _Metallic0("Metallic 0", Range(0.0, 1.0)) = 0.0 |
|||
[HideInInspector][Gamma] _Metallic1("Metallic 1", Range(0.0, 1.0)) = 0.0 |
|||
[HideInInspector][Gamma] _Metallic2("Metallic 2", Range(0.0, 1.0)) = 0.0 |
|||
[HideInInspector][Gamma] _Metallic3("Metallic 3", Range(0.0, 1.0)) = 0.0 |
|||
[HideInInspector] _Smoothness0("Smoothness 0", Range(0.0, 1.0)) = 1.0 |
|||
[HideInInspector] _Smoothness1("Smoothness 1", Range(0.0, 1.0)) = 1.0 |
|||
[HideInInspector] _Smoothness2("Smoothness 2", Range(0.0, 1.0)) = 1.0 |
|||
[HideInInspector] _Smoothness3("Smoothness 3", Range(0.0, 1.0)) = 1.0 |
|||
|
|||
// used in fallback on old cards & base map |
|||
[HideInInspector] _MainTex("BaseMap (RGB)", 2D) = "white" {} |
|||
[HideInInspector] _Color("Main Color", Color) = (1,1,1,1) |
|||
} |
|||
|
|||
SubShader |
|||
{ |
|||
Tags { "Queue" = "Geometry-99" "RenderType" = "Opaque" "RenderPipeline" = "LightweightPipeline" "IgnoreProjector" = "True"} |
|||
|
|||
Pass |
|||
{ |
|||
Tags { "LightMode" = "LightweightForward" } |
|||
Blend One One |
|||
HLSLPROGRAM |
|||
// Required to compile gles 2.0 with standard srp library |
|||
#pragma prefer_hlslcc gles |
|||
#pragma exclude_renderers d3d11_9x |
|||
#pragma target 3.0 |
|||
|
|||
#pragma vertex SplatmapVert |
|||
#pragma fragment SpatmapFragment |
|||
|
|||
// ------------------------------------- |
|||
// Lightweight Pipeline keywords |
|||
#pragma multi_compile _ _ADDITIONAL_LIGHTS |
|||
#pragma multi_compile _ _VERTEX_LIGHTS |
|||
#pragma multi_compile _ _MIXED_LIGHTING_SUBTRACTIVE |
|||
#pragma multi_compile _ _SHADOWS_ENABLED |
|||
|
|||
// ------------------------------------- |
|||
// Unity defined keywords |
|||
#pragma multi_compile _ DIRLIGHTMAP_COMBINED |
|||
#pragma multi_compile _ LIGHTMAP_ON |
|||
#pragma multi_compile_fog |
|||
|
|||
#pragma multi_compile __ _TERRAIN_NORMAL_MAP |
|||
#define TERRAIN_SPLAT_ADDPASS 1 |
|||
|
|||
#include "LWRP/ShaderLibrary/Terrain/InputSurfaceTerrain.hlsl" |
|||
#include "LWRP/ShaderLibrary/Terrain/LightweightPassLitTerrain.hlsl" |
|||
|
|||
ENDHLSL |
|||
} |
|||
} |
|||
Fallback "Hidden/InternalErrorShader" |
|||
} |
|
|||
fileFormatVersion: 2 |
|||
guid: 0a7e590f3cf1d4ee8a8fab5b6eff09ef |
|||
timeCreated: 1508929790 |
|||
licenseType: Pro |
|||
ShaderImporter: |
|||
externalObjects: {} |
|||
defaultTextures: [] |
|||
userData: |
|||
assetBundleName: |
|||
assetBundleVariant: |
|
|||
Shader "Hidden/LightweightPipeline/Terrain/Standard Terrain Base" |
|||
{ |
|||
Properties |
|||
{ |
|||
_Color("Color", Color) = (1,1,1,1) |
|||
_MainTex("Albedo(RGB), Smoothness(A)", 2D) = "white" {} |
|||
_MetallicTex ("Metallic (R)", 2D) = "black" {} |
|||
} |
|||
|
|||
SubShader |
|||
{ |
|||
Tags { "Queue" = "Geometry-100" "RenderType" = "Opaque" "RenderPipeline" = "LightweightPipeline" "IgnoreProjector" = "True"} |
|||
LOD 200 |
|||
|
|||
// ------------------------------------------------------------------ |
|||
// Forward pass. Shades all light in a single pass. GI + emission + Fog |
|||
Pass |
|||
{ |
|||
// Lightmode matches the ShaderPassName set in LightweightPipeline.cs. SRPDefaultUnlit and passes with |
|||
// no LightMode tag are also rendered by Lightweight Pipeline |
|||
Tags{"LightMode" = "LightweightForward"} |
|||
|
|||
HLSLPROGRAM |
|||
// Required to compile gles 2.0 with standard SRP library |
|||
// All shaders must be compiled with HLSLcc and currently only gles is not using HLSLcc by default |
|||
#pragma prefer_hlslcc gles |
|||
#pragma exclude_renderers d3d11_9x |
|||
#pragma target 2.0 |
|||
|
|||
// ------------------------------------- |
|||
// Material Keywords |
|||
#define _METALLICSPECGLOSSMAP 1 |
|||
#define _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A 1 |
|||
|
|||
// ------------------------------------- |
|||
// Lightweight Pipeline keywords |
|||
#pragma multi_compile _ _ADDITIONAL_LIGHTS |
|||
#pragma multi_compile _ _VERTEX_LIGHTS |
|||
#pragma multi_compile _ _MIXED_LIGHTING_SUBTRACTIVE |
|||
#pragma multi_compile _ _SHADOWS_ENABLED |
|||
|
|||
// TODO: Enabled this when we have C# keyword stripping |
|||
//#pragma multi_compile _ _LOCAL_SHADOWS_ENABLED |
|||
|
|||
// ------------------------------------- |
|||
// Unity defined keywords |
|||
#pragma multi_compile _ DIRLIGHTMAP_COMBINED |
|||
#pragma multi_compile _ LIGHTMAP_ON |
|||
#pragma multi_compile_fog |
|||
|
|||
//-------------------------------------- |
|||
// GPU Instancing |
|||
#pragma multi_compile_instancing |
|||
|
|||
#pragma vertex LitPassVertex |
|||
#pragma fragment LitPassFragment |
|||
|
|||
#include "LWRP/ShaderLibrary/Terrain/InputSurfaceTerrainBase.hlsl" |
|||
#include "LWRP/ShaderLibrary/LightweightPassLit.hlsl" |
|||
ENDHLSL |
|||
} |
|||
|
|||
Pass |
|||
{ |
|||
Tags{"LightMode" = "ShadowCaster"} |
|||
|
|||
ZWrite On |
|||
|
|||
HLSLPROGRAM |
|||
// Required to compile gles 2.0 with standard srp library |
|||
#pragma prefer_hlslcc gles |
|||
#pragma exclude_renderers d3d11_9x |
|||
#pragma target 2.0 |
|||
|
|||
//-------------------------------------- |
|||
// GPU Instancing |
|||
#pragma multi_compile_instancing |
|||
#define _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A 1 |
|||
|
|||
#pragma vertex ShadowPassVertex |
|||
#pragma fragment ShadowPassFragment |
|||
|
|||
#include "LWRP/ShaderLibrary/Terrain/InputSurfaceTerrainBase.hlsl" |
|||
#include "LWRP/ShaderLibrary/LightweightPassShadow.hlsl" |
|||
ENDHLSL |
|||
} |
|||
|
|||
Pass |
|||
{ |
|||
Tags{"LightMode" = "DepthOnly"} |
|||
|
|||
ZWrite On |
|||
ColorMask 0 |
|||
|
|||
HLSLPROGRAM |
|||
// Required to compile gles 2.0 with standard srp library |
|||
#pragma prefer_hlslcc gles |
|||
#pragma exclude_renderers d3d11_9x |
|||
#pragma target 2.0 |
|||
|
|||
#pragma vertex DepthOnlyVertex |
|||
#pragma fragment DepthOnlyFragment |
|||
|
|||
#define _METALLICSPECGLOSSMAP 1 |
|||
#define _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A 1 |
|||
|
|||
//-------------------------------------- |
|||
// GPU Instancing |
|||
#pragma multi_compile_instancing |
|||
|
|||
#include "LWRP/ShaderLibrary/Terrain/InputSurfaceTerrainBase.hlsl" |
|||
#include "LWRP/ShaderLibrary/LightweightPassDepthOnly.hlsl" |
|||
ENDHLSL |
|||
} |
|||
|
|||
// This pass it not used during regular rendering, only for lightmap baking. |
|||
Pass |
|||
{ |
|||
Tags{"LightMode" = "Meta"} |
|||
|
|||
HLSLPROGRAM |
|||
// Required to compile gles 2.0 with standard srp library |
|||
#pragma prefer_hlslcc gles |
|||
#pragma exclude_renderers d3d11_9x |
|||
#pragma target 2.0 |
|||
|
|||
#pragma vertex LightweightVertexMeta |
|||
#pragma fragment LightweightFragmentMeta |
|||
|
|||
#define _METALLICSPECGLOSSMAP 1 |
|||
#define _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A 1 |
|||
#pragma shader_feature EDITOR_VISUALIZATION |
|||
|
|||
#include "LWRP/ShaderLibrary/Terrain/InputSurfaceTerrainBase.hlsl" |
|||
#include "LWRP/ShaderLibrary/LightweightPassMetaPBR.hlsl" |
|||
|
|||
ENDHLSL |
|||
} |
|||
|
|||
} |
|||
FallBack "Hidden/InternalErrorShader" |
|||
CustomEditor "LightweightStandardGUI" |
|||
} |
|
|||
fileFormatVersion: 2 |
|||
guid: dd20536f4428f4376af4032e17f6add0 |
|||
timeCreated: 1503472755 |
|||
licenseType: Pro |
|||
ShaderImporter: |
|||
externalObjects: {} |
|||
defaultTextures: [] |
|||
userData: |
|||
assetBundleName: |
|||
assetBundleVariant: |
|
|||
// Unity built-in shader source. Copyright (c) 2016 Unity Technologies. MIT license (see license.txt) |
|||
Shader "Hidden/TerrainEngine/Details/WavingDoublePass" // Has to override the internal shaders so named like this |
|||
{ |
|||
Properties |
|||
{ |
|||
_WavingTint ("Fade Color", Color) = (.7,.6,.5, 0) |
|||
_MainTex ("Base (RGB) Alpha (A)", 2D) = "white" {} |
|||
_WaveAndDistance ("Wave and distance", Vector) = (12, 3.6, 1, 1) |
|||
_Cutoff ("Cutoff", float) = 0.5 |
|||
} |
|||
SubShader |
|||
{ |
|||
Tags {"Queue" = "Geometry+200" "RenderType" = "Grass" "IgnoreProjectors" = "True" "RenderPipeline" = "LightweightPipeline" }//"DisableBatching"="True" |
|||
Cull Off |
|||
LOD 200 |
|||
AlphaTest Greater [_Cutoff] |
|||
ColorMask RGB |
|||
|
|||
Pass |
|||
{ |
|||
HLSLPROGRAM |
|||
// Required to compile gles 2.0 with standard srp library |
|||
#pragma prefer_hlslcc gles |
|||
#pragma exclude_renderers d3d11_9x |
|||
#pragma target 2.0 |
|||
|
|||
// ------------------------------------- |
|||
// Lightweight Pipeline keywords |
|||
#pragma multi_compile _ _ADDITIONAL_LIGHTS |
|||
#pragma multi_compile _ _VERTEX_LIGHTS |
|||
#pragma multi_compile _ _MIXED_LIGHTING_SUBTRACTIVE |
|||
#pragma multi_compile _ _SHADOWS_ENABLED |
|||
|
|||
// TODO: Enabled this when we have C# keyword stripping |
|||
//#pragma multi_compile _ _LOCAL_SHADOWS_ENABLED |
|||
|
|||
// ------------------------------------- |
|||
// Unity defined keywords |
|||
#pragma multi_compile _ DIRLIGHTMAP_COMBINED |
|||
#pragma multi_compile _ LIGHTMAP_ON |
|||
#pragma multi_compile_fog |
|||
|
|||
//-------------------------------------- |
|||
// GPU Instancing |
|||
#pragma multi_compile_instancing |
|||
|
|||
#pragma vertex WavingGrassVert |
|||
#pragma fragment LitPassFragmentGrass |
|||
#define _ALPHATEST_ON |
|||
|
|||
|
|||
#include "LWRP/ShaderLibrary/Terrain/InputSurfaceGrass.hlsl" |
|||
#include "LWRP/ShaderLibrary/Terrain/LightweightPassLitGrass.hlsl" |
|||
|
|||
ENDHLSL |
|||
} |
|||
|
|||
Pass |
|||
{ |
|||
Tags{"LightMode" = "DepthOnly"} |
|||
|
|||
ZWrite On |
|||
ColorMask 0 |
|||
Cull Off |
|||
|
|||
HLSLPROGRAM |
|||
// Required to compile gles 2.0 with standard srp library |
|||
#pragma prefer_hlslcc gles |
|||
#pragma exclude_renderers d3d11_9x |
|||
#pragma target 2.0 |
|||
|
|||
#pragma vertex DepthOnlyVertex |
|||
#pragma fragment DepthOnlyFragment |
|||
|
|||
// ------------------------------------- |
|||
// Material Keywords |
|||
#define _ALPHATEST_ON |
|||
#pragma shader_feature _GLOSSINESS_FROM_BASE_ALPHA |
|||
|
|||
//-------------------------------------- |
|||
// GPU Instancing |
|||
#pragma multi_compile_instancing |
|||
|
|||
#include "LWRP/ShaderLibrary/Terrain/InputSurfaceGrass.hlsl" |
|||
#include "LWRP/ShaderLibrary/Terrain/LightweightPassDepthOnlyGrass.hlsl" |
|||
ENDHLSL |
|||
} |
|||
} |
|||
} |
|
|||
fileFormatVersion: 2 |
|||
guid: e507fdfead5ca47e8b9a768b51c291a1 |
|||
ShaderImporter: |
|||
externalObjects: {} |
|||
defaultTextures: [] |
|||
nonModifiableTextures: [] |
|||
userData: |
|||
assetBundleName: |
|||
assetBundleVariant: |
|
|||
// Unity built-in shader source. Copyright (c) 2016 Unity Technologies. MIT license (see license.txt) |
|||
Shader "Hidden/TerrainEngine/Details/BillboardWavingDoublePass" // Has to override the internal shaders so named like this |
|||
{ |
|||
Properties |
|||
{ |
|||
_WavingTint ("Fade Color", Color) = (.7,.6,.5, 0) |
|||
_MainTex ("Base (RGB) Alpha (A)", 2D) = "white" {} |
|||
_WaveAndDistance ("Wave and distance", Vector) = (12, 3.6, 1, 1) |
|||
_Cutoff ("Cutoff", float) = 0.5 |
|||
} |
|||
SubShader |
|||
{ |
|||
Tags {"Queue" = "Geometry+200" "RenderType" = "GrassBillBoard" "IgnoreProjectors" = "True" "RenderPipeline" = "LightweightPipeline" }//"DisableBatching"="True" |
|||
Cull Off |
|||
LOD 200 |
|||
AlphaTest Greater [_Cutoff] |
|||
ColorMask RGB |
|||
|
|||
Pass |
|||
{ |
|||
HLSLPROGRAM |
|||
// Required to compile gles 2.0 with standard srp library |
|||
#pragma prefer_hlslcc gles |
|||
#pragma exclude_renderers d3d11_9x |
|||
#pragma target 2.0 |
|||
|
|||
// ------------------------------------- |
|||
// Lightweight Pipeline keywords |
|||
#pragma multi_compile _ _ADDITIONAL_LIGHTS |
|||
#pragma multi_compile _ _VERTEX_LIGHTS |
|||
#pragma multi_compile _ _MIXED_LIGHTING_SUBTRACTIVE |
|||
#pragma multi_compile _ _SHADOWS_ENABLED |
|||
|
|||
// TODO: Enabled this when we have C# keyword stripping |
|||
//#pragma multi_compile _ _LOCAL_SHADOWS_ENABLED |
|||
|
|||
// ------------------------------------- |
|||
// Unity defined keywords |
|||
#pragma multi_compile _ DIRLIGHTMAP_COMBINED |
|||
#pragma multi_compile _ LIGHTMAP_ON |
|||
#pragma multi_compile_fog |
|||
|
|||
//-------------------------------------- |
|||
// GPU Instancing |
|||
#pragma multi_compile_instancing |
|||
|
|||
#pragma vertex WavingGrassBillboardVert |
|||
#pragma fragment LitPassFragmentGrass |
|||
#define _ALPHATEST_ON |
|||
|
|||
|
|||
#include "LWRP/ShaderLibrary/Terrain/InputSurfaceGrass.hlsl" |
|||
#include "LWRP/ShaderLibrary/Terrain/LightweightPassLitGrass.hlsl" |
|||
|
|||
ENDHLSL |
|||
} |
|||
|
|||
Pass |
|||
{ |
|||
Tags{"LightMode" = "DepthOnly"} |
|||
|
|||
ZWrite On |
|||
ColorMask 0 |
|||
Cull Off |
|||
|
|||
HLSLPROGRAM |
|||
// Required to compile gles 2.0 with standard srp library |
|||
#pragma prefer_hlslcc gles |
|||
#pragma exclude_renderers d3d11_9x |
|||
#pragma target 2.0 |
|||
|
|||
#pragma vertex DepthOnlyVertex |
|||
#pragma fragment DepthOnlyFragment |
|||
|
|||
// ------------------------------------- |
|||
// Material Keywords |
|||
#define _ALPHATEST_ON |
|||
#pragma shader_feature _GLOSSINESS_FROM_BASE_ALPHA |
|||
|
|||
//-------------------------------------- |
|||
// GPU Instancing |
|||
#pragma multi_compile_instancing |
|||
|
|||
#include "LWRP/ShaderLibrary/Terrain/InputSurfaceGrass.hlsl" |
|||
#include "LWRP/ShaderLibrary/Terrain/LightweightPassDepthOnlyGrass.hlsl" |
|||
ENDHLSL |
|||
} |
|||
} |
|||
} |
|
|||
fileFormatVersion: 2 |
|||
guid: 29868e73b638e48ca99a19ea58c48d90 |
|||
ShaderImporter: |
|||
externalObjects: {} |
|||
defaultTextures: [] |
|||
nonModifiableTextures: [] |
|||
userData: |
|||
assetBundleName: |
|||
assetBundleVariant: |
|
|||
#ifndef LIGHTWEIGHT_SURFACE_INPUT_INCLUDED |
|||
#define LIGHTWEIGHT_SURFACE_INPUT_INCLUDED |
|||
|
|||
#include "Core.hlsl" |
|||
#include "CoreRP/ShaderLibrary/Packing.hlsl" |
|||
#include "CoreRP/ShaderLibrary/CommonMaterial.hlsl" |
|||
|
|||
#ifdef _SPECULAR_SETUP |
|||
#define SAMPLE_METALLICSPECULAR(uv) SAMPLE_TEXTURE2D(_SpecGlossMap, sampler_SpecGlossMap, uv) |
|||
#else |
|||
#define SAMPLE_METALLICSPECULAR(uv) SAMPLE_TEXTURE2D(_MetallicGlossMap, sampler_MetallicGlossMap, uv) |
|||
#endif |
|||
|
|||
CBUFFER_START(UnityPerMaterial) |
|||
float4 _MainTex_ST; |
|||
half4 _Color; |
|||
half4 _SpecColor; |
|||
half4 _EmissionColor; |
|||
half _Cutoff; |
|||
half _Glossiness; |
|||
half _GlossMapScale; |
|||
half _Metallic; |
|||
half _BumpScale; |
|||
half _OcclusionStrength; |
|||
half _Shininess; |
|||
CBUFFER_END |
|||
|
|||
TEXTURE2D(_MainTex); SAMPLER(sampler_MainTex); |
|||
TEXTURE2D(_MetallicGlossMap); SAMPLER(sampler_MetallicGlossMap); |
|||
TEXTURE2D(_SpecGlossMap); SAMPLER(sampler_SpecGlossMap); |
|||
TEXTURE2D(_BumpMap); SAMPLER(sampler_BumpMap); |
|||
TEXTURE2D(_OcclusionMap); SAMPLER(sampler_OcclusionMap); |
|||
TEXTURE2D(_EmissionMap); SAMPLER(sampler_EmissionMap); |
|||
|
|||
// Must match Lightweigth ShaderGraph master node |
|||
struct SurfaceData |
|||
{ |
|||
half3 albedo; |
|||
half3 specular; |
|||
half metallic; |
|||
half smoothness; |
|||
half3 normalTS; |
|||
half3 emission; |
|||
half occlusion; |
|||
half alpha; |
|||
}; |
|||
|
|||
/////////////////////////////////////////////////////////////////////////////// |
|||
// Material Property Helpers // |
|||
/////////////////////////////////////////////////////////////////////////////// |
|||
float2 TransformMainTextureCoord(float2 uv) |
|||
{ |
|||
return TRANSFORM_TEX(uv, _MainTex); |
|||
} |
|||
|
|||
half Alpha(half albedoAlpha) |
|||
{ |
|||
#if !defined(_SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A) && !defined(_GLOSSINESS_FROM_BASE_ALPHA) |
|||
half alpha = albedoAlpha * _Color.a; |
|||
#else |
|||
half alpha = _Color.a; |
|||
#endif |
|||
|
|||
#if defined(_ALPHATEST_ON) |
|||
clip(alpha - _Cutoff); |
|||
#endif |
|||
|
|||
return alpha; |
|||
} |
|||
|
|||
half4 MainTexture(float2 uv) |
|||
{ |
|||
return SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, uv); |
|||
} |
|||
|
|||
half3 Normal(float2 uv) |
|||
{ |
|||
#if _NORMALMAP |
|||
#if BUMP_SCALE_NOT_SUPPORTED |
|||
return UnpackNormal(SAMPLE_TEXTURE2D(_BumpMap, sampler_BumpMap, uv)); |
|||
#else |
|||
return UnpackNormalScale(SAMPLE_TEXTURE2D(_BumpMap, sampler_BumpMap, uv), _BumpScale); |
|||
#endif |
|||
#else |
|||
return half3(0.0h, 0.0h, 1.0h); |
|||
#endif |
|||
} |
|||
|
|||
half4 SpecularGloss(half2 uv, half alpha) |
|||
{ |
|||
half4 specularGloss = half4(0, 0, 0, 1); |
|||
#ifdef _SPECGLOSSMAP |
|||
specularGloss = SAMPLE_TEXTURE2D(_SpecGlossMap, sampler_SpecGlossMap, uv); |
|||
#elif defined(_SPECULAR_COLOR) |
|||
specularGloss = _SpecColor; |
|||
#endif |
|||
|
|||
#ifdef _GLOSSINESS_FROM_BASE_ALPHA |
|||
specularGloss.a = alpha; |
|||
#endif |
|||
return specularGloss; |
|||
} |
|||
|
|||
half4 MetallicSpecGloss(float2 uv, half albedoAlpha) |
|||
{ |
|||
half4 specGloss; |
|||
|
|||
#ifdef _METALLICSPECGLOSSMAP |
|||
specGloss = SAMPLE_METALLICSPECULAR(uv); |
|||
#ifdef _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A |
|||
specGloss.a = albedoAlpha * _GlossMapScale; |
|||
#else |
|||
specGloss.a *= _GlossMapScale; |
|||
#endif |
|||
#else // _METALLICSPECGLOSSMAP |
|||
#if _SPECULAR_SETUP |
|||
specGloss.rgb = _SpecColor.rgb; |
|||
#else |
|||
specGloss.rgb = _Metallic.rrr; |
|||
#endif |
|||
|
|||
#ifdef _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A |
|||
specGloss.a = albedoAlpha * _GlossMapScale; |
|||
#else |
|||
specGloss.a = _Glossiness; |
|||
#endif |
|||
#endif |
|||
|
|||
return specGloss; |
|||
} |
|||
|
|||
half Occlusion(float2 uv) |
|||
{ |
|||
#ifdef _OCCLUSIONMAP |
|||
#if (SHADER_TARGET < 30) |
|||
// SM20: instruction count limitation |
|||
// SM20: simpler occlusion |
|||
return SAMPLE_TEXTURE2D(_OcclusionMap, sampler_OcclusionMap, uv).g; |
|||
#else |
|||
half occ = SAMPLE_TEXTURE2D(_OcclusionMap, sampler_OcclusionMap, uv).g; |
|||
return LerpWhiteTo(occ, _OcclusionStrength); |
|||
#endif |
|||
#else |
|||
return 1.0; |
|||
#endif |
|||
} |
|||
|
|||
half3 Emission(float2 uv) |
|||
{ |
|||
#ifndef _EMISSION |
|||
return 0; |
|||
#else |
|||
return SAMPLE_TEXTURE2D(_EmissionMap, sampler_EmissionMap, uv).rgb * _EmissionColor.rgb; |
|||
#endif |
|||
} |
|||
|
|||
inline void InitializeStandardLitSurfaceData(float2 uv, out SurfaceData outSurfaceData) |
|||
{ |
|||
half4 albedoAlpha = MainTexture(uv); |
|||
|
|||
half4 specGloss = MetallicSpecGloss(uv, albedoAlpha.a); |
|||
outSurfaceData.albedo = albedoAlpha.rgb * _Color.rgb; |
|||
|
|||
#if _SPECULAR_SETUP |
|||
outSurfaceData.metallic = 1.0h; |
|||
outSurfaceData.specular = specGloss.rgb; |
|||
#else |
|||
outSurfaceData.metallic = specGloss.r; |
|||
outSurfaceData.specular = half3(0.0h, 0.0h, 0.0h); |
|||
#endif |
|||
|
|||
outSurfaceData.smoothness = specGloss.a; |
|||
outSurfaceData.normalTS = Normal(uv); |
|||
outSurfaceData.occlusion = Occlusion(uv); |
|||
outSurfaceData.emission = Emission(uv); |
|||
outSurfaceData.alpha = Alpha(albedoAlpha.a); |
|||
} |
|||
|
|||
#endif |
|
|||
Shader "LightweightPipeline/Standard Terrain" |
|||
{ |
|||
Properties |
|||
{ |
|||
// set by terrain engine |
|||
[HideInInspector] _Control("Control (RGBA)", 2D) = "red" {} |
|||
[HideInInspector] _Splat3("Layer 3 (A)", 2D) = "white" {} |
|||
[HideInInspector] _Splat2("Layer 2 (B)", 2D) = "white" {} |
|||
[HideInInspector] _Splat1("Layer 1 (G)", 2D) = "white" {} |
|||
[HideInInspector] _Splat0("Layer 0 (R)", 2D) = "white" {} |
|||
[HideInInspector] _Normal3("Normal 3 (A)", 2D) = "bump" {} |
|||
[HideInInspector] _Normal2("Normal 2 (B)", 2D) = "bump" {} |
|||
[HideInInspector] _Normal1("Normal 1 (G)", 2D) = "bump" {} |
|||
[HideInInspector] _Normal0("Normal 0 (R)", 2D) = "bump" {} |
|||
[HideInInspector][Gamma] _Metallic0("Metallic 0", Range(0.0, 1.0)) = 0.0 |
|||
[HideInInspector][Gamma] _Metallic1("Metallic 1", Range(0.0, 1.0)) = 0.0 |
|||
[HideInInspector][Gamma] _Metallic2("Metallic 2", Range(0.0, 1.0)) = 0.0 |
|||
[HideInInspector][Gamma] _Metallic3("Metallic 3", Range(0.0, 1.0)) = 0.0 |
|||
[HideInInspector] _Smoothness0("Smoothness 0", Range(0.0, 1.0)) = 1.0 |
|||
[HideInInspector] _Smoothness1("Smoothness 1", Range(0.0, 1.0)) = 1.0 |
|||
[HideInInspector] _Smoothness2("Smoothness 2", Range(0.0, 1.0)) = 1.0 |
|||
[HideInInspector] _Smoothness3("Smoothness 3", Range(0.0, 1.0)) = 1.0 |
|||
|
|||
// used in fallback on old cards & base map |
|||
[HideInInspector] _MainTex("BaseMap (RGB)", 2D) = "white" {} |
|||
[HideInInspector] _Color("Main Color", Color) = (1,1,1,1) |
|||
} |
|||
|
|||
SubShader |
|||
{ |
|||
Tags { "Queue" = "Geometry-100" "RenderType" = "Opaque" "RenderPipeline" = "LightweightPipeline" "IgnoreProjector" = "True"} |
|||
|
|||
Pass |
|||
{ |
|||
Tags { "LightMode" = "LightweightForward" } |
|||
HLSLPROGRAM |
|||
// Required to compile gles 2.0 with standard srp library |
|||
#pragma prefer_hlslcc gles |
|||
#pragma target 3.0 |
|||
|
|||
#pragma vertex SplatmapVert |
|||
#pragma fragment SpatmapFragment |
|||
|
|||
// ------------------------------------- |
|||
// Lightweight Pipeline keywords |
|||
#pragma multi_compile _ _ADDITIONAL_LIGHTS |
|||
#pragma multi_compile _ _VERTEX_LIGHTS |
|||
#pragma multi_compile _ _MIXED_LIGHTING_SUBTRACTIVE |
|||
#pragma multi_compile _ _SHADOWS_ENABLED |
|||
|
|||
// ------------------------------------- |
|||
// Unity defined keywords |
|||
#pragma multi_compile _ DIRLIGHTMAP_COMBINED |
|||
#pragma multi_compile _ LIGHTMAP_ON |
|||
#pragma multi_compile_fog |
|||
|
|||
#pragma multi_compile __ _TERRAIN_NORMAL_MAP |
|||
|
|||
#include "LWRP/ShaderLibrary/Lighting.hlsl" |
|||
|
|||
CBUFFER_START(_Terrain) |
|||
half _Metallic0; |
|||
half _Metallic1; |
|||
half _Metallic2; |
|||
half _Metallic3; |
|||
|
|||
half _Smoothness0; |
|||
half _Smoothness1; |
|||
half _Smoothness2; |
|||
half _Smoothness3; |
|||
|
|||
float4 _Control_ST; |
|||
half4 _Splat0_ST, _Splat1_ST, _Splat2_ST, _Splat3_ST; |
|||
CBUFFER_END |
|||
|
|||
sampler2D _Control; |
|||
sampler2D _Splat0, _Splat1, _Splat2, _Splat3; |
|||
|
|||
#ifdef _TERRAIN_NORMAL_MAP |
|||
sampler2D _Normal0, _Normal1, _Normal2, _Normal3; |
|||
#endif |
|||
|
|||
struct VertexInput |
|||
{ |
|||
float4 vertex : POSITION; |
|||
float4 tangent : TANGENT; |
|||
float3 normal : NORMAL; |
|||
float2 texcoord : TEXCOORD0; |
|||
float2 texcoord1 : TEXCOORD1; |
|||
}; |
|||
|
|||
struct VertexOutput |
|||
{ |
|||
float4 uvSplat01 : TEXCOORD0; // xy: splat0, zw: splat1 |
|||
float4 uvSplat23 : TEXCOORD1; // xy: splat2, zw: splat3 |
|||
float4 uvControlAndLM : TEXCOORD2; // xy: control, zw: lightmap |
|||
half3 normal : TEXCOORD3; |
|||
|
|||
#if _TERRAIN_NORMAL_MAP |
|||
half3 tangent : TEXCOORD4; |
|||
half3 binormal : TEXCOORD5; |
|||
#endif |
|||
half4 fogFactorAndVertexLight : TEXCOORD6; // x: fogFactor, yzw: vertex light |
|||
float3 positionWS : TEXCOORD7; |
|||
float4 shadowCoord : TEXCOORD8; |
|||
float4 clipPos : SV_POSITION; |
|||
}; |
|||
|
|||
void InitializeInputData(VertexOutput IN, half3 normalTS, out InputData input) |
|||
{ |
|||
input = (InputData)0; |
|||
input.positionWS = IN.positionWS; |
|||
|
|||
#ifdef _TERRAIN_NORMAL_MAP |
|||
input.normalWS = TangentToWorldNormal(normalTS, IN.tangent, IN.binormal, IN.normal); |
|||
#else |
|||
input.normalWS = normalize(IN.normal); |
|||
#endif |
|||
|
|||
input.viewDirectionWS = SafeNormalize(GetCameraPositionWS() - IN.positionWS); |
|||
input.shadowCoord = IN.shadowCoord; |
|||
|
|||
input.fogCoord = IN.fogFactorAndVertexLight.x; |
|||
|
|||
#ifdef LIGHTMAP_ON |
|||
input.bakedGI = SampleLightmap(IN.uvControlAndLM.zw, input.normalWS); |
|||
#endif |
|||
} |
|||
|
|||
void SplatmapMix(VertexOutput IN, half4 defaultAlpha, out half4 splat_control, out half weight, out half4 mixedDiffuse, inout half3 mixedNormal) |
|||
{ |
|||
splat_control = tex2D(_Control, IN.uvControlAndLM.xy); |
|||
weight = dot(splat_control, half4(1, 1, 1, 1)); |
|||
|
|||
#if !defined(SHADER_API_MOBILE) && defined(TERRAIN_SPLAT_ADDPASS) |
|||
clip(weight == 0.0f ? -1 : 1); |
|||
#endif |
|||
|
|||
// Normalize weights before lighting and restore weights in final modifier functions so that the overal |
|||
// lighting result can be correctly weighted. |
|||
splat_control /= (weight + 1e-3f); |
|||
|
|||
mixedDiffuse = 0.0f; |
|||
mixedDiffuse += splat_control.r * tex2D(_Splat0, IN.uvSplat01.xy) * half4(1.0, 1.0, 1.0, defaultAlpha.r); |
|||
mixedDiffuse += splat_control.g * tex2D(_Splat1, IN.uvSplat01.zw) * half4(1.0, 1.0, 1.0, defaultAlpha.g); |
|||
mixedDiffuse += splat_control.b * tex2D(_Splat2, IN.uvSplat23.xy) * half4(1.0, 1.0, 1.0, defaultAlpha.b); |
|||
mixedDiffuse += splat_control.a * tex2D(_Splat3, IN.uvSplat23.zw) * half4(1.0, 1.0, 1.0, defaultAlpha.a); |
|||
|
|||
#ifdef _TERRAIN_NORMAL_MAP |
|||
half4 nrm = 0.0f; |
|||
nrm += splat_control.r * tex2D(_Normal0, IN.uvSplat01.xy); |
|||
nrm += splat_control.g * tex2D(_Normal1, IN.uvSplat01.zw); |
|||
nrm += splat_control.b * tex2D(_Normal2, IN.uvSplat23.xy); |
|||
nrm += splat_control.a * tex2D(_Normal3, IN.uvSplat23.zw); |
|||
mixedNormal = UnpackNormal(nrm); |
|||
#else |
|||
mixedNormal = half3(0, 0, 1); |
|||
#endif |
|||
} |
|||
|
|||
VertexOutput SplatmapVert(VertexInput v) |
|||
{ |
|||
VertexOutput o = (VertexOutput)0; |
|||
|
|||
float3 positionWS = TransformObjectToWorld(v.vertex.xyz); |
|||
float4 clipPos = TransformWorldToHClip(positionWS); |
|||
|
|||
o.uvSplat01.xy = TRANSFORM_TEX(v.texcoord, _Splat0); |
|||
o.uvSplat01.zw = TRANSFORM_TEX(v.texcoord, _Splat1); |
|||
o.uvSplat23.xy = TRANSFORM_TEX(v.texcoord, _Splat2); |
|||
o.uvSplat23.zw = TRANSFORM_TEX(v.texcoord, _Splat3); |
|||
o.uvControlAndLM.xy = TRANSFORM_TEX(v.texcoord, _Control); |
|||
o.uvControlAndLM.zw = v.texcoord1 * unity_LightmapST.xy + unity_LightmapST.zw; |
|||
|
|||
#ifdef _TERRAIN_NORMAL_MAP |
|||
float4 vertexTangent = float4(cross(v.normal, float3(0, 0, 1)), -1.0); |
|||
OutputTangentToWorld(vertexTangent, v.normal, o.tangent, o.binormal, o.normal); |
|||
#else |
|||
o.normal = TransformObjectToWorldNormal(v.normal); |
|||
#endif |
|||
o.fogFactorAndVertexLight.x = ComputeFogFactor(clipPos.z); |
|||
o.fogFactorAndVertexLight.yzw = VertexLighting(positionWS, o.normal); |
|||
o.positionWS = positionWS; |
|||
o.clipPos = clipPos; |
|||
o.shadowCoord = ComputeScreenPos(o.clipPos); |
|||
|
|||
return o; |
|||
} |
|||
|
|||
half4 SpatmapFragment(VertexOutput IN) : SV_TARGET |
|||
{ |
|||
half4 splat_control; |
|||
half weight; |
|||
half4 mixedDiffuse; |
|||
half4 defaultSmoothness = half4(_Smoothness0, _Smoothness1, _Smoothness2, _Smoothness3); |
|||
half3 normalTS; |
|||
SplatmapMix(IN, defaultSmoothness, splat_control, weight, mixedDiffuse, normalTS); |
|||
|
|||
half3 albedo = mixedDiffuse.rgb; |
|||
half smoothness = mixedDiffuse.a; |
|||
half metallic = dot(splat_control, half4(_Metallic0, _Metallic1, _Metallic2, _Metallic3)); |
|||
half3 specular = half3(0, 0, 0); |
|||
half alpha = weight; |
|||
|
|||
InputData inputData; |
|||
InitializeInputData(IN, normalTS, inputData); |
|||
half4 color = LightweightFragmentPBR(inputData, albedo, metallic, specular, smoothness, /* occlusion */ 1.0, /* emission */ half3(0, 0, 0), alpha); |
|||
|
|||
ApplyFog(color.rgb, inputData.fogCoord); |
|||
return color; |
|||
} |
|||
ENDHLSL |
|||
} |
|||
|
|||
Pass |
|||
{ |
|||
Tags{"Lightmode" = "DepthOnly"} |
|||
|
|||
ZWrite On |
|||
ColorMask 0 |
|||
|
|||
HLSLPROGRAM |
|||
// Required to compile gles 2.0 with standard srp library |
|||
#pragma prefer_hlslcc gles |
|||
#pragma target 2.0 |
|||
#pragma vertex vert |
|||
#pragma fragment frag |
|||
|
|||
#include "LWRP/ShaderLibrary/Core.hlsl" |
|||
|
|||
float4 vert(float4 pos : POSITION) : SV_POSITION |
|||
{ |
|||
return TransformObjectToHClip(pos.xyz); |
|||
} |
|||
|
|||
half4 frag() : SV_TARGET |
|||
{ |
|||
return 0; |
|||
} |
|||
ENDHLSL |
|||
} |
|||
} |
|||
|
|||
Fallback "Hidden/InternalErrorShader" |
|||
} |
撰写
预览
正在加载...
取消
保存
Reference in new issue