mirror of
https://github.com/maxartz15/VolumetricLighting.git
synced 2025-06-11 06:26:03 +02:00
Reduced project complexity
- Removed area lights - Removed tube lights - Removed samples
This commit is contained in:
parent
317aef1b6c
commit
9b799c8b4e
Assets
AreaLight.meta
AreaLight
AreaLight.prefabAreaLight.prefab.metaScripts.meta
Scenes.metaScripts
AreaLight.Direct.csAreaLight.Direct.cs.metaAreaLight.Shadow.csAreaLight.Shadow.cs.metaAreaLight.csAreaLight.cs.metaAreaLightLUT.DisneyDiffuse.csAreaLightLUT.DisneyDiffuse.cs.metaAreaLightLUT.GGX.csAreaLightLUT.GGX.cs.metaAreaLightLUT.Load.csAreaLightLUT.Load.cs.meta
Shaders.metaShaders
Scenes
Area light.unityArea light.unity.metaMaterials.meta
TubeLight.metaMaterials
StandardAlphaBlended-VolumetricFog.matStandardAlphaBlended-VolumetricFog.mat.metaStandardAlphaBlended-VolumetricFog.shaderStandardAlphaBlended-VolumetricFog.shader.metablck.matblck.mat.meta
Transparency and point lights.unityTransparency and point lights.unity.metaTube lights and local fog density.unityTube lights and local fog density.unity.metaTube lights with shadow planes and global fog density.unityTube lights with shadow planes and global fog density.unity.metaTubeLight
Editor.meta
Editor
Scripts.metaScripts
Shaders.metaShaders
TubeLight.cgincTubeLight.cginc.metaTubeLight.shaderTubeLight.shader.metaTubeLightAttenuation.cgincTubeLightAttenuation.cginc.metaTubeLightShadowPlanes.cgincTubeLightShadowPlanes.cginc.metaTubeLightSource.matTubeLightSource.mat.meta
TubeLight.prefabTubeLight.prefab.meta@ -1,9 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 692b74bd11c622b4ab56587cf3ebc53a
|
||||
folderAsset: yes
|
||||
timeCreated: 1476957694
|
||||
licenseType: Pro
|
||||
DefaultImporter:
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -1,179 +0,0 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!1001 &100100000
|
||||
Prefab:
|
||||
m_ObjectHideFlags: 1
|
||||
serializedVersion: 2
|
||||
m_Modification:
|
||||
m_TransformParent: {fileID: 0}
|
||||
m_Modifications:
|
||||
- target: {fileID: 0}
|
||||
propertyPath: m_ProxyShader
|
||||
value:
|
||||
objectReference: {fileID: 4800000, guid: 2b28be3523d190a41910088d1ee68ef7, type: 3}
|
||||
- target: {fileID: 0}
|
||||
propertyPath: m_Cube
|
||||
value:
|
||||
objectReference: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0}
|
||||
- target: {fileID: 0}
|
||||
propertyPath: m_LocalPosition.x
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 0}
|
||||
propertyPath: m_LocalPosition.y
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 0}
|
||||
propertyPath: m_LocalPosition.z
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 0}
|
||||
propertyPath: m_LocalRotation.y
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 0}
|
||||
propertyPath: m_LocalRotation.w
|
||||
value: 1
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 0}
|
||||
propertyPath: m_Intensity
|
||||
value: 0.8
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 0}
|
||||
propertyPath: m_BlurShadowmapShader
|
||||
value:
|
||||
objectReference: {fileID: 4800000, guid: 701192b62a7678549918bc87434699fe, type: 3}
|
||||
- target: {fileID: 0}
|
||||
propertyPath: m_ShadowmapRes
|
||||
value: 2048
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 0}
|
||||
propertyPath: m_Shadows
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
m_RemovedComponents: []
|
||||
m_ParentPrefab: {fileID: 0}
|
||||
m_RootGameObject: {fileID: 1000010046428508}
|
||||
m_IsPrefabParent: 1
|
||||
--- !u!1 &1000010046428508
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
m_PrefabParentObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 100100000}
|
||||
serializedVersion: 4
|
||||
m_Component:
|
||||
- 4: {fileID: 4000014113918066}
|
||||
- 114: {fileID: 114000011647635530}
|
||||
- 33: {fileID: 33000012356353452}
|
||||
- 23: {fileID: 23000012433474804}
|
||||
- 114: {fileID: 114000013519192348}
|
||||
m_Layer: 0
|
||||
m_Name: AreaLight
|
||||
m_TagString: Untagged
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!4 &4000014113918066
|
||||
Transform:
|
||||
m_ObjectHideFlags: 1
|
||||
m_PrefabParentObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 100100000}
|
||||
m_GameObject: {fileID: 1000010046428508}
|
||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
m_Children: []
|
||||
m_Father: {fileID: 0}
|
||||
m_RootOrder: 0
|
||||
--- !u!23 &23000012433474804
|
||||
MeshRenderer:
|
||||
m_ObjectHideFlags: 1
|
||||
m_PrefabParentObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 100100000}
|
||||
m_GameObject: {fileID: 1000010046428508}
|
||||
m_Enabled: 1
|
||||
m_CastShadows: 1
|
||||
m_ReceiveShadows: 1
|
||||
m_MotionVectors: 1
|
||||
m_LightProbeUsage: 0
|
||||
m_ReflectionProbeUsage: 1
|
||||
m_Materials:
|
||||
- {fileID: 2100000, guid: 1eb056d70e23cc34a9e926d8c8c887a5, type: 2}
|
||||
m_SubsetIndices:
|
||||
m_StaticBatchRoot: {fileID: 0}
|
||||
m_ProbeAnchor: {fileID: 0}
|
||||
m_LightProbeVolumeOverride: {fileID: 0}
|
||||
m_ScaleInLightmap: 1
|
||||
m_PreserveUVs: 1
|
||||
m_IgnoreNormalsForChartDetection: 0
|
||||
m_ImportantGI: 0
|
||||
m_SelectedWireframeHidden: 0
|
||||
m_MinimumChartSize: 4
|
||||
m_AutoUVMaxDistance: 0.5
|
||||
m_AutoUVMaxAngle: 89
|
||||
m_LightmapParameters: {fileID: 0}
|
||||
m_SortingLayerID: 0
|
||||
m_SortingOrder: 0
|
||||
--- !u!33 &33000012356353452
|
||||
MeshFilter:
|
||||
m_ObjectHideFlags: 1
|
||||
m_PrefabParentObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 100100000}
|
||||
m_GameObject: {fileID: 1000010046428508}
|
||||
m_Mesh: {fileID: 0}
|
||||
--- !u!114 &114000011647635530
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 1
|
||||
m_PrefabParentObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 100100000}
|
||||
m_GameObject: {fileID: 1000010046428508}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: 792909cacf2415c48a1d7eebef426b5d, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
m_Cube: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0}
|
||||
m_ProxyShader: {fileID: 4800000, guid: 2b28be3523d190a41910088d1ee68ef7, type: 3}
|
||||
m_ShadowmapShader: {fileID: 4800000, guid: 2c4cd42b134f7864fa579350e9cf6896, type: 3}
|
||||
m_BlurShadowmapShader: {fileID: 4800000, guid: 701192b62a7678549918bc87434699fe,
|
||||
type: 3}
|
||||
m_RenderSource: 1
|
||||
m_Size: {x: 2, y: 2, z: 6}
|
||||
m_Angle: 100
|
||||
m_Intensity: 0.8
|
||||
m_Color: {r: 1, g: 1, b: 1, a: 1}
|
||||
m_Shadows: 0
|
||||
m_ShadowCullingMask:
|
||||
serializedVersion: 2
|
||||
m_Bits: 4294967295
|
||||
m_ShadowmapRes: 2048
|
||||
m_ReceiverSearchDistance: 24
|
||||
m_ReceiverDistanceScale: 5
|
||||
m_LightNearSize: 4
|
||||
m_LightFarSize: 22
|
||||
m_ShadowBias: 0.02
|
||||
m_Quad: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0}
|
||||
--- !u!114 &114000013519192348
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 1
|
||||
m_PrefabParentObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 100100000}
|
||||
m_GameObject: {fileID: 1000010046428508}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: 097385f2a510795498370c4d62e61572, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
m_IntensityMult: 1
|
||||
m_RangeMult: 1
|
||||
m_BlurShadowmapShader: {fileID: 0}
|
||||
m_CopyShadowParamsShader: {fileID: 0}
|
||||
m_ForceOnForFog: 0
|
||||
m_Shadows: 0
|
||||
m_ShadowmapRes: 512
|
||||
m_BlurIterations: 0
|
||||
m_BlurSize: 1
|
||||
m_ESMExponent: 40
|
||||
m_Bounded: 1
|
@ -1,8 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: c946fa75949b4b0469e29c6e49bd3577
|
||||
timeCreated: 1450870880
|
||||
licenseType: Pro
|
||||
NativeFormatImporter:
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -1,9 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 26b199722eb73ad45b1ee21d58a9242f
|
||||
folderAsset: yes
|
||||
timeCreated: 1477748665
|
||||
licenseType: Pro
|
||||
DefaultImporter:
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -1,143 +0,0 @@
|
||||
using UnityEngine;
|
||||
using UnityEngine.Rendering;
|
||||
using System.Collections.Generic;
|
||||
|
||||
public partial class AreaLight : MonoBehaviour
|
||||
{
|
||||
[HideInInspector]
|
||||
public Mesh m_Cube;
|
||||
[HideInInspector]
|
||||
public Shader m_ProxyShader;
|
||||
Material m_ProxyMaterial;
|
||||
static Texture2D s_TransformInvTexture_Specular;
|
||||
static Texture2D s_TransformInvTexture_Diffuse;
|
||||
static Texture2D s_AmpDiffAmpSpecFresnel;
|
||||
|
||||
Dictionary<Camera, CommandBuffer> m_Cameras = new Dictionary<Camera, CommandBuffer>();
|
||||
static CameraEvent kCameraEvent = CameraEvent.AfterLighting;
|
||||
|
||||
bool InitDirect()
|
||||
{
|
||||
if (m_ProxyShader == null || m_Cube == null)
|
||||
return false;
|
||||
|
||||
// Proxy
|
||||
m_ProxyMaterial = new Material(m_ProxyShader);
|
||||
m_ProxyMaterial.hideFlags = HideFlags.HideAndDontSave;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void SetUpLUTs()
|
||||
{
|
||||
if (s_TransformInvTexture_Diffuse == null)
|
||||
s_TransformInvTexture_Diffuse = AreaLightLUT.LoadLUT(AreaLightLUT.LUTType.TransformInv_DisneyDiffuse);
|
||||
if (s_TransformInvTexture_Specular == null)
|
||||
s_TransformInvTexture_Specular = AreaLightLUT.LoadLUT(AreaLightLUT.LUTType.TransformInv_GGX);
|
||||
if (s_AmpDiffAmpSpecFresnel == null)
|
||||
s_AmpDiffAmpSpecFresnel = AreaLightLUT.LoadLUT(AreaLightLUT.LUTType.AmpDiffAmpSpecFresnel);
|
||||
|
||||
m_ProxyMaterial.SetTexture("_TransformInv_Diffuse", s_TransformInvTexture_Diffuse);
|
||||
m_ProxyMaterial.SetTexture("_TransformInv_Specular", s_TransformInvTexture_Specular);
|
||||
m_ProxyMaterial.SetTexture("_AmpDiffAmpSpecFresnel", s_AmpDiffAmpSpecFresnel);
|
||||
}
|
||||
|
||||
void Cleanup()
|
||||
{
|
||||
for(var e = m_Cameras.GetEnumerator(); e.MoveNext();)
|
||||
{
|
||||
var cam = e.Current;
|
||||
if (cam.Key != null && cam.Value != null)
|
||||
{
|
||||
cam.Key.RemoveCommandBuffer (kCameraEvent, cam.Value);
|
||||
}
|
||||
}
|
||||
m_Cameras.Clear();
|
||||
}
|
||||
|
||||
static readonly float[,] offsets = new float[4,2] {{1, 1}, {1, -1}, {-1, -1}, {-1, 1}};
|
||||
|
||||
CommandBuffer GetOrCreateCommandBuffer(Camera cam)
|
||||
{
|
||||
if(cam == null)
|
||||
return null;
|
||||
|
||||
CommandBuffer buf = null;
|
||||
if(!m_Cameras.ContainsKey(cam)) {
|
||||
buf = new CommandBuffer();
|
||||
buf.name = /*"Area light: " +*/ gameObject.name;
|
||||
m_Cameras[cam] = buf;
|
||||
cam.AddCommandBuffer(kCameraEvent, buf);
|
||||
cam.depthTextureMode |= DepthTextureMode.Depth;
|
||||
} else {
|
||||
buf = m_Cameras[cam];
|
||||
buf.Clear();
|
||||
}
|
||||
|
||||
return buf;
|
||||
}
|
||||
|
||||
public void SetUpCommandBuffer()
|
||||
{
|
||||
if (InsideShadowmapCameraRender())
|
||||
return;
|
||||
|
||||
Camera cam = Camera.current;
|
||||
CommandBuffer buf = GetOrCreateCommandBuffer(cam);
|
||||
|
||||
buf.SetGlobalVector("_LightPos", transform.position);
|
||||
buf.SetGlobalVector("_LightColor", GetColor());
|
||||
SetUpLUTs();
|
||||
|
||||
// Needed as we're using the vert_deferred vertex shader from UnityDeferredLibrary.cginc
|
||||
// TODO: Make the light render as quad if it intersects both near and far plane.
|
||||
// (Also missing: rendering as front faces when near doesn't intersect, stencil optimisations)
|
||||
buf.SetGlobalFloat("_LightAsQuad", 0);
|
||||
|
||||
// A little bit of bias to prevent the light from lighting itself - the source quad
|
||||
float z = 0.01f;
|
||||
Transform t = transform;
|
||||
|
||||
Matrix4x4 lightVerts = new Matrix4x4();
|
||||
for (int i = 0; i < 4; i++)
|
||||
lightVerts.SetRow(i, t.TransformPoint(new Vector3(m_Size.x * offsets[i,0], m_Size.y * offsets[i,1], z) * 0.5f));
|
||||
buf.SetGlobalMatrix("_LightVerts", lightVerts);
|
||||
|
||||
if (m_Shadows)
|
||||
SetUpShadowmapForSampling(buf);
|
||||
|
||||
Matrix4x4 m = Matrix4x4.TRS(new Vector3(0, 0, 10.0f), Quaternion.identity, Vector3.one * 20);
|
||||
buf.DrawMesh(m_Cube, t.localToWorldMatrix * m, m_ProxyMaterial, 0, m_Shadows ? /*shadows*/ 0 : /*no shadows*/ 1);
|
||||
}
|
||||
|
||||
void SetKeyword(string keyword, bool on)
|
||||
{
|
||||
if (on)
|
||||
m_ProxyMaterial.EnableKeyword(keyword);
|
||||
else
|
||||
m_ProxyMaterial.DisableKeyword(keyword);
|
||||
}
|
||||
|
||||
void ReleaseTemporary(ref RenderTexture rt)
|
||||
{
|
||||
if (rt == null)
|
||||
return;
|
||||
|
||||
RenderTexture.ReleaseTemporary(rt);
|
||||
rt = null;
|
||||
}
|
||||
|
||||
Color GetColor()
|
||||
{
|
||||
if (QualitySettings.activeColorSpace == ColorSpace.Gamma)
|
||||
return m_Color * m_Intensity;
|
||||
|
||||
return new Color(
|
||||
Mathf.GammaToLinearSpace(m_Color.r * m_Intensity),
|
||||
Mathf.GammaToLinearSpace(m_Color.g * m_Intensity),
|
||||
Mathf.GammaToLinearSpace(m_Color.b * m_Intensity),
|
||||
1.0f
|
||||
);
|
||||
}
|
||||
|
||||
}
|
@ -1,12 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: f166f8247b9668b45bd44bb7d17f3e1d
|
||||
timeCreated: 1453074905
|
||||
licenseType: Pro
|
||||
MonoImporter:
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -1,303 +0,0 @@
|
||||
using UnityEngine;
|
||||
using UnityEngine.Rendering;
|
||||
|
||||
public partial class AreaLight : MonoBehaviour
|
||||
{
|
||||
Camera m_ShadowmapCamera;
|
||||
Transform m_ShadowmapCameraTransform;
|
||||
|
||||
[HideInInspector]
|
||||
public Shader m_ShadowmapShader;
|
||||
[HideInInspector]
|
||||
public Shader m_BlurShadowmapShader;
|
||||
Material m_BlurShadowmapMaterial;
|
||||
RenderTexture m_Shadowmap = null;
|
||||
RenderTexture m_BlurredShadowmap = null;
|
||||
Texture2D m_ShadowmapDummy = null;
|
||||
|
||||
int m_ShadowmapRenderTime = -1;
|
||||
int m_BlurredShadowmapRenderTime = -1;
|
||||
FogLight m_FogLight = null;
|
||||
|
||||
public enum TextureSize
|
||||
{
|
||||
x512 = 512,
|
||||
x1024 = 1024,
|
||||
x2048 = 2048,
|
||||
x4096 = 4096,
|
||||
}
|
||||
|
||||
void UpdateShadowmap(int res)
|
||||
{
|
||||
if (m_Shadowmap != null && m_ShadowmapRenderTime == Time.renderedFrameCount)
|
||||
return;
|
||||
|
||||
// Create the camera
|
||||
if (m_ShadowmapCamera == null)
|
||||
{
|
||||
if (m_ShadowmapShader == null)
|
||||
{
|
||||
Debug.LogError("AreaLight's shadowmap shader not assigned.", this);
|
||||
return;
|
||||
}
|
||||
|
||||
GameObject go = new GameObject("Shadowmap Camera");
|
||||
go.AddComponent(typeof(Camera));
|
||||
m_ShadowmapCamera = go.GetComponent<Camera>();
|
||||
go.hideFlags = HideFlags.HideAndDontSave;
|
||||
m_ShadowmapCamera.enabled = false;
|
||||
m_ShadowmapCamera.clearFlags = CameraClearFlags.SolidColor;
|
||||
m_ShadowmapCamera.renderingPath = RenderingPath.Forward;
|
||||
// exp(EXPONENT) for ESM, white for VSM
|
||||
// m_ShadowmapCamera.backgroundColor = new Color(Mathf.Exp(EXPONENT), 0, 0, 0);
|
||||
m_ShadowmapCamera.backgroundColor = Color.white;
|
||||
m_ShadowmapCameraTransform = go.transform;
|
||||
m_ShadowmapCameraTransform.parent = transform;
|
||||
m_ShadowmapCameraTransform.localRotation = Quaternion.identity;
|
||||
}
|
||||
|
||||
if (m_Angle == 0.0f)
|
||||
{
|
||||
m_ShadowmapCamera.orthographic = true;
|
||||
m_ShadowmapCameraTransform.localPosition = Vector3.zero;
|
||||
m_ShadowmapCamera.nearClipPlane = 0;
|
||||
m_ShadowmapCamera.farClipPlane = m_Size.z;
|
||||
m_ShadowmapCamera.orthographicSize = 0.5f * m_Size.y;
|
||||
m_ShadowmapCamera.aspect = m_Size.x / m_Size.y;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_ShadowmapCamera.orthographic = false;
|
||||
float near = GetNearToCenter();
|
||||
m_ShadowmapCameraTransform.localPosition = -near * Vector3.forward;
|
||||
m_ShadowmapCamera.nearClipPlane = near;
|
||||
m_ShadowmapCamera.farClipPlane = near + m_Size.z;
|
||||
m_ShadowmapCamera.fieldOfView = m_Angle;
|
||||
m_ShadowmapCamera.aspect = m_Size.x / m_Size.y;
|
||||
}
|
||||
|
||||
ReleaseTemporary(ref m_Shadowmap);
|
||||
m_Shadowmap = RenderTexture.GetTemporary(res, res, 24, RenderTextureFormat.Shadowmap);
|
||||
m_Shadowmap.name = "AreaLight Shadowmap";
|
||||
m_Shadowmap.filterMode = FilterMode.Bilinear;
|
||||
m_Shadowmap.wrapMode = TextureWrapMode.Clamp;
|
||||
|
||||
m_ShadowmapCamera.targetTexture = m_Shadowmap;
|
||||
|
||||
// Clear. RenderWithShader() should clear too, but it doesn't.
|
||||
// TODO: Check if it's a bug.
|
||||
m_ShadowmapCamera.cullingMask = 0;
|
||||
m_ShadowmapCamera.Render();
|
||||
m_ShadowmapCamera.cullingMask = m_ShadowCullingMask;
|
||||
|
||||
// We might be rendering inside PlaneReflections, which invert culling. Disable temporarily.
|
||||
var oldCulling = GL.invertCulling;
|
||||
GL.invertCulling = false;
|
||||
|
||||
m_ShadowmapCamera.RenderWithShader(m_ShadowmapShader, "RenderType");
|
||||
|
||||
// Back to whatever was the culling mode.
|
||||
GL.invertCulling = oldCulling;
|
||||
|
||||
m_ShadowmapRenderTime = Time.renderedFrameCount;
|
||||
}
|
||||
|
||||
public RenderTexture GetBlurredShadowmap()
|
||||
{
|
||||
UpdateBlurredShadowmap();
|
||||
return m_BlurredShadowmap;
|
||||
}
|
||||
|
||||
RenderTexture[] temp;
|
||||
|
||||
void UpdateBlurredShadowmap()
|
||||
{
|
||||
if (m_BlurredShadowmap != null && m_BlurredShadowmapRenderTime == Time.renderedFrameCount)
|
||||
return;
|
||||
|
||||
InitFogLight();
|
||||
|
||||
int startRes = (int)m_ShadowmapRes;
|
||||
int targetRes = (int)m_FogLight.m_ShadowmapRes;
|
||||
|
||||
// To make things easier, blurred shadowmap is at most half the size of the regular.
|
||||
if (isActiveAndEnabled && m_Shadows)
|
||||
{
|
||||
targetRes = Mathf.Min(targetRes, startRes/2);
|
||||
}
|
||||
else
|
||||
{
|
||||
// If the area light or the shadows on it are disabled, we can
|
||||
// just get the most convenient resolution for us.
|
||||
startRes = 2 * startRes;
|
||||
}
|
||||
|
||||
UpdateShadowmap(startRes);
|
||||
|
||||
RenderTexture originalRT = RenderTexture.active;
|
||||
|
||||
// Downsample
|
||||
ReleaseTemporary(ref m_BlurredShadowmap);
|
||||
InitMaterial(ref m_BlurShadowmapMaterial, m_BlurShadowmapShader);
|
||||
int downsampleSteps = (int)Mathf.Log(startRes / targetRes, 2);
|
||||
if (temp == null || temp.Length != downsampleSteps)
|
||||
temp = new RenderTexture[downsampleSteps];
|
||||
// RFloat for ESM, RGHalf for VSM
|
||||
RenderTextureFormat format = RenderTextureFormat.RGHalf;
|
||||
|
||||
for(int i = 0, currentRes = startRes/2; i < downsampleSteps; i++)
|
||||
{
|
||||
temp[i] = RenderTexture.GetTemporary(currentRes, currentRes, 0, format, RenderTextureReadWrite.Linear);
|
||||
temp[i].name = "AreaLight Shadow Downsample";
|
||||
temp[i].filterMode = FilterMode.Bilinear;
|
||||
temp[i].wrapMode = TextureWrapMode.Clamp;
|
||||
m_BlurShadowmapMaterial.SetVector("_TexelSize", new Vector4(0.5f/currentRes, 0.5f/currentRes, 0, 0));
|
||||
|
||||
if (i == 0)
|
||||
{
|
||||
m_BlurShadowmapMaterial.SetTexture("_Shadowmap", m_Shadowmap);
|
||||
InitShadowmapDummy();
|
||||
m_BlurShadowmapMaterial.SetTexture("_ShadowmapDummy", m_ShadowmapDummy);
|
||||
m_BlurShadowmapMaterial.SetVector("_ZParams", GetZParams());
|
||||
m_BlurShadowmapMaterial.SetFloat("_ESMExponent", m_FogLight.m_ESMExponent);
|
||||
Blur(m_Shadowmap, temp[i], /*sample & convert shadowmap*/ 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
m_BlurShadowmapMaterial.SetTexture("_MainTex", temp[i - 1]);
|
||||
Blur(temp[i - 1], temp[i], /*regular sample*/ 1);
|
||||
}
|
||||
|
||||
currentRes /= 2;
|
||||
}
|
||||
|
||||
for (int i = 0; i < downsampleSteps - 1; i++)
|
||||
RenderTexture.ReleaseTemporary(temp[i]);
|
||||
|
||||
m_BlurredShadowmap = temp[downsampleSteps - 1];
|
||||
|
||||
// Blur
|
||||
if (m_FogLight.m_BlurIterations > 0)
|
||||
{
|
||||
RenderTexture tempBlur = RenderTexture.GetTemporary (targetRes, targetRes, 0, format, RenderTextureReadWrite.Linear);
|
||||
tempBlur.name = "AreaLight Shadow Blur";
|
||||
tempBlur.filterMode = FilterMode.Bilinear;
|
||||
tempBlur.wrapMode = TextureWrapMode.Clamp;
|
||||
|
||||
m_BlurShadowmapMaterial.SetVector("_MainTex_TexelSize", new Vector4(1.0f/targetRes, 1.0f/targetRes, 0, 0));
|
||||
|
||||
float blurSize = m_FogLight.m_BlurSize;
|
||||
for(int i = 0; i < m_FogLight.m_BlurIterations; i++)
|
||||
{
|
||||
m_BlurShadowmapMaterial.SetFloat ("_BlurSize", blurSize);
|
||||
Blur(m_BlurredShadowmap, tempBlur, /*vertical blur*/2);
|
||||
Blur(tempBlur, m_BlurredShadowmap, /*horizontal blur*/3);
|
||||
blurSize *= 1.2f;
|
||||
}
|
||||
|
||||
RenderTexture.ReleaseTemporary(tempBlur);
|
||||
}
|
||||
|
||||
RenderTexture.active = originalRT;
|
||||
|
||||
m_BlurredShadowmapRenderTime = Time.renderedFrameCount;
|
||||
}
|
||||
|
||||
// Normally would've used Graphics.Blit(), but it breaks picking in the scene view.
|
||||
// TODO: bug report
|
||||
void Blur(RenderTexture src, RenderTexture dst, int pass)
|
||||
{
|
||||
RenderTexture.active = dst;
|
||||
m_BlurShadowmapMaterial.SetTexture("_MainTex", src);
|
||||
m_BlurShadowmapMaterial.SetPass(pass);
|
||||
RenderQuad();
|
||||
}
|
||||
|
||||
void RenderQuad()
|
||||
{
|
||||
GL.Begin(GL.QUADS);
|
||||
GL.TexCoord2( 0, 0);
|
||||
GL.Vertex3 (-1, 1, 0);
|
||||
GL.TexCoord2( 0, 1);
|
||||
GL.Vertex3 (-1,-1, 0);
|
||||
GL.TexCoord2( 1, 1);
|
||||
GL.Vertex3 ( 1,-1, 0);
|
||||
GL.TexCoord2( 1, 0);
|
||||
GL.Vertex3 ( 1, 1, 0);
|
||||
GL.End();
|
||||
}
|
||||
|
||||
void SetUpShadowmapForSampling(CommandBuffer buf)
|
||||
{
|
||||
UpdateShadowmap((int)m_ShadowmapRes);
|
||||
|
||||
buf.SetGlobalTexture("_Shadowmap", m_Shadowmap);
|
||||
InitShadowmapDummy();
|
||||
m_ProxyMaterial.SetTexture("_ShadowmapDummy", m_ShadowmapDummy);
|
||||
buf.SetGlobalMatrix("_ShadowProjectionMatrix", GetProjectionMatrix());
|
||||
|
||||
float texelsInMap = (int)m_ShadowmapRes;
|
||||
float relativeTexelSize = texelsInMap / 2048.0f;
|
||||
|
||||
buf.SetGlobalFloat("_ShadowReceiverWidth", relativeTexelSize * m_ReceiverSearchDistance / texelsInMap);
|
||||
|
||||
buf.SetGlobalFloat("_ShadowReceiverDistanceScale", m_ReceiverDistanceScale * 0.5f / 10.0f); // 10 samples in shader
|
||||
|
||||
Vector2 shadowLightWidth = new Vector2(m_LightNearSize, m_LightFarSize) * relativeTexelSize / texelsInMap;
|
||||
buf.SetGlobalVector("_ShadowLightWidth", shadowLightWidth);
|
||||
|
||||
buf.SetGlobalFloat("_ShadowBias", m_ShadowBias);
|
||||
}
|
||||
|
||||
void InitMaterial(ref Material material, Shader shader)
|
||||
{
|
||||
if (material)
|
||||
return;
|
||||
|
||||
if (!shader)
|
||||
{
|
||||
Debug.LogError("Missing shader");
|
||||
return;
|
||||
}
|
||||
|
||||
material = new Material(shader);
|
||||
material.hideFlags = HideFlags.HideAndDontSave;
|
||||
}
|
||||
|
||||
void InitShadowmapDummy()
|
||||
{
|
||||
if(m_ShadowmapDummy != null)
|
||||
return;
|
||||
m_ShadowmapDummy = new Texture2D(1, 1, TextureFormat.Alpha8, false, true);
|
||||
m_ShadowmapDummy.filterMode = FilterMode.Point;
|
||||
m_ShadowmapDummy.SetPixel(0, 0, new Color(0f, 0f, 0f, 0f));
|
||||
m_ShadowmapDummy.Apply(false, true);
|
||||
}
|
||||
|
||||
void InitFogLight()
|
||||
{
|
||||
if (m_FogLight != null)
|
||||
return;
|
||||
|
||||
// It should always be here, because it triggered this code path in the first place.
|
||||
m_FogLight = GetComponent<FogLight>();
|
||||
}
|
||||
|
||||
bool InsideShadowmapCameraRender()
|
||||
{
|
||||
RenderTexture target = Camera.current.targetTexture;
|
||||
return target != null && target.format == RenderTextureFormat.Shadowmap;
|
||||
}
|
||||
|
||||
Vector4 GetZParams()
|
||||
{
|
||||
float n = GetNearToCenter();
|
||||
float f = n + m_Size.z;
|
||||
// linear z, 0 near, 1 far
|
||||
// linearz = A * (z + 1.0) / (z + B);
|
||||
// A = n/(n - f)
|
||||
// B = (n + f)/(n - f)
|
||||
|
||||
return new Vector4(n/(n - f), (n + f)/(n - f), 0, 0);
|
||||
}
|
||||
}
|
@ -1,12 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 263b59280b7c4e04aa70d3c9cb1a5586
|
||||
timeCreated: 1455014110
|
||||
licenseType: Pro
|
||||
MonoImporter:
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -1,297 +0,0 @@
|
||||
using UnityEngine;
|
||||
|
||||
[ExecuteInEditMode]
|
||||
public partial class AreaLight : MonoBehaviour
|
||||
{
|
||||
public bool m_RenderSource = true;
|
||||
public Vector3 m_Size = new Vector3(1, 1, 2);
|
||||
[Range(0, 179)]
|
||||
public float m_Angle = 0.0f;
|
||||
[MinValue(0)]
|
||||
public float m_Intensity = 0.8f;
|
||||
public Color m_Color = Color.white;
|
||||
|
||||
[Header("Shadows")]
|
||||
public bool m_Shadows = false;
|
||||
public LayerMask m_ShadowCullingMask = ~0;
|
||||
public TextureSize m_ShadowmapRes = TextureSize.x2048;
|
||||
[MinValue(0)]
|
||||
public float m_ReceiverSearchDistance = 24.0f;
|
||||
[MinValue(0)]
|
||||
public float m_ReceiverDistanceScale = 5.0f;
|
||||
[MinValue(0)]
|
||||
public float m_LightNearSize = 4.0f;
|
||||
[MinValue(0)]
|
||||
public float m_LightFarSize = 22.0f;
|
||||
[Range(0, 0.1f)]
|
||||
public float m_ShadowBias = 0.001f;
|
||||
|
||||
MeshRenderer m_SourceRenderer;
|
||||
Mesh m_SourceMesh;
|
||||
[HideInInspector]
|
||||
public Mesh m_Quad;
|
||||
Vector2 m_CurrentQuadSize = Vector2.zero;
|
||||
Vector3 m_CurrentSize = Vector3.zero;
|
||||
float m_CurrentAngle = -1.0f;
|
||||
|
||||
bool m_Initialized = false;
|
||||
MaterialPropertyBlock m_props;
|
||||
|
||||
void Awake()
|
||||
{
|
||||
if(!Init())
|
||||
return;
|
||||
UpdateSourceMesh();
|
||||
}
|
||||
|
||||
bool Init()
|
||||
{
|
||||
if (m_Initialized)
|
||||
return true;
|
||||
|
||||
if (m_Quad == null || !InitDirect())
|
||||
return false;
|
||||
|
||||
m_SourceRenderer = GetComponent<MeshRenderer>();
|
||||
m_SourceRenderer.enabled = true;
|
||||
m_SourceMesh = Instantiate<Mesh>(m_Quad);
|
||||
m_SourceMesh.hideFlags = HideFlags.HideAndDontSave;
|
||||
MeshFilter mfs = gameObject.GetComponent<MeshFilter>();
|
||||
mfs.sharedMesh = m_SourceMesh;
|
||||
|
||||
Transform t = transform;
|
||||
if (t.localScale != Vector3.one)
|
||||
{
|
||||
#if UNITY_EDITOR
|
||||
Debug.LogError("AreaLights don't like to be scaled. Setting local scale to 1.", this);
|
||||
#endif
|
||||
t.localScale = Vector3.one;
|
||||
}
|
||||
|
||||
SetUpLUTs();
|
||||
|
||||
m_Initialized = true;
|
||||
return true;
|
||||
}
|
||||
|
||||
void OnEnable()
|
||||
{
|
||||
m_props = new MaterialPropertyBlock();
|
||||
|
||||
if(!Init())
|
||||
return;
|
||||
UpdateSourceMesh();
|
||||
}
|
||||
|
||||
void OnDisable()
|
||||
{
|
||||
if(!Application.isPlaying)
|
||||
Cleanup();
|
||||
else
|
||||
for(var e = m_Cameras.GetEnumerator(); e.MoveNext();)
|
||||
if(e.Current.Value != null)
|
||||
e.Current.Value.Clear();
|
||||
}
|
||||
|
||||
void OnDestroy()
|
||||
{
|
||||
if (m_ProxyMaterial != null)
|
||||
DestroyImmediate(m_ProxyMaterial);
|
||||
if (m_SourceMesh != null)
|
||||
DestroyImmediate(m_SourceMesh);
|
||||
Cleanup();
|
||||
}
|
||||
|
||||
static Vector3[] vertices = new Vector3[4];
|
||||
|
||||
void UpdateSourceMesh()
|
||||
{
|
||||
m_Size.x = Mathf.Max(m_Size.x, 0);
|
||||
m_Size.y = Mathf.Max(m_Size.y, 0);
|
||||
m_Size.z = Mathf.Max(m_Size.z, 0);
|
||||
|
||||
Vector2 quadSize = m_RenderSource && enabled ? new Vector2(m_Size.x, m_Size.y) : Vector2.one * 0.0001f;
|
||||
if (quadSize != m_CurrentQuadSize)
|
||||
{
|
||||
|
||||
float x = quadSize.x * 0.5f;
|
||||
float y = quadSize.y * 0.5f;
|
||||
// To prevent the source quad from getting into the shadowmap, offset it back a bit.
|
||||
float z = -0.001f;
|
||||
vertices[0].Set(-x, y, z);
|
||||
vertices[1].Set( x, -y, z);
|
||||
vertices[2].Set( x, y, z);
|
||||
vertices[3].Set(-x, -y, z);
|
||||
|
||||
m_SourceMesh.vertices = vertices;
|
||||
|
||||
m_CurrentQuadSize = quadSize;
|
||||
}
|
||||
|
||||
if (m_Size != m_CurrentSize || m_Angle != m_CurrentAngle)
|
||||
{
|
||||
// Set the bounds of the mesh to large, so that they drive rendering of the entire light
|
||||
// TODO: Make the bounds tight around the shape of the light. Right now they're just tight around
|
||||
// the shadow frustum, which is fine if the shadows are enable (ok, maybe far plane should be more clever),
|
||||
// but doesn't make sense if shadows are disabled.
|
||||
m_SourceMesh.bounds = GetFrustumBounds();
|
||||
}
|
||||
}
|
||||
|
||||
void Update()
|
||||
{
|
||||
if (!gameObject.activeInHierarchy || !enabled)
|
||||
{
|
||||
Cleanup();
|
||||
return;
|
||||
}
|
||||
|
||||
if(!Init())
|
||||
return;
|
||||
|
||||
UpdateSourceMesh();
|
||||
|
||||
if(Application.isPlaying)
|
||||
for(var e = m_Cameras.GetEnumerator(); e.MoveNext();)
|
||||
if(e.Current.Value != null)
|
||||
e.Current.Value.Clear();
|
||||
}
|
||||
|
||||
void OnWillRenderObject()
|
||||
{
|
||||
if(!Init())
|
||||
return;
|
||||
|
||||
// TODO: This is just a very rough guess. Need to properly calculate the surface emission
|
||||
// intensity based on light's intensity.
|
||||
Color color = new Color(
|
||||
Mathf.GammaToLinearSpace(m_Color.r),
|
||||
Mathf.GammaToLinearSpace(m_Color.g),
|
||||
Mathf.GammaToLinearSpace(m_Color.b),
|
||||
1.0f);
|
||||
m_props.SetVector("_EmissionColor", color * m_Intensity);
|
||||
m_SourceRenderer.SetPropertyBlock(m_props);
|
||||
|
||||
SetUpCommandBuffer();
|
||||
}
|
||||
|
||||
float GetNearToCenter()
|
||||
{
|
||||
if (m_Angle == 0.0f)
|
||||
return 0;
|
||||
|
||||
return m_Size.y * 0.5f / Mathf.Tan(m_Angle * 0.5f * Mathf.Deg2Rad);
|
||||
}
|
||||
|
||||
Matrix4x4 GetOffsetMatrix(float zOffset)
|
||||
{
|
||||
Matrix4x4 m = Matrix4x4.identity;
|
||||
m.SetColumn(3, new Vector4(0, 0, zOffset, 1));
|
||||
return m;
|
||||
}
|
||||
|
||||
public Matrix4x4 GetProjectionMatrix(bool linearZ = false)
|
||||
{
|
||||
Matrix4x4 m;
|
||||
|
||||
if (m_Angle == 0.0f)
|
||||
{
|
||||
m = Matrix4x4.Ortho(-0.5f * m_Size.x, 0.5f * m_Size.x, -0.5f * m_Size.y, 0.5f * m_Size.y, 0, -m_Size.z);
|
||||
}
|
||||
else
|
||||
{
|
||||
float near = GetNearToCenter();
|
||||
if (linearZ)
|
||||
{
|
||||
m = PerspectiveLinearZ(m_Angle, m_Size.x/m_Size.y, near, near + m_Size.z);
|
||||
}
|
||||
else
|
||||
{
|
||||
m = Matrix4x4.Perspective(m_Angle, m_Size.x/m_Size.y, near, near + m_Size.z);
|
||||
m = m * Matrix4x4.Scale(new Vector3(1, 1, -1));
|
||||
}
|
||||
m = m * GetOffsetMatrix(near);
|
||||
}
|
||||
|
||||
return m * transform.worldToLocalMatrix;
|
||||
}
|
||||
|
||||
public Vector4 MultiplyPoint(Matrix4x4 m, Vector3 v)
|
||||
{
|
||||
Vector4 res;
|
||||
res.x = m.m00 * v.x + m.m01 * v.y + m.m02 * v.z + m.m03;
|
||||
res.y = m.m10 * v.x + m.m11 * v.y + m.m12 * v.z + m.m13;
|
||||
res.z = m.m20 * v.x + m.m21 * v.y + m.m22 * v.z + m.m23;
|
||||
res.w = m.m30 * v.x + m.m31 * v.y + m.m32 * v.z + m.m33;
|
||||
return res;
|
||||
}
|
||||
|
||||
Matrix4x4 PerspectiveLinearZ(float fov, float aspect, float near, float far)
|
||||
{
|
||||
// A vector transformed with this matrix should get perspective division on x and y only:
|
||||
// Vector4 vClip = MultiplyPoint(PerspectiveLinearZ(...), vEye);
|
||||
// Vector3 vNDC = Vector3(vClip.x / vClip.w, vClip.y / vClip.w, vClip.z);
|
||||
// vNDC is [-1, 1]^3 and z is linear, i.e. z = 0 is half way between near and far in world space.
|
||||
|
||||
float rad = Mathf.Deg2Rad * fov * 0.5f;
|
||||
float cotan = Mathf.Cos(rad) / Mathf.Sin(rad);
|
||||
float deltainv = 1.0f / (far - near);
|
||||
Matrix4x4 m;
|
||||
|
||||
m.m00 = cotan / aspect; m.m01 = 0.0f; m.m02 = 0.0f; m.m03 = 0.0f;
|
||||
m.m10 = 0.0f; m.m11 = cotan; m.m12 = 0.0f; m.m13 = 0.0f;
|
||||
m.m20 = 0.0f; m.m21 = 0.0f; m.m22 = 2.0f * deltainv; m.m23 = - (far + near) * deltainv;
|
||||
m.m30 = 0.0f; m.m31 = 0.0f; m.m32 = 1.0f; m.m33 = 0.0f;
|
||||
|
||||
return m;
|
||||
}
|
||||
|
||||
public Vector4 GetPosition()
|
||||
{
|
||||
Transform t = transform;
|
||||
|
||||
if (m_Angle == 0.0f)
|
||||
{
|
||||
Vector3 dir = -t.forward;
|
||||
return new Vector4(dir.x, dir.y, dir.z, 0);
|
||||
}
|
||||
|
||||
Vector3 pos = t.position - GetNearToCenter() * t.forward;
|
||||
return new Vector4(pos.x, pos.y, pos.z, 1);
|
||||
}
|
||||
|
||||
Bounds GetFrustumBounds()
|
||||
{
|
||||
if (m_Angle == 0.0f)
|
||||
return new Bounds(Vector3.zero, m_Size);
|
||||
|
||||
float tanhalffov = Mathf.Tan(m_Angle * 0.5f * Mathf.Deg2Rad);
|
||||
float near = m_Size.y * 0.5f / tanhalffov;
|
||||
float z = m_Size.z;
|
||||
float y = (near + m_Size.z) * tanhalffov * 2.0f;
|
||||
float x = m_Size.x * y / m_Size.y;
|
||||
return new Bounds(Vector3.forward * m_Size.z * 0.5f, new Vector3(x, y, z));
|
||||
}
|
||||
|
||||
void OnDrawGizmosSelected()
|
||||
{
|
||||
Gizmos.color = Color.white;
|
||||
|
||||
if (m_Angle == 0.0f)
|
||||
{
|
||||
Gizmos.matrix = transform.localToWorldMatrix;
|
||||
Gizmos.DrawWireCube(new Vector3(0, 0, 0.5f * m_Size.z), m_Size);
|
||||
return;
|
||||
}
|
||||
|
||||
float near = GetNearToCenter();
|
||||
Gizmos.matrix = transform.localToWorldMatrix * GetOffsetMatrix(-near);
|
||||
|
||||
Gizmos.DrawFrustum(Vector3.zero, m_Angle, near + m_Size.z, near, m_Size.x/m_Size.y);
|
||||
|
||||
Gizmos.matrix = transform.localToWorldMatrix;
|
||||
Gizmos.color = Color.yellow;
|
||||
Bounds bounds = GetFrustumBounds();
|
||||
Gizmos.DrawWireCube(bounds.center, bounds.size);
|
||||
}
|
||||
}
|
@ -1,16 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 792909cacf2415c48a1d7eebef426b5d
|
||||
timeCreated: 1453121021
|
||||
licenseType: Pro
|
||||
MonoImporter:
|
||||
serializedVersion: 2
|
||||
defaultReferences:
|
||||
- m_Cube: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0}
|
||||
- m_ProxyShader: {fileID: 4800000, guid: 2b28be3523d190a41910088d1ee68ef7, type: 3}
|
||||
- m_Quad: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0}
|
||||
- m_ShadowmapShader: {fileID: 4800000, guid: 2c4cd42b134f7864fa579350e9cf6896, type: 3}
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
File diff suppressed because it is too large
Load Diff
@ -1,12 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 9cbf86f9b2114924a91acc43796a307b
|
||||
timeCreated: 1454419446
|
||||
licenseType: Pro
|
||||
MonoImporter:
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
File diff suppressed because it is too large
Load Diff
@ -1,12 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 2b0041ac2ad0ef8459f7565f64f4d731
|
||||
timeCreated: 1453066169
|
||||
licenseType: Pro
|
||||
MonoImporter:
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -1,68 +0,0 @@
|
||||
using UnityEngine;
|
||||
|
||||
public partial class AreaLightLUT
|
||||
{
|
||||
const int kLUTResolution = 64;
|
||||
const int kLUTMatrixDim = 3;
|
||||
|
||||
public enum LUTType
|
||||
{
|
||||
TransformInv_DisneyDiffuse,
|
||||
TransformInv_GGX,
|
||||
AmpDiffAmpSpecFresnel
|
||||
}
|
||||
|
||||
public static Texture2D LoadLUT(LUTType type)
|
||||
{
|
||||
switch(type)
|
||||
{
|
||||
case LUTType.TransformInv_DisneyDiffuse: return LoadLUT(s_LUTTransformInv_DisneyDiffuse);
|
||||
case LUTType.TransformInv_GGX: return LoadLUT(s_LUTTransformInv_GGX);
|
||||
case LUTType.AmpDiffAmpSpecFresnel: return LoadLUT(s_LUTAmplitude_DisneyDiffuse, s_LUTAmplitude_GGX, s_LUTFresnel_GGX);
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
static Texture2D CreateLUT(TextureFormat format, Color[] pixels)
|
||||
{
|
||||
Texture2D tex = new Texture2D(kLUTResolution, kLUTResolution, format, false /*mipmap*/, true /*linear*/);
|
||||
tex.hideFlags = HideFlags.HideAndDontSave;
|
||||
tex.wrapMode = TextureWrapMode.Clamp;
|
||||
tex.SetPixels(pixels);
|
||||
tex.Apply();
|
||||
return tex;
|
||||
}
|
||||
|
||||
static Texture2D LoadLUT(double[,] LUTTransformInv)
|
||||
{
|
||||
const int count = kLUTResolution * kLUTResolution;
|
||||
Color[] pixels = new Color[count];
|
||||
|
||||
// transformInv
|
||||
for (int i = 0; i < count; i++)
|
||||
{
|
||||
// Only columns 0, 2, 4 and 6 contain interesting values (at least in the case of GGX).
|
||||
pixels[i] = new Color( (float)LUTTransformInv[i, 0],
|
||||
(float)LUTTransformInv[i, 2],
|
||||
(float)LUTTransformInv[i, 4],
|
||||
(float)LUTTransformInv[i, 6]);
|
||||
}
|
||||
|
||||
return CreateLUT(TextureFormat.RGBAHalf, pixels);
|
||||
}
|
||||
|
||||
static Texture2D LoadLUT(float[] LUTScalar0, float[] LUTScalar1, float[] LUTScalar2)
|
||||
{
|
||||
const int count = kLUTResolution * kLUTResolution;
|
||||
Color[] pixels = new Color[count];
|
||||
|
||||
// amplitude
|
||||
for (int i = 0; i < count; i++)
|
||||
{
|
||||
pixels[i] = new Color(LUTScalar0[i], LUTScalar1[i], LUTScalar2[i], 0);
|
||||
}
|
||||
|
||||
return CreateLUT(TextureFormat.RGBAHalf, pixels);
|
||||
}
|
||||
}
|
@ -1,12 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 0c08d6c4951e30c42a4bd6209323dfb8
|
||||
timeCreated: 1453070529
|
||||
licenseType: Pro
|
||||
MonoImporter:
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -1,9 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: d622c47de56b9e84e971b5a72b861f95
|
||||
folderAsset: yes
|
||||
timeCreated: 1477749207
|
||||
licenseType: Pro
|
||||
DefaultImporter:
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -1,224 +0,0 @@
|
||||
// Based on 'Real-Time Polygonal-Light Shading with Linearly Transformed Cosines'
|
||||
// https://labs.unity.com/article/real-time-polygonal-light-shading-linearly-transformed-cosines
|
||||
|
||||
#if AREA_LIGHT_ENABLE_DIFFUSE
|
||||
sampler2D _TransformInv_Diffuse;
|
||||
#endif
|
||||
sampler2D _TransformInv_Specular;
|
||||
sampler2D _AmpDiffAmpSpecFresnel;
|
||||
float4x4 _LightVerts;
|
||||
|
||||
half IntegrateEdge(half3 v1, half3 v2)
|
||||
{
|
||||
half d = dot(v1,v2);
|
||||
half theta = acos(max(-0.9999, dot(v1,v2)));
|
||||
half theta_sintheta = theta / sin(theta);
|
||||
return theta_sintheta * (v1.x*v2.y - v1.y*v2.x);
|
||||
}
|
||||
|
||||
// Baum's equation
|
||||
// Expects non-normalized vertex positions
|
||||
half PolygonRadiance(half4x3 L)
|
||||
{
|
||||
// detect clipping config
|
||||
uint config = 0;
|
||||
if (L[0].z > 0) config += 1;
|
||||
if (L[1].z > 0) config += 2;
|
||||
if (L[2].z > 0) config += 4;
|
||||
if (L[3].z > 0) config += 8;
|
||||
|
||||
|
||||
// The fifth vertex for cases when clipping cuts off one corner.
|
||||
// Due to a compiler bug, copying L into a vector array with 5 rows
|
||||
// messes something up, so we need to stick with the matrix + the L4 vertex.
|
||||
half3 L4 = L[3];
|
||||
|
||||
// This switch is surprisingly fast. Tried replacing it with a lookup array of vertices.
|
||||
// Even though that replaced the switch with just some indexing and no branches, it became
|
||||
// way, way slower - mem fetch stalls?
|
||||
|
||||
// clip
|
||||
uint n = 0;
|
||||
switch(config)
|
||||
{
|
||||
case 0: // clip all
|
||||
break;
|
||||
|
||||
case 1: // V1 clip V2 V3 V4
|
||||
n = 3;
|
||||
L[1] = -L[1].z * L[0] + L[0].z * L[1];
|
||||
L[2] = -L[3].z * L[0] + L[0].z * L[3];
|
||||
break;
|
||||
|
||||
case 2: // V2 clip V1 V3 V4
|
||||
n = 3;
|
||||
L[0] = -L[0].z * L[1] + L[1].z * L[0];
|
||||
L[2] = -L[2].z * L[1] + L[1].z * L[2];
|
||||
break;
|
||||
|
||||
case 3: // V1 V2 clip V3 V4
|
||||
n = 4;
|
||||
L[2] = -L[2].z * L[1] + L[1].z * L[2];
|
||||
L[3] = -L[3].z * L[0] + L[0].z * L[3];
|
||||
break;
|
||||
|
||||
case 4: // V3 clip V1 V2 V4
|
||||
n = 3;
|
||||
L[0] = -L[3].z * L[2] + L[2].z * L[3];
|
||||
L[1] = -L[1].z * L[2] + L[2].z * L[1];
|
||||
break;
|
||||
|
||||
case 5: // V1 V3 clip V2 V4: impossible
|
||||
break;
|
||||
|
||||
case 6: // V2 V3 clip V1 V4
|
||||
n = 4;
|
||||
L[0] = -L[0].z * L[1] + L[1].z * L[0];
|
||||
L[3] = -L[3].z * L[2] + L[2].z * L[3];
|
||||
break;
|
||||
|
||||
case 7: // V1 V2 V3 clip V4
|
||||
n = 5;
|
||||
L4 = -L[3].z * L[0] + L[0].z * L[3];
|
||||
L[3] = -L[3].z * L[2] + L[2].z * L[3];
|
||||
break;
|
||||
|
||||
case 8: // V4 clip V1 V2 V3
|
||||
n = 3;
|
||||
L[0] = -L[0].z * L[3] + L[3].z * L[0];
|
||||
L[1] = -L[2].z * L[3] + L[3].z * L[2];
|
||||
L[2] = L[3];
|
||||
break;
|
||||
|
||||
case 9: // V1 V4 clip V2 V3
|
||||
n = 4;
|
||||
L[1] = -L[1].z * L[0] + L[0].z * L[1];
|
||||
L[2] = -L[2].z * L[3] + L[3].z * L[2];
|
||||
break;
|
||||
|
||||
case 10: // V2 V4 clip V1 V3: impossible
|
||||
break;
|
||||
|
||||
case 11: // V1 V2 V4 clip V3
|
||||
n = 5;
|
||||
L[3] = -L[2].z * L[3] + L[3].z * L[2];
|
||||
L[2] = -L[2].z * L[1] + L[1].z * L[2];
|
||||
break;
|
||||
|
||||
case 12: // V3 V4 clip V1 V2
|
||||
n = 4;
|
||||
L[1] = -L[1].z * L[2] + L[2].z * L[1];
|
||||
L[0] = -L[0].z * L[3] + L[3].z * L[0];
|
||||
break;
|
||||
|
||||
case 13: // V1 V3 V4 clip V2
|
||||
n = 5;
|
||||
L[3] = L[2];
|
||||
L[2] = -L[1].z * L[2] + L[2].z * L[1];
|
||||
L[1] = -L[1].z * L[0] + L[0].z * L[1];
|
||||
break;
|
||||
|
||||
case 14: // V2 V3 V4 clip V1
|
||||
n = 5;
|
||||
L4 = -L[0].z * L[3] + L[3].z * L[0];
|
||||
L[0] = -L[0].z * L[1] + L[1].z * L[0];
|
||||
break;
|
||||
|
||||
case 15: // V1 V2 V3 V4
|
||||
n = 4;
|
||||
break;
|
||||
}
|
||||
|
||||
if (n == 0)
|
||||
return 0;
|
||||
|
||||
// normalize
|
||||
L[0] = normalize(L[0]);
|
||||
L[1] = normalize(L[1]);
|
||||
L[2] = normalize(L[2]);
|
||||
if(n == 3)
|
||||
L[3] = L[0];
|
||||
else
|
||||
{
|
||||
L[3] = normalize(L[3]);
|
||||
if (n == 4)
|
||||
L4 = L[0];
|
||||
else
|
||||
L4 = normalize(L4);
|
||||
}
|
||||
|
||||
// integrate
|
||||
half sum = 0;
|
||||
sum += IntegrateEdge(L[0], L[1]);
|
||||
sum += IntegrateEdge(L[1], L[2]);
|
||||
sum += IntegrateEdge(L[2], L[3]);
|
||||
if(n >= 4)
|
||||
sum += IntegrateEdge(L[3], L4);
|
||||
if(n == 5)
|
||||
sum += IntegrateEdge(L4, L[0]);
|
||||
|
||||
sum *= 0.15915; // 1/2pi
|
||||
|
||||
return max(0, sum);
|
||||
}
|
||||
|
||||
half TransformedPolygonRadiance(half4x3 L, half2 uv, sampler2D transformInv, half amplitude)
|
||||
{
|
||||
// Get the inverse LTC matrix M
|
||||
half3x3 Minv = 0;
|
||||
Minv._m22 = 1;
|
||||
Minv._m00_m02_m11_m20 = tex2D(transformInv, uv);
|
||||
|
||||
// Transform light vertices into diffuse configuration
|
||||
half4x3 LTransformed = mul(L, Minv);
|
||||
|
||||
// Polygon radiance in transformed configuration - specular
|
||||
return PolygonRadiance(LTransformed) * amplitude;
|
||||
}
|
||||
|
||||
half3 CalculateLight (half3 position, half3 diffColor, half3 specColor, half oneMinusRoughness, half3 N,
|
||||
half3 lightPos, half3 lightColor)
|
||||
{
|
||||
#if AREA_LIGHT_SHADOWS
|
||||
half shadow = Shadow(position);
|
||||
if (shadow == 0.0)
|
||||
return 0;
|
||||
#endif
|
||||
// TODO: larger and smaller values cause artifacts - why?
|
||||
oneMinusRoughness = clamp(oneMinusRoughness, 0.01, 0.93);
|
||||
half roughness = 1 - oneMinusRoughness;
|
||||
half3 V = normalize(_WorldSpaceCameraPos - position);
|
||||
|
||||
// Construct orthonormal basis around N, aligned with V
|
||||
half3x3 basis;
|
||||
basis[0] = normalize(V - N * dot(V, N));
|
||||
basis[1] = normalize(cross(N, basis[0]));
|
||||
basis[2] = N;
|
||||
|
||||
// Transform light vertices into that space
|
||||
half4x3 L;
|
||||
L = _LightVerts - half4x3(position, position, position, position);
|
||||
L = mul(L, transpose(basis));
|
||||
|
||||
// UVs for sampling the LUTs
|
||||
half theta = acos(dot(V, N));
|
||||
half2 uv = half2(roughness, theta/1.57);
|
||||
|
||||
half3 AmpDiffAmpSpecFresnel = tex2D(_AmpDiffAmpSpecFresnel, uv).rgb;
|
||||
|
||||
half3 result = 0;
|
||||
#if AREA_LIGHT_ENABLE_DIFFUSE
|
||||
half diffuseTerm = TransformedPolygonRadiance(L, uv, _TransformInv_Diffuse, AmpDiffAmpSpecFresnel.x);
|
||||
result = diffuseTerm * diffColor;
|
||||
#endif
|
||||
|
||||
half specularTerm = TransformedPolygonRadiance(L, uv, _TransformInv_Specular, AmpDiffAmpSpecFresnel.y);
|
||||
half fresnelTerm = specColor + (1.0 - specColor) * AmpDiffAmpSpecFresnel.z;
|
||||
result += specularTerm * fresnelTerm * UNITY_PI;
|
||||
|
||||
#if AREA_LIGHT_SHADOWS
|
||||
result *= shadow;
|
||||
#endif
|
||||
|
||||
return result * lightColor;
|
||||
}
|
@ -1,9 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: fd7e771f2b4bdf14da1d4e099b8bd629
|
||||
timeCreated: 1453121090
|
||||
licenseType: Pro
|
||||
ShaderImporter:
|
||||
defaultTextures: []
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -1,110 +0,0 @@
|
||||
Shader "Hidden/AreaLight" {
|
||||
SubShader {
|
||||
Tags { "Queue"="Geometry-1" }
|
||||
|
||||
CGINCLUDE
|
||||
#include "UnityCG.cginc"
|
||||
#include "UnityPBSLighting.cginc"
|
||||
#include "UnityDeferredLibrary.cginc"
|
||||
|
||||
#define AREA_LIGHT_ENABLE_DIFFUSE 1
|
||||
|
||||
#if AREA_LIGHT_SHADOWS
|
||||
#include "AreaLightShadows.cginc"
|
||||
#endif
|
||||
#include "AreaLight.cginc"
|
||||
|
||||
sampler2D _CameraGBufferTexture0;
|
||||
sampler2D _CameraGBufferTexture1;
|
||||
sampler2D _CameraGBufferTexture2;
|
||||
|
||||
void DeferredCalculateLightParams (
|
||||
unity_v2f_deferred i,
|
||||
out float3 outWorldPos,
|
||||
out float2 outUV)
|
||||
{
|
||||
i.ray = i.ray * (_ProjectionParams.z / i.ray.z);
|
||||
float2 uv = i.uv.xy / i.uv.w;
|
||||
|
||||
// read depth and reconstruct world position
|
||||
float depth = SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, uv);
|
||||
depth = Linear01Depth (depth);
|
||||
float4 vpos = float4(i.ray * depth,1);
|
||||
float3 wpos = mul (unity_CameraToWorld, vpos).xyz;
|
||||
|
||||
outWorldPos = wpos;
|
||||
outUV = uv;
|
||||
}
|
||||
|
||||
half4 CalculateLightDeferred (unity_v2f_deferred i)
|
||||
{
|
||||
float3 worldPos;
|
||||
float2 uv;
|
||||
DeferredCalculateLightParams (i, worldPos, uv);
|
||||
|
||||
half4 gbuffer0 = tex2D (_CameraGBufferTexture0, uv);
|
||||
half4 gbuffer1 = tex2D (_CameraGBufferTexture1, uv);
|
||||
half4 gbuffer2 = tex2D (_CameraGBufferTexture2, uv);
|
||||
|
||||
half3 baseColor = gbuffer0.rgb;
|
||||
half3 specColor = gbuffer1.rgb;
|
||||
half oneMinusRoughness = gbuffer1.a;
|
||||
half3 normalWorld = gbuffer2.rgb * 2 - 1;
|
||||
normalWorld = normalize(normalWorld);
|
||||
|
||||
return CalculateLight (worldPos, baseColor, specColor, oneMinusRoughness, normalWorld,
|
||||
_LightPos.xyz, _LightColor.xyz).rgbb;
|
||||
}
|
||||
ENDCG
|
||||
|
||||
// shadows
|
||||
Pass
|
||||
{
|
||||
Fog { Mode Off }
|
||||
ZWrite Off
|
||||
Blend One One
|
||||
Cull Front
|
||||
ZTest Always
|
||||
|
||||
CGPROGRAM
|
||||
#pragma target 3.0
|
||||
#pragma vertex vert_deferred
|
||||
#pragma fragment frag
|
||||
#pragma exclude_renderers nomrt
|
||||
// only one option, so it will always be set and before any includes
|
||||
#pragma multi_compile AREA_LIGHT_SHADOWS
|
||||
|
||||
fixed4 frag (unity_v2f_deferred i) : SV_Target
|
||||
{
|
||||
return CalculateLightDeferred(i);
|
||||
}
|
||||
|
||||
ENDCG
|
||||
}
|
||||
|
||||
// no shadows
|
||||
Pass
|
||||
{
|
||||
Fog { Mode Off }
|
||||
ZWrite Off
|
||||
Blend One One
|
||||
Cull Front
|
||||
ZTest Always
|
||||
|
||||
CGPROGRAM
|
||||
#pragma target 3.0
|
||||
#pragma vertex vert_deferred
|
||||
#pragma fragment frag
|
||||
#pragma exclude_renderers nomrt
|
||||
|
||||
fixed4 frag (unity_v2f_deferred i) : SV_Target
|
||||
{
|
||||
return CalculateLightDeferred(i);
|
||||
}
|
||||
|
||||
ENDCG
|
||||
}
|
||||
|
||||
}
|
||||
Fallback Off
|
||||
}
|
@ -1,9 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 2b28be3523d190a41910088d1ee68ef7
|
||||
timeCreated: 1453120999
|
||||
licenseType: Pro
|
||||
ShaderImporter:
|
||||
defaultTextures: []
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -1,112 +0,0 @@
|
||||
cbuffer POISSON_DISKS {
|
||||
static half2 poisson[40] = {
|
||||
half2(0.02971195f, 0.8905211f),
|
||||
half2(0.2495298f, 0.732075f),
|
||||
half2(-0.3469206f, 0.6437836f),
|
||||
half2(-0.01878909f, 0.4827394f),
|
||||
half2(-0.2725213f, 0.896188f),
|
||||
half2(-0.6814336f, 0.6480481f),
|
||||
half2(0.4152045f, 0.2794172f),
|
||||
half2(0.1310554f, 0.2675925f),
|
||||
half2(0.5344744f, 0.5624411f),
|
||||
half2(0.8385689f, 0.5137348f),
|
||||
half2(0.6045052f, 0.08393857f),
|
||||
half2(0.4643163f, 0.8684642f),
|
||||
half2(0.335507f, -0.110113f),
|
||||
half2(0.03007669f, -0.0007075319f),
|
||||
half2(0.8077537f, 0.2551664f),
|
||||
half2(-0.1521498f, 0.2429521f),
|
||||
half2(-0.2997617f, 0.0234927f),
|
||||
half2(0.2587779f, -0.4226915f),
|
||||
half2(-0.01448214f, -0.2720358f),
|
||||
half2(-0.3937779f, -0.228529f),
|
||||
half2(-0.7833176f, 0.1737299f),
|
||||
half2(-0.4447537f, 0.2582748f),
|
||||
half2(-0.9030743f, 0.406874f),
|
||||
half2(-0.729588f, -0.2115215f),
|
||||
half2(-0.5383645f, -0.6681151f),
|
||||
half2(-0.07709587f, -0.5395499f),
|
||||
half2(-0.3402214f, -0.4782109f),
|
||||
half2(-0.5580465f, 0.01399586f),
|
||||
half2(-0.105644f, -0.9191031f),
|
||||
half2(-0.8343651f, -0.4750755f),
|
||||
half2(-0.9959937f, -0.0540134f),
|
||||
half2(0.1747736f, -0.936202f),
|
||||
half2(-0.3642297f, -0.926432f),
|
||||
half2(0.1719682f, -0.6798802f),
|
||||
half2(0.4424475f, -0.7744268f),
|
||||
half2(0.6849481f, -0.3031401f),
|
||||
half2(0.5453879f, -0.5152272f),
|
||||
half2(0.9634013f, -0.2050581f),
|
||||
half2(0.9907925f, 0.08320642f),
|
||||
half2(0.8386722f, -0.5428791f)
|
||||
};
|
||||
};
|
||||
|
||||
Texture2D _Shadowmap;
|
||||
SamplerComparisonState sampler_Shadowmap;
|
||||
|
||||
// To get a sampler, which doesn't do comparison
|
||||
Texture2D _ShadowmapDummy;
|
||||
SamplerState sampler_ShadowmapDummy;
|
||||
|
||||
half _ShadowReceiverWidth;
|
||||
half _ShadowReceiverDistanceScale;
|
||||
half2 _ShadowLightWidth;
|
||||
half _ShadowBias;
|
||||
float4x4 _ShadowProjectionMatrix;
|
||||
|
||||
half EdgeSmooth(half2 xy)
|
||||
{
|
||||
// Magic tweaks to the shape
|
||||
float corner = 0.4;
|
||||
float outset = 1.0;
|
||||
float smooth = 0.5;
|
||||
|
||||
float d = length(max(abs(xy) - 1 + corner*outset, 0.0)) - corner;
|
||||
return saturate(1 - smoothstep(-smooth, 0, d));
|
||||
}
|
||||
|
||||
half ReverseZ(half z)
|
||||
{
|
||||
#if UNITY_REVERSED_Z
|
||||
return 1.0 - z;
|
||||
#endif
|
||||
return z;
|
||||
}
|
||||
|
||||
half Shadow(half3 position)
|
||||
{
|
||||
half4 pClip = mul(_ShadowProjectionMatrix, half4(position, 1));
|
||||
half3 p = pClip.xyz/pClip.w;
|
||||
if (any(step(1.0, abs(p.xy))))
|
||||
return 0;
|
||||
|
||||
// The texture contains just 0. But we need to sample it somewhere for Unity to initialize the corresponding sampler.
|
||||
float dist = _ShadowmapDummy.Sample(sampler_ShadowmapDummy, 0).a;
|
||||
|
||||
half edgeSmooth = EdgeSmooth(p.xy);
|
||||
p = p * 0.5 + 0.5;
|
||||
|
||||
for(int j = 0; j < 10; ++j)
|
||||
{
|
||||
half2 offset = poisson[j + 24] * _ShadowReceiverWidth;
|
||||
float depth = ReverseZ(_Shadowmap.SampleLevel(sampler_ShadowmapDummy, p.xy + offset, 0).r);
|
||||
|
||||
dist += max(0.0, p.z - depth);
|
||||
}
|
||||
|
||||
dist *= _ShadowReceiverDistanceScale;
|
||||
|
||||
p.z -= _ShadowBias/pClip.w;
|
||||
p.z = ReverseZ(p.z);
|
||||
half shadow = 0;
|
||||
for(int i = 0; i < 32; ++i)
|
||||
{
|
||||
half lightWidth = lerp(_ShadowLightWidth.x, _ShadowLightWidth.y, min(1.0, dist));
|
||||
const half2 offset = poisson[i] * lightWidth;
|
||||
shadow += _Shadowmap.SampleCmpLevelZero(sampler_Shadowmap, p.xy + offset, p.z);
|
||||
}
|
||||
|
||||
return shadow * edgeSmooth / 32.0;
|
||||
}
|
@ -1,9 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: eeb2994f509cea043bc495c62bc72a29
|
||||
timeCreated: 1456842264
|
||||
licenseType: Pro
|
||||
ShaderImporter:
|
||||
defaultTextures: []
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -1,184 +0,0 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!21 &2100000
|
||||
Material:
|
||||
serializedVersion: 6
|
||||
m_ObjectHideFlags: 0
|
||||
m_PrefabParentObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 0}
|
||||
m_Name: AreaLightSource
|
||||
m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0}
|
||||
m_ShaderKeywords: _EMISSION
|
||||
m_LightmapFlags: 1
|
||||
m_CustomRenderQueue: -1
|
||||
stringTagMap: {}
|
||||
m_SavedProperties:
|
||||
serializedVersion: 2
|
||||
m_TexEnvs:
|
||||
- first:
|
||||
name: _BumpMap
|
||||
second:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- first:
|
||||
name: _DetailAlbedoMap
|
||||
second:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- first:
|
||||
name: _DetailMask
|
||||
second:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- first:
|
||||
name: _DetailNormalMap
|
||||
second:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- first:
|
||||
name: _EmissionMap
|
||||
second:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- first:
|
||||
name: _MainTex
|
||||
second:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- first:
|
||||
name: _MetallicGlossMap
|
||||
second:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- first:
|
||||
name: _OcclusionMap
|
||||
second:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- first:
|
||||
name: _ParallaxMap
|
||||
second:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- first:
|
||||
name: _SpecGlossMap
|
||||
second:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
m_Floats:
|
||||
- first:
|
||||
name: _BumpScale
|
||||
second: 1
|
||||
- first:
|
||||
name: _CullMode
|
||||
second: 2
|
||||
- first:
|
||||
name: _Cutoff
|
||||
second: 0.5
|
||||
- first:
|
||||
name: _DetailMode
|
||||
second: 0
|
||||
- first:
|
||||
name: _DetailNormalMapScale
|
||||
second: 1
|
||||
- first:
|
||||
name: _DstBlend
|
||||
second: 0
|
||||
- first:
|
||||
name: _GlossMapScale
|
||||
second: 1
|
||||
- first:
|
||||
name: _Glossiness
|
||||
second: 0
|
||||
- first:
|
||||
name: _GlossyReflections
|
||||
second: 1
|
||||
- first:
|
||||
name: _MetaDiffuseScale
|
||||
second: 1
|
||||
- first:
|
||||
name: _MetaEmissionScale
|
||||
second: 1
|
||||
- first:
|
||||
name: _MetaMetallicSoup
|
||||
second: 1
|
||||
- first:
|
||||
name: _MetaSpecularScale
|
||||
second: 1
|
||||
- first:
|
||||
name: _MetaUseCustom
|
||||
second: 0
|
||||
- first:
|
||||
name: _Metallic
|
||||
second: 0
|
||||
- first:
|
||||
name: _Mode
|
||||
second: 0
|
||||
- first:
|
||||
name: _OcclusionStrength
|
||||
second: 1
|
||||
- first:
|
||||
name: _Parallax
|
||||
second: 0.02
|
||||
- first:
|
||||
name: _SmoothnessTextureChannel
|
||||
second: 0
|
||||
- first:
|
||||
name: _SpecularHighlights
|
||||
second: 1
|
||||
- first:
|
||||
name: _SrcBlend
|
||||
second: 1
|
||||
- first:
|
||||
name: _Translucency
|
||||
second: 0
|
||||
- first:
|
||||
name: _UVDetailMask
|
||||
second: 0
|
||||
- first:
|
||||
name: _UVSec
|
||||
second: 0
|
||||
- first:
|
||||
name: _VertexOcclusionPower
|
||||
second: 1
|
||||
- first:
|
||||
name: _ZWrite
|
||||
second: 1
|
||||
m_Colors:
|
||||
- first:
|
||||
name: _Color
|
||||
second: {r: 0, g: 0, b: 0, a: 1}
|
||||
- first:
|
||||
name: _EmissionColor
|
||||
second: {r: 1, g: 1, b: 1, a: 1}
|
||||
- first:
|
||||
name: _MetaDiffuseAdd
|
||||
second: {r: 0, g: 0, b: 0, a: 1}
|
||||
- first:
|
||||
name: _MetaDiffuseTint
|
||||
second: {r: 1, g: 1, b: 1, a: 1}
|
||||
- first:
|
||||
name: _MetaEmissionAdd
|
||||
second: {r: 0, g: 0, b: 0, a: 1}
|
||||
- first:
|
||||
name: _MetaEmissionTint
|
||||
second: {r: 1, g: 1, b: 1, a: 1}
|
||||
- first:
|
||||
name: _MetaSpecularAdd
|
||||
second: {r: 0, g: 0, b: 0, a: 1}
|
||||
- first:
|
||||
name: _MetaSpecularTint
|
||||
second: {r: 1, g: 1, b: 1, a: 1}
|
||||
- first:
|
||||
name: _SpecColor
|
||||
second: {r: 0.19999996, g: 0.19999996, b: 0.19999996, a: 1}
|
@ -1,8 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 1eb056d70e23cc34a9e926d8c8c887a5
|
||||
timeCreated: 1450296949
|
||||
licenseType: Pro
|
||||
NativeFormatImporter:
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -1,9 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 08cc8bb0acab7fa4f89387fd57ea92f5
|
||||
folderAsset: yes
|
||||
timeCreated: 1477661017
|
||||
licenseType: Pro
|
||||
DefaultImporter:
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
File diff suppressed because it is too large
Load Diff
@ -1,8 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: e4b4074801779784da23d0db51071030
|
||||
timeCreated: 1477663661
|
||||
licenseType: Pro
|
||||
DefaultImporter:
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -1,9 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 44021e8904d04fa4bab45700dd060f65
|
||||
folderAsset: yes
|
||||
timeCreated: 1477748594
|
||||
licenseType: Pro
|
||||
DefaultImporter:
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -1,34 +0,0 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!21 &2100000
|
||||
Material:
|
||||
serializedVersion: 6
|
||||
m_ObjectHideFlags: 0
|
||||
m_PrefabParentObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 0}
|
||||
m_Name: StandardAlphaBlended-VolumetricFog
|
||||
m_Shader: {fileID: 4800000, guid: 9dca33cc83d85fd409e8d3dfc9db5676, type: 3}
|
||||
m_ShaderKeywords:
|
||||
m_LightmapFlags: 5
|
||||
m_CustomRenderQueue: -1
|
||||
stringTagMap: {}
|
||||
m_SavedProperties:
|
||||
serializedVersion: 2
|
||||
m_TexEnvs:
|
||||
- first:
|
||||
name: _MainTex
|
||||
second:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
m_Floats:
|
||||
- first:
|
||||
name: _Glossiness
|
||||
second: 0.667
|
||||
- first:
|
||||
name: _Metallic
|
||||
second: 0
|
||||
m_Colors:
|
||||
- first:
|
||||
name: _Color
|
||||
second: {r: 1, g: 1, b: 1, a: 0}
|
@ -1,8 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: b92b0577b1e30bf4ab3b04c3e6a74994
|
||||
timeCreated: 1478261393
|
||||
licenseType: Pro
|
||||
NativeFormatImporter:
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -1,102 +0,0 @@
|
||||
Shader "Custom/StandardAlphaBlended-VolumetricFog"
|
||||
{
|
||||
Properties
|
||||
{
|
||||
_Color ("Color", Color) = (1,1,1,1)
|
||||
_MainTex ("Albedo (RGB)", 2D) = "white" {}
|
||||
_Glossiness ("Smoothness", Range(0,1)) = 0.5
|
||||
_Metallic ("Metallic", Range(0,1)) = 0.0
|
||||
}
|
||||
SubShader
|
||||
{
|
||||
Tags {"Queue" = "Transparent" "RenderType"="Transparent" }
|
||||
LOD 200
|
||||
|
||||
CGPROGRAM
|
||||
|
||||
#pragma surface surf Standard fullforwardshadows alpha finalcolor:ApplyFog
|
||||
#pragma target 3.0
|
||||
#pragma multi_compile _ VOLUMETRIC_FOG
|
||||
|
||||
#if VOLUMETRIC_FOG
|
||||
#include "../../VolumetricFog/Shaders/VolumetricFog.cginc"
|
||||
#endif
|
||||
|
||||
sampler2D _MainTex;
|
||||
sampler2D _CameraDepthTexture;
|
||||
|
||||
struct Input {
|
||||
float2 uv_MainTex;
|
||||
float4 screenPos;
|
||||
};
|
||||
|
||||
void ApplyFog(Input IN, SurfaceOutputStandard o, inout fixed4 color)
|
||||
{
|
||||
#if VOLUMETRIC_FOG
|
||||
half3 uvscreen = IN.screenPos.xyz/IN.screenPos.w;
|
||||
half linear01Depth = Linear01Depth(uvscreen.z);
|
||||
fixed4 fog = Fog(linear01Depth, uvscreen.xy);
|
||||
|
||||
// Always apply fog attenuation - also in the forward add pass.
|
||||
color.rgb *= fog.a;
|
||||
|
||||
// Alpha premultiply mode (used with alpha and Standard lighting function, or explicitly alpha:premul)
|
||||
// uses source blend factor of One instead of SrcAlpha. `color` is compensated for it, so we need to compensate
|
||||
// the amount of inscattering too. A note on why this works: below.
|
||||
#if _ALPHAPREMULTIPLY_ON
|
||||
fog.rgb *= o.Alpha;
|
||||
#endif
|
||||
|
||||
// Add inscattering only once, so in forward base, but not forward add.
|
||||
#ifndef UNITY_PASS_FORWARDADD
|
||||
color.rgb += fog.rgb;
|
||||
#endif
|
||||
|
||||
// So why does multiplying the inscattered light by alpha work?
|
||||
// In other words: how did fog ever work, if opaque objects add all of the inscattered light
|
||||
// between them and the camera, and then the transparencies add even more?
|
||||
//
|
||||
// This is our scene initially:
|
||||
// scene |---is0---------------------------------------> camera
|
||||
//
|
||||
// And that's with the transparent object added in between the opaque stuff and the camera:
|
||||
// scene |---is1---> transparent |---is2---------------> camera
|
||||
//
|
||||
// When rendering, we start with the opaque part of the scene and add all the light inscattered between that and the camera: is0.
|
||||
// Then we add the transparent object. It does two things (let's consider the alpha premultiply version):
|
||||
// - Dims whatever was behind it (including is0) by OneMinusSrcAlpha
|
||||
// - Adds light inscattered in front of it (is2), multiplied by Alpha
|
||||
//
|
||||
// So all in all we end up with this much inscattered light:
|
||||
// is0 * OneMinusSrcAlpha + is2 * Alpha
|
||||
//
|
||||
// Judging by the diagram, though, the correct amount should be:
|
||||
// is1 * OneMinusSrcAlpha + is2
|
||||
//
|
||||
// Turns out the two expressions are equal - who would've thunk?
|
||||
// is1 = is0 - is2
|
||||
// (is0 - is2) * OneMinusSrcAlpha + is2
|
||||
// is0 * OneMinusSrcAlpha - is2 * (1 - Alpha) + is2
|
||||
// is0 * OneMinusSrcAlpha - is2 + is2 * Alpha + is2
|
||||
// is0 * OneMinusSrcAlpha + is2 * Alpha
|
||||
|
||||
// I leave figuring out if the fog attenuation is correct as an exercise to the reader ;)
|
||||
#endif
|
||||
}
|
||||
|
||||
half _Glossiness;
|
||||
half _Metallic;
|
||||
fixed4 _Color;
|
||||
|
||||
void surf (Input IN, inout SurfaceOutputStandard o)
|
||||
{
|
||||
fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;
|
||||
o.Albedo = c.rgb;
|
||||
o.Metallic = _Metallic;
|
||||
o.Smoothness = _Glossiness;
|
||||
o.Alpha = c.a;
|
||||
}
|
||||
ENDCG
|
||||
}
|
||||
FallBack "Standard"
|
||||
}
|
@ -1,9 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 9dca33cc83d85fd409e8d3dfc9db5676
|
||||
timeCreated: 1478225190
|
||||
licenseType: Pro
|
||||
ShaderImporter:
|
||||
defaultTextures: []
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -1,190 +0,0 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!21 &2100000
|
||||
Material:
|
||||
serializedVersion: 6
|
||||
m_ObjectHideFlags: 0
|
||||
m_PrefabParentObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 0}
|
||||
m_Name: blck
|
||||
m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0}
|
||||
m_ShaderKeywords: _EMISSION
|
||||
m_LightmapFlags: 1
|
||||
m_CustomRenderQueue: -1
|
||||
stringTagMap: {}
|
||||
m_SavedProperties:
|
||||
serializedVersion: 2
|
||||
m_TexEnvs:
|
||||
- first:
|
||||
name: _BumpMap
|
||||
second:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- first:
|
||||
name: _DetailAlbedoMap
|
||||
second:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- first:
|
||||
name: _DetailMask
|
||||
second:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- first:
|
||||
name: _DetailNormalMap
|
||||
second:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- first:
|
||||
name: _EmissionMap
|
||||
second:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- first:
|
||||
name: _MainTex
|
||||
second:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- first:
|
||||
name: _MetallicGlossMap
|
||||
second:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- first:
|
||||
name: _OcclusionMap
|
||||
second:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- first:
|
||||
name: _ParallaxMap
|
||||
second:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- first:
|
||||
name: _SpecGlossMap
|
||||
second:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
m_Floats:
|
||||
- first:
|
||||
name: _BumpScale
|
||||
second: 1
|
||||
- first:
|
||||
name: _CullMode
|
||||
second: 2
|
||||
- first:
|
||||
name: _Cutoff
|
||||
second: 0.5
|
||||
- first:
|
||||
name: _DetailMode
|
||||
second: 0
|
||||
- first:
|
||||
name: _DetailNormalMapScale
|
||||
second: 1
|
||||
- first:
|
||||
name: _DstBlend
|
||||
second: 0
|
||||
- first:
|
||||
name: _GlossMapScale
|
||||
second: 1
|
||||
- first:
|
||||
name: _Glossiness
|
||||
second: 0.633
|
||||
- first:
|
||||
name: _GlossyReflections
|
||||
second: 1
|
||||
- first:
|
||||
name: _LightProbeScale
|
||||
second: 1
|
||||
- first:
|
||||
name: _MetaDiffuseScale
|
||||
second: 1
|
||||
- first:
|
||||
name: _MetaEmissionScale
|
||||
second: 1
|
||||
- first:
|
||||
name: _MetaMetallicSoup
|
||||
second: 1
|
||||
- first:
|
||||
name: _MetaSpecularScale
|
||||
second: 1
|
||||
- first:
|
||||
name: _MetaUseCustom
|
||||
second: 0
|
||||
- first:
|
||||
name: _Metallic
|
||||
second: 0
|
||||
- first:
|
||||
name: _Mode
|
||||
second: 0
|
||||
- first:
|
||||
name: _OcclusionStrength
|
||||
second: 1
|
||||
- first:
|
||||
name: _Parallax
|
||||
second: 0.02
|
||||
- first:
|
||||
name: _ReflectionProbeBoost
|
||||
second: 1
|
||||
- first:
|
||||
name: _SmoothnessTextureChannel
|
||||
second: 0
|
||||
- first:
|
||||
name: _SpecularHighlights
|
||||
second: 1
|
||||
- first:
|
||||
name: _SrcBlend
|
||||
second: 1
|
||||
- first:
|
||||
name: _Translucency
|
||||
second: 0
|
||||
- first:
|
||||
name: _UVDetailMask
|
||||
second: 0
|
||||
- first:
|
||||
name: _UVSec
|
||||
second: 0
|
||||
- first:
|
||||
name: _VertexOcclusionPower
|
||||
second: 1
|
||||
- first:
|
||||
name: _ZWrite
|
||||
second: 1
|
||||
m_Colors:
|
||||
- first:
|
||||
name: _Color
|
||||
second: {r: 0.16176468, g: 0.16176468, b: 0.16176468, a: 1}
|
||||
- first:
|
||||
name: _EmissionColor
|
||||
second: {r: 0, g: 0, b: 0, a: 1}
|
||||
- first:
|
||||
name: _MetaDiffuseAdd
|
||||
second: {r: 0, g: 0, b: 0, a: 1}
|
||||
- first:
|
||||
name: _MetaDiffuseTint
|
||||
second: {r: 1, g: 1, b: 1, a: 1}
|
||||
- first:
|
||||
name: _MetaEmissionAdd
|
||||
second: {r: 0, g: 0, b: 0, a: 1}
|
||||
- first:
|
||||
name: _MetaEmissionTint
|
||||
second: {r: 1, g: 1, b: 1, a: 1}
|
||||
- first:
|
||||
name: _MetaSpecularAdd
|
||||
second: {r: 0, g: 0, b: 0, a: 1}
|
||||
- first:
|
||||
name: _MetaSpecularTint
|
||||
second: {r: 1, g: 1, b: 1, a: 1}
|
||||
- first:
|
||||
name: _SpecColor
|
||||
second: {r: 0.19999996, g: 0.19999996, b: 0.19999996, a: 1}
|
@ -1,8 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 407b0765066496e4da88d97aa9205037
|
||||
timeCreated: 1432511050
|
||||
licenseType: Pro
|
||||
NativeFormatImporter:
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
File diff suppressed because it is too large
Load Diff
@ -1,8 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 915ed33d3a042174eb51699251f87c5b
|
||||
timeCreated: 1478261417
|
||||
licenseType: Pro
|
||||
DefaultImporter:
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
File diff suppressed because it is too large
Load Diff
@ -1,8 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 54a18da41a501694a8e1980a2a897da7
|
||||
timeCreated: 1477692305
|
||||
licenseType: Pro
|
||||
DefaultImporter:
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
File diff suppressed because it is too large
Load Diff
@ -1,8 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 272d3d2fab1f6784dae6c85bdf479508
|
||||
timeCreated: 1477693506
|
||||
licenseType: Pro
|
||||
DefaultImporter:
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -1,9 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 7af1fbf5b0c3fc34e929a665f1822f98
|
||||
folderAsset: yes
|
||||
timeCreated: 1476957694
|
||||
licenseType: Pro
|
||||
DefaultImporter:
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -1,9 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 95f79d7423b1c4239ba221be74ca9134
|
||||
folderAsset: yes
|
||||
timeCreated: 1446582841
|
||||
licenseType: Pro
|
||||
DefaultImporter:
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -1,62 +0,0 @@
|
||||
using UnityEngine;
|
||||
using UnityEditor;
|
||||
using UnityEditor.AnimatedValues;
|
||||
|
||||
[CustomEditor(typeof(TubeLight))]
|
||||
[CanEditMultipleObjects]
|
||||
public class TubeLightEditor : Editor {
|
||||
|
||||
AnimFloat m_ShowInfo;
|
||||
|
||||
void OnEnable()
|
||||
{
|
||||
m_ShowInfo = new AnimFloat(0);
|
||||
m_ShowInfo.valueChanged.AddListener(Repaint);
|
||||
m_ShowInfo.speed = 0.5f;
|
||||
}
|
||||
|
||||
override public void OnInspectorGUI()
|
||||
{
|
||||
DrawDefaultInspector();
|
||||
|
||||
if (targets.Length > 1)
|
||||
return;
|
||||
|
||||
EditorGUILayout.Space();
|
||||
|
||||
if(GUILayout.Button("Add a shadow plane"))
|
||||
m_ShowInfo.value = AddShadowPlane() ? 0 : 100;
|
||||
|
||||
foreach (TubeLightShadowPlane shadowPlane in ((TubeLight)target).m_ShadowPlanes)
|
||||
if (shadowPlane != null)
|
||||
EditorGUILayout.ObjectField("Shadow Plane", shadowPlane, typeof(TubeLightShadowPlane), !EditorUtility.IsPersistent(target));
|
||||
|
||||
m_ShowInfo.target = 0;
|
||||
if (EditorGUILayout.BeginFadeGroup(Mathf.Min(1.0f, m_ShowInfo.value)))
|
||||
EditorGUILayout.HelpBox("Limit of " + TubeLight.maxPlanes + " planes reached. Delete an existing one.", MessageType.Info);
|
||||
EditorGUILayout.EndFadeGroup();
|
||||
}
|
||||
|
||||
bool AddShadowPlane()
|
||||
{
|
||||
TubeLight tubeLight = (TubeLight)target;
|
||||
|
||||
int i = 0;
|
||||
for (; i < TubeLight.maxPlanes; i++)
|
||||
{
|
||||
if (tubeLight.m_ShadowPlanes[i] != null)
|
||||
continue;
|
||||
|
||||
GameObject go = new GameObject("Shadow Plane");
|
||||
TubeLightShadowPlane shadowPlane = go.AddComponent<TubeLightShadowPlane>();
|
||||
|
||||
go.transform.position = tubeLight.transform.position + go.transform.forward;
|
||||
go.transform.parent = tubeLight.transform;
|
||||
tubeLight.m_ShadowPlanes[i] = shadowPlane;
|
||||
EditorUtility.SetDirty (tubeLight);
|
||||
break;
|
||||
}
|
||||
|
||||
return i < TubeLight.maxPlanes;
|
||||
}
|
||||
}
|
@ -1,12 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 00a6ee99a4a9a44879507a5c4077d7a0
|
||||
timeCreated: 1446582855
|
||||
licenseType: Pro
|
||||
MonoImporter:
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -1,9 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: fa6f2ae72d2fc9643afe34db34a35a28
|
||||
folderAsset: yes
|
||||
timeCreated: 1477748611
|
||||
licenseType: Pro
|
||||
DefaultImporter:
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -1,327 +0,0 @@
|
||||
using UnityEngine;
|
||||
using UnityEngine.Rendering;
|
||||
using System.Collections.Generic;
|
||||
|
||||
[ExecuteInEditMode]
|
||||
public class TubeLight : MonoBehaviour
|
||||
{
|
||||
public float m_Intensity = 0.8f;
|
||||
public Color m_Color = Color.white;
|
||||
public float m_Range = 10.0f;
|
||||
public float m_Radius = 0.3f;
|
||||
public float m_Length = 0.0f;
|
||||
|
||||
[HideInInspector]
|
||||
public Mesh m_Sphere;
|
||||
[HideInInspector]
|
||||
public Mesh m_Capsule;
|
||||
[HideInInspector]
|
||||
public Shader m_ProxyShader;
|
||||
Material m_ProxyMaterial;
|
||||
|
||||
public bool m_RenderSource = false;
|
||||
Renderer m_SourceRenderer;
|
||||
Transform m_SourceTransform;
|
||||
Mesh m_SourceMesh;
|
||||
float m_LastLength = -1;
|
||||
|
||||
public const int maxPlanes = 2;
|
||||
[HideInInspector]
|
||||
public TubeLightShadowPlane[] m_ShadowPlanes = new TubeLightShadowPlane[maxPlanes];
|
||||
|
||||
bool m_Initialized = false;
|
||||
MaterialPropertyBlock m_props;
|
||||
|
||||
const float kMinRadius = 0.001f;
|
||||
bool renderSource {get{return m_RenderSource && m_Radius >= kMinRadius;}}
|
||||
|
||||
Dictionary<Camera, CommandBuffer> m_Cameras = new Dictionary<Camera, CommandBuffer>();
|
||||
static CameraEvent kCameraEvent = CameraEvent.AfterLighting;
|
||||
|
||||
void Start()
|
||||
{
|
||||
if(!Init())
|
||||
return;
|
||||
UpdateMeshesAndBounds();
|
||||
}
|
||||
|
||||
bool Init()
|
||||
{
|
||||
if (m_Initialized)
|
||||
return true;
|
||||
|
||||
// Sometimes on editor startup (especially after project upgrade?), Init() gets called
|
||||
// while m_ProxyShader, m_Sphere or m_Capsule is still null/hasn't loaded.
|
||||
if (m_ProxyShader == null || m_Sphere == null || m_Capsule == null)
|
||||
return false;
|
||||
|
||||
// Proxy
|
||||
m_ProxyMaterial = new Material(m_ProxyShader);
|
||||
m_ProxyMaterial.hideFlags = HideFlags.HideAndDontSave;
|
||||
|
||||
// Source
|
||||
m_SourceMesh = Instantiate<Mesh>(m_Capsule);
|
||||
m_SourceMesh.hideFlags = HideFlags.HideAndDontSave;
|
||||
|
||||
// Can't create the MeshFilter here, since for some reason the DontSave flag has
|
||||
// no effect on it. Has to be added to the prefab instead.
|
||||
//m_SourceMeshFilter = gameObject.AddComponent<MeshFilter>();
|
||||
MeshFilter mfs = gameObject.GetComponent<MeshFilter>();
|
||||
// Hmm, causes trouble
|
||||
// mfs.hideFlags = HideFlags.HideInInspector;
|
||||
mfs.sharedMesh = m_SourceMesh;
|
||||
|
||||
// A similar problem here.
|
||||
// m_SourceRenderer = gameObject.AddComponent<MeshRenderer>();
|
||||
m_SourceRenderer = gameObject.GetComponent<MeshRenderer>();
|
||||
m_SourceRenderer.enabled = true;
|
||||
|
||||
// We want it to be pickable in the scene view, so no HideAndDontSave
|
||||
// Hmm, causes trouble
|
||||
// m_SourceRenderer.hideFlags = HideFlags.DontSave | HideFlags.HideInInspector;
|
||||
|
||||
m_SourceTransform = transform;
|
||||
|
||||
m_Initialized = true;
|
||||
return true;
|
||||
}
|
||||
|
||||
void OnEnable()
|
||||
{
|
||||
if(m_props == null)
|
||||
m_props = new MaterialPropertyBlock();
|
||||
|
||||
if(!Init())
|
||||
return;
|
||||
UpdateMeshesAndBounds();
|
||||
}
|
||||
|
||||
void OnDisable()
|
||||
{
|
||||
if(!Application.isPlaying)
|
||||
Cleanup();
|
||||
else
|
||||
for(var e = m_Cameras.GetEnumerator(); e.MoveNext();)
|
||||
if(e.Current.Value != null)
|
||||
e.Current.Value.Clear();
|
||||
}
|
||||
|
||||
void OnDestroy()
|
||||
{
|
||||
if (m_ProxyMaterial != null)
|
||||
DestroyImmediate(m_ProxyMaterial);
|
||||
if (m_SourceMesh != null)
|
||||
DestroyImmediate(m_SourceMesh);
|
||||
Cleanup();
|
||||
}
|
||||
|
||||
void Cleanup()
|
||||
{
|
||||
for(var e = m_Cameras.GetEnumerator(); e.MoveNext();)
|
||||
{
|
||||
var cam = e.Current;
|
||||
if(cam.Key != null && cam.Value != null)
|
||||
cam.Key.RemoveCommandBuffer (kCameraEvent, cam.Value);
|
||||
}
|
||||
m_Cameras.Clear();
|
||||
}
|
||||
|
||||
void UpdateMeshesAndBounds()
|
||||
{
|
||||
// Sanitize
|
||||
m_Range = Mathf.Max(m_Range, 0);
|
||||
m_Radius = Mathf.Max(m_Radius, 0);
|
||||
m_Length = Mathf.Max(m_Length, 0);
|
||||
m_Intensity = Mathf.Max(m_Intensity, 0);
|
||||
|
||||
Vector3 sourceSize = renderSource ? Vector3.one * m_Radius * 2.0f : Vector3.one;
|
||||
if (m_SourceTransform.localScale != sourceSize || m_Length != m_LastLength)
|
||||
{
|
||||
m_LastLength = m_Length;
|
||||
|
||||
Vector3[] vertices = m_Capsule.vertices;
|
||||
for (int i = 0; i < vertices.Length; i++)
|
||||
{
|
||||
if (renderSource)
|
||||
vertices[i].y += Mathf.Sign(vertices[i].y) * (- 0.5f + 0.25f * m_Length / m_Radius);
|
||||
else
|
||||
vertices[i] = Vector3.one * 0.0001f;
|
||||
}
|
||||
|
||||
m_SourceMesh.vertices = vertices;
|
||||
}
|
||||
|
||||
m_SourceTransform.localScale = sourceSize;
|
||||
|
||||
float range = m_Range + m_Radius;
|
||||
|
||||
// TODO: lazy for now, should draw a tight capsule
|
||||
range += 0.5f * m_Length;
|
||||
range *= 1.02f;
|
||||
|
||||
range /= m_Radius;
|
||||
|
||||
m_SourceMesh.bounds = new Bounds(Vector3.zero, Vector3.one * range);
|
||||
}
|
||||
|
||||
void Update()
|
||||
{
|
||||
if(!Init())
|
||||
return;
|
||||
|
||||
UpdateMeshesAndBounds();
|
||||
|
||||
if(Application.isPlaying)
|
||||
for(var e = m_Cameras.GetEnumerator(); e.MoveNext();)
|
||||
if(e.Current.Value != null)
|
||||
e.Current.Value.Clear();
|
||||
}
|
||||
|
||||
Color GetColor()
|
||||
{
|
||||
if (QualitySettings.activeColorSpace == ColorSpace.Gamma)
|
||||
return m_Color * m_Intensity;
|
||||
|
||||
return new Color(
|
||||
Mathf.GammaToLinearSpace(m_Color.r * m_Intensity),
|
||||
Mathf.GammaToLinearSpace(m_Color.g * m_Intensity),
|
||||
Mathf.GammaToLinearSpace(m_Color.b * m_Intensity),
|
||||
1.0f
|
||||
);
|
||||
}
|
||||
|
||||
void OnWillRenderObject()
|
||||
{
|
||||
if(InsideShadowmapCameraRender())
|
||||
return;
|
||||
|
||||
if(!Init())
|
||||
return;
|
||||
|
||||
// TODO: This is just a very rough guess. Need to properly calculate the surface emission
|
||||
// intensity based on light's intensity.
|
||||
m_props.SetVector("_EmissionColor", m_Color * Mathf.Sqrt(m_Intensity) * 2.0f);
|
||||
m_SourceRenderer.SetPropertyBlock(m_props);
|
||||
|
||||
SetUpCommandBuffer();
|
||||
}
|
||||
|
||||
void SetUpCommandBuffer()
|
||||
{
|
||||
Camera cam = Camera.current;
|
||||
CommandBuffer buf = null;
|
||||
if (!m_Cameras.ContainsKey(cam))
|
||||
{
|
||||
buf = new CommandBuffer();
|
||||
buf.name = gameObject.name;
|
||||
m_Cameras[cam] = buf;
|
||||
cam.AddCommandBuffer(kCameraEvent, buf);
|
||||
cam.depthTextureMode |= DepthTextureMode.Depth;
|
||||
}
|
||||
else
|
||||
{
|
||||
buf = m_Cameras[cam];
|
||||
buf.Clear();
|
||||
}
|
||||
|
||||
Transform t = transform;
|
||||
Vector3 lightAxis = t.up;
|
||||
Vector3 lightPos = t.position - 0.5f * lightAxis * m_Length;
|
||||
buf.SetGlobalVector("_LightPos", new Vector4(lightPos.x, lightPos.y, lightPos.z, 1.0f/(m_Range*m_Range)));
|
||||
buf.SetGlobalVector("_LightAxis", new Vector4(lightAxis.x, lightAxis.y, lightAxis.z, 0.0f));
|
||||
buf.SetGlobalFloat("_LightAsQuad", 0);
|
||||
buf.SetGlobalFloat("_LightRadius", m_Radius);
|
||||
buf.SetGlobalFloat("_LightLength", m_Length);
|
||||
buf.SetGlobalVector("_LightColor", GetColor());
|
||||
|
||||
SetShadowPlaneVectors(buf);
|
||||
|
||||
float range = m_Range + m_Radius;
|
||||
// TODO: lazy for now, should draw a tight capsule
|
||||
range += 0.5f * m_Length;
|
||||
range *= 1.02f;
|
||||
range /= m_Radius;
|
||||
|
||||
Matrix4x4 m = Matrix4x4.Scale(Vector3.one * range);
|
||||
buf.DrawMesh(m_Sphere, t.localToWorldMatrix * m, m_ProxyMaterial, 0, 0);
|
||||
}
|
||||
|
||||
public TubeLightShadowPlane.Params[] GetShadowPlaneParams(ref TubeLightShadowPlane.Params[] p)
|
||||
{
|
||||
if (p == null || p.Length != maxPlanes)
|
||||
p = new TubeLightShadowPlane.Params[maxPlanes];
|
||||
for(int i = 0; i < maxPlanes; i++)
|
||||
{
|
||||
TubeLightShadowPlane sp = m_ShadowPlanes[i];
|
||||
p[i].plane = sp == null ? new Vector4(0, 0, 0, 1) : sp.GetShadowPlaneVector();
|
||||
p[i].feather = sp == null ? 1 : sp.feather;
|
||||
}
|
||||
return p;
|
||||
}
|
||||
|
||||
TubeLightShadowPlane.Params[] sppArr = new TubeLightShadowPlane.Params[maxPlanes];
|
||||
|
||||
void SetShadowPlaneVectors(CommandBuffer buf)
|
||||
{
|
||||
var p = GetShadowPlaneParams(ref sppArr);
|
||||
|
||||
for (int i = 0, n = p.Length; i < n; ++i)
|
||||
{
|
||||
var spp = p[i];
|
||||
if(i == 0) {
|
||||
buf.SetGlobalVector("_ShadowPlane0", spp.plane);
|
||||
buf.SetGlobalFloat("_ShadowPlaneFeather0", spp.feather);
|
||||
} else if(i == 1) {
|
||||
buf.SetGlobalVector("_ShadowPlane1", spp.plane);
|
||||
buf.SetGlobalFloat("_ShadowPlaneFeather1", spp.feather);
|
||||
} else {
|
||||
buf.SetGlobalVector("_ShadowPlane" + i, spp.plane);
|
||||
buf.SetGlobalFloat("_ShadowPlaneFeather" + i, spp.feather);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void OnDrawGizmosSelected()
|
||||
{
|
||||
if (m_SourceTransform == null)
|
||||
return;
|
||||
|
||||
Gizmos.color = Color.white;
|
||||
// Skip the scale
|
||||
Matrix4x4 m = new Matrix4x4();
|
||||
m.SetTRS(m_SourceTransform.position, m_SourceTransform.rotation, Vector3.one);
|
||||
Gizmos.matrix = m;
|
||||
|
||||
Gizmos.DrawWireSphere(Vector3.zero, m_Radius + m_Range + 0.5f * m_Length);
|
||||
|
||||
Vector3 start = 0.5f * Vector3.up * m_Length;
|
||||
Gizmos.DrawWireSphere(start, m_Radius);
|
||||
|
||||
if (m_Length == 0.0f)
|
||||
return;
|
||||
|
||||
Vector3 end = - 0.5f * Vector3.up * m_Length;
|
||||
Gizmos.DrawWireSphere(end, m_Radius);
|
||||
|
||||
Vector3 r = Vector3.forward * m_Radius;
|
||||
Gizmos.DrawLine(start + r, end + r);
|
||||
Gizmos.DrawLine(start - r, end - r);
|
||||
|
||||
r = Vector3.right * m_Radius;
|
||||
Gizmos.DrawLine(start + r, end + r);
|
||||
Gizmos.DrawLine(start - r, end - r);
|
||||
|
||||
}
|
||||
|
||||
void OnDrawGizmos()
|
||||
{
|
||||
// TODO: Looks like this changed the name. Find a more robust way to use the icon.
|
||||
// Gizmos.DrawIcon(transform.position, "PointLight Gizmo_MIP0.png", true);
|
||||
}
|
||||
|
||||
bool InsideShadowmapCameraRender()
|
||||
{
|
||||
RenderTexture target = Camera.current.targetTexture;
|
||||
return target != null && target.format == RenderTextureFormat.Shadowmap;
|
||||
}
|
||||
}
|
@ -1,16 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 5a3b99ed98424ea4587ec18d930a1d77
|
||||
timeCreated: 1444638222
|
||||
licenseType: Pro
|
||||
MonoImporter:
|
||||
serializedVersion: 2
|
||||
defaultReferences:
|
||||
- m_Sphere: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0}
|
||||
- m_Capsule: {fileID: 10208, guid: 0000000000000000e000000000000000, type: 0}
|
||||
- m_ProxyShader: {fileID: 4800000, guid: 2e6fd90941a3e3c458d01f851dca21ed, type: 3}
|
||||
- m_SourceShader: {fileID: 10755, guid: 0000000000000000f000000000000000, type: 0}
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -1,32 +0,0 @@
|
||||
using UnityEngine;
|
||||
|
||||
public class TubeLightShadowPlane : MonoBehaviour
|
||||
{
|
||||
[MinValue(0)]
|
||||
public float m_Feather = 1.0f;
|
||||
|
||||
public float feather {get{ return m_Feather * 0.1f;}}
|
||||
|
||||
public Vector4 GetShadowPlaneVector()
|
||||
{
|
||||
Transform t = transform;
|
||||
Vector3 v = t.forward;
|
||||
float d = Vector3.Dot(t.position, v);
|
||||
return new Vector4(v.x, v.y, v.z, d);
|
||||
}
|
||||
|
||||
void OnDrawGizmosSelected()
|
||||
{
|
||||
Matrix4x4 m = Matrix4x4.zero;
|
||||
Transform t = transform;
|
||||
m.SetTRS(t.position, t.rotation, new Vector3(1, 1, 0));
|
||||
Gizmos.matrix = m;
|
||||
Gizmos.DrawWireSphere(Vector3.zero, 1);
|
||||
}
|
||||
|
||||
public struct Params
|
||||
{
|
||||
public Vector4 plane;
|
||||
public float feather;
|
||||
}
|
||||
}
|
@ -1,12 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 66d8e50a047abb54aa901236f0ed84d2
|
||||
timeCreated: 1446129202
|
||||
licenseType: Pro
|
||||
MonoImporter:
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -1,9 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: b041de53e70b28e4fb9256c930c13615
|
||||
folderAsset: yes
|
||||
timeCreated: 1477749221
|
||||
licenseType: Pro
|
||||
DefaultImporter:
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -1,189 +0,0 @@
|
||||
// Based on 'Real Shading in Unreal Engine 4'
|
||||
// http://blog.selfshadow.com/publications/s2013-shading-course/#course_content
|
||||
|
||||
#include "TubeLightAttenuation.cginc"
|
||||
|
||||
#ifndef SHADOW_PLANES
|
||||
#define SHADOW_PLANES 1
|
||||
#endif
|
||||
|
||||
#if SHADOW_PLANES
|
||||
#include "TubeLightShadowPlanes.cginc"
|
||||
#endif
|
||||
|
||||
#define SHARP_EDGE_FIX 1
|
||||
|
||||
void SphereLightToPointLight(float3 pos, float3 lightPos, float3 eyeVec, half3 normal, float sphereRad, half rangeSqInv, inout UnityLight light, out half lightDist)
|
||||
{
|
||||
half3 viewDir = -eyeVec;
|
||||
half3 r = reflect (viewDir, normal);
|
||||
|
||||
float3 L = lightPos - pos;
|
||||
float3 centerToRay = dot (L, r) * r - L;
|
||||
float3 closestPoint = L + centerToRay * saturate(sphereRad / length(centerToRay));
|
||||
|
||||
lightDist = length(closestPoint);
|
||||
light.dir = closestPoint / lightDist;
|
||||
|
||||
half distLSq = dot(L, L);
|
||||
light.ndotl = saturate(dot(normal, L/sqrt(distLSq)));
|
||||
|
||||
float distNorm = distLSq * rangeSqInv;
|
||||
float atten = AttenuationToZero(distNorm);
|
||||
light.color *= atten;
|
||||
}
|
||||
|
||||
void TubeLightToPointLight(float3 pos, float3 tubeStart, float3 tubeEnd, float3 normal, float tubeRad, float rangeSqInv, float3 representativeDir, float3 lightColor, out float3 outLightColor, out float3 outLightDir, out float outNdotL, out half outLightDist)
|
||||
{
|
||||
half3 N = normal;
|
||||
float3 L0 = tubeStart - pos;
|
||||
float3 L1 = tubeEnd - pos;
|
||||
float L0dotL0 = dot(L0, L0);
|
||||
float distL0 = sqrt(L0dotL0);
|
||||
float distL1 = length(L1);
|
||||
|
||||
float NdotL0 = dot(L0, N) / (2.0 * distL0);
|
||||
float NdotL1 = dot(L1, N) / (2.0 * distL1);
|
||||
outNdotL = saturate(NdotL0 + NdotL1);
|
||||
|
||||
float3 Ldir = L1 - L0;
|
||||
float RepdotL0 = dot(representativeDir, L0);
|
||||
float RepdotLdir = dot(representativeDir, Ldir);
|
||||
float L0dotLdir = dot(L0, Ldir);
|
||||
float LdirdotLdir = dot(Ldir, Ldir);
|
||||
float distLdir = sqrt(LdirdotLdir);
|
||||
|
||||
#if SHARP_EDGE_FIX
|
||||
// There's a very visible discontinuity if we just take the closest distance to ray,
|
||||
// as the original paper suggests. This is an attempt to fix it, but it gets slightly more expensive and
|
||||
// has its own artifact, although this time at least C0 smooth.
|
||||
|
||||
// Smallest angle to ray
|
||||
float t = (L0dotLdir * RepdotL0 - L0dotL0 * RepdotLdir) / (L0dotLdir * RepdotLdir - LdirdotLdir * RepdotL0);
|
||||
t = saturate(t);
|
||||
|
||||
// As representativeDir becomes parallel (well, in some plane) to Ldir and then points away, t flips from 0 to 1 (or vv) and a discontinuity shows up.
|
||||
// Counteract by detecting that relative angle/position and flip t. The discontinuity in t moves to the back side.
|
||||
float3 L0xLdir = cross(L0, Ldir);
|
||||
float3 LdirxR = cross(Ldir, representativeDir);
|
||||
float RepAtLdir = dot(L0xLdir, LdirxR);
|
||||
|
||||
// RepAtLdir is negative if R points away from Ldir.
|
||||
// TODO: check if lerp below is indeed cheaper.
|
||||
// if (RepAtLdir < 0)
|
||||
// t = 1 - t;
|
||||
t = lerp(1 - t, t, step(0, RepAtLdir));
|
||||
|
||||
#else
|
||||
// Original by Karis
|
||||
// Closest distance to ray
|
||||
float t = (RepdotL0 * RepdotLdir - L0dotLdir) / (distLdir * distLdir - RepdotLdir * RepdotLdir);
|
||||
t = saturate(t);
|
||||
|
||||
#endif
|
||||
|
||||
float3 closestPoint = L0 + Ldir * t;
|
||||
float3 centerToRay = dot(closestPoint, representativeDir) * representativeDir - closestPoint;
|
||||
|
||||
closestPoint = closestPoint + centerToRay * saturate(tubeRad / length(centerToRay));
|
||||
|
||||
outLightDist = length(closestPoint);
|
||||
outLightDir = closestPoint / outLightDist;
|
||||
|
||||
float distNorm = 0.5f * (distL0 * distL1 + dot(L0, L1)) * rangeSqInv;
|
||||
outLightColor = lightColor * AttenuationToZero(distNorm);
|
||||
}
|
||||
|
||||
void TubeLightToPointLight(float3 pos, float3 tubeStart, float3 tubeEnd, float3 eyeVec, float3 normal, float tubeRad, float rangeSqInv, float3 lightColor, out float3 outLightColor, out float3 outLightDir, out float outNdotL, out half outLightDist)
|
||||
{
|
||||
half3 viewDir = -eyeVec;
|
||||
half3 representativeDir = reflect (viewDir, normal);
|
||||
|
||||
TubeLightToPointLight(pos, tubeStart, tubeEnd, normal, tubeRad, rangeSqInv, representativeDir, lightColor, outLightColor, outLightDir, outNdotL, outLightDist);
|
||||
}
|
||||
|
||||
inline half GGXTerm_Area (half NdotH, half roughness, half lightDist, half lightRadius)
|
||||
{
|
||||
half a = roughness * roughness;
|
||||
half a2 = a * a;
|
||||
half d = NdotH * NdotH * (a2 - 1.f) + 1.f;
|
||||
d = max(d, 0.000001);
|
||||
|
||||
half aP = saturate( lightRadius / (lightDist*2.0) + a);
|
||||
half aP2 = aP * aP;
|
||||
|
||||
return a2 * a2 / (UNITY_PI * d * d * aP2);
|
||||
}
|
||||
|
||||
half4 BRDF1_Unity_PBS_Area (half3 diffColor, half3 specColor, half oneMinusReflectivity, half oneMinusRoughness,
|
||||
half3 normal, half3 viewDir,
|
||||
UnityLight light, UnityIndirect gi, half lightDist, half lightRadius)
|
||||
{
|
||||
half roughness = 1-oneMinusRoughness;
|
||||
half3 halfDir = Unity_SafeNormalize (light.dir + viewDir);
|
||||
|
||||
half nl = light.ndotl;
|
||||
half nh = BlinnTerm (normal, halfDir);
|
||||
half nv = DotClamped (normal, viewDir);
|
||||
half lv = DotClamped (light.dir, viewDir);
|
||||
half lh = DotClamped (light.dir, halfDir);
|
||||
|
||||
half V = SmithGGXVisibilityTerm (nl, nv, roughness);
|
||||
half D = GGXTerm_Area (nh, roughness, lightDist, lightRadius);
|
||||
|
||||
half nlPow5 = Pow5 (1-nl);
|
||||
half nvPow5 = Pow5 (1-nv);
|
||||
half Fd90 = 0.5 + 2 * lh * lh * roughness;
|
||||
half disneyDiffuse = (1 + (Fd90-1) * nlPow5) * (1 + (Fd90-1) * nvPow5);
|
||||
|
||||
// HACK: theoretically we should divide by Pi diffuseTerm and not multiply specularTerm!
|
||||
// BUT 1) that will make shader look significantly darker than Legacy ones
|
||||
// and 2) on engine side "Non-important" lights have to be divided by Pi to in cases when they are injected into ambient SH
|
||||
// NOTE: multiplication by Pi is part of single constant together with 1/4 now
|
||||
|
||||
half specularTerm = (V * D) * (UNITY_PI/4); // Torrance-Sparrow model, Fresnel is applied later (for optimization reasons)
|
||||
if (IsGammaSpace())
|
||||
specularTerm = sqrt(max(1e-4h, specularTerm));
|
||||
specularTerm = max(0, specularTerm * nl);
|
||||
half diffuseTerm = disneyDiffuse * nl;
|
||||
|
||||
half grazingTerm = saturate(oneMinusRoughness + (1-oneMinusReflectivity));
|
||||
half3 color = diffColor * (gi.diffuse + light.color * diffuseTerm)
|
||||
+ specularTerm * light.color * FresnelTerm (specColor, lh)
|
||||
+ gi.specular * FresnelLerp (specColor, grazingTerm, nv);
|
||||
|
||||
return half4(color, 1);
|
||||
}
|
||||
|
||||
half4 CalculateLight (float3 worldPos, float2 uv, half3 baseColor, half3 specColor, half oneMinusRoughness, half3 normalWorld,
|
||||
half3 lightStart, half3 lightEnd, half3 lightColor, half lightRadius, half lightRangeSqInv)
|
||||
{
|
||||
UnityLight light = (UnityLight)0;
|
||||
|
||||
float3 eyeVec = normalize(worldPos - _WorldSpaceCameraPos);
|
||||
half lightDist = 0;
|
||||
|
||||
#if 0
|
||||
// Can't use a keyword, because no keywords in material property blocks.
|
||||
// TODO: is it worth the dynamic branch?
|
||||
if (sphereLight)
|
||||
SphereLightToPointLight (worldPos, lightStart, eyeVec, normalWorld, lightRadius, lightRangeSqInv, light, lightDist);
|
||||
else
|
||||
#else
|
||||
TubeLightToPointLight (worldPos, lightStart, lightEnd, eyeVec, normalWorld, lightRadius, lightRangeSqInv, lightColor, light.color, light.dir, light.ndotl, lightDist);
|
||||
#endif
|
||||
|
||||
#if SHADOW_PLANES
|
||||
light.color *= ShadowPlanes(worldPos);
|
||||
#endif
|
||||
|
||||
half oneMinusReflectivity = 1 - SpecularStrength(specColor.rgb);
|
||||
|
||||
UnityIndirect ind;
|
||||
UNITY_INITIALIZE_OUTPUT(UnityIndirect, ind);
|
||||
ind.diffuse = 0;
|
||||
ind.specular = 0;
|
||||
|
||||
half4 res = BRDF1_Unity_PBS_Area (baseColor, specColor, oneMinusReflectivity, oneMinusRoughness, normalWorld, -eyeVec, light, ind, lightDist, lightRadius);
|
||||
return res;
|
||||
}
|
@ -1,9 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: bea54fea6aabea841b90651d989d88f5
|
||||
timeCreated: 1452380090
|
||||
licenseType: Pro
|
||||
ShaderImporter:
|
||||
defaultTextures: []
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -1,87 +0,0 @@
|
||||
Shader "Hidden/TubeLight" {
|
||||
SubShader {
|
||||
Tags { "Queue"="Geometry-1" }
|
||||
|
||||
CGINCLUDE
|
||||
#include "UnityCG.cginc"
|
||||
#include "UnityPBSLighting.cginc"
|
||||
#include "UnityDeferredLibrary.cginc"
|
||||
|
||||
#define SHADOW_PLANES 1
|
||||
#include "TubeLight.cginc"
|
||||
|
||||
sampler2D _CameraGBufferTexture0;
|
||||
sampler2D _CameraGBufferTexture1;
|
||||
sampler2D _CameraGBufferTexture2;
|
||||
|
||||
float _LightRadius;
|
||||
float _LightLength;
|
||||
float4 _LightAxis;
|
||||
|
||||
|
||||
void DeferredCalculateLightParams (
|
||||
unity_v2f_deferred i,
|
||||
out float3 outWorldPos,
|
||||
out float2 outUV)
|
||||
{
|
||||
i.ray = i.ray * (_ProjectionParams.z / i.ray.z);
|
||||
float2 uv = i.uv.xy / i.uv.w;
|
||||
|
||||
// read depth and reconstruct world position
|
||||
float depth = SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, uv);
|
||||
depth = Linear01Depth (depth);
|
||||
float4 vpos = float4(i.ray * depth,1);
|
||||
float3 wpos = mul (unity_CameraToWorld, vpos).xyz;
|
||||
|
||||
outWorldPos = wpos;
|
||||
outUV = uv;
|
||||
}
|
||||
|
||||
half4 CalculateLightDeferred (unity_v2f_deferred i)
|
||||
{
|
||||
float3 worldPos;
|
||||
float2 uv;
|
||||
DeferredCalculateLightParams (i, worldPos, uv);
|
||||
|
||||
half4 gbuffer0 = tex2D (_CameraGBufferTexture0, uv);
|
||||
half4 gbuffer1 = tex2D (_CameraGBufferTexture1, uv);
|
||||
half4 gbuffer2 = tex2D (_CameraGBufferTexture2, uv);
|
||||
|
||||
half3 baseColor = gbuffer0.rgb;
|
||||
half3 specColor = gbuffer1.rgb;
|
||||
half oneMinusRoughness = gbuffer1.a;
|
||||
half3 normalWorld = gbuffer2.rgb * 2 - 1;
|
||||
normalWorld = normalize(normalWorld);
|
||||
|
||||
return CalculateLight (worldPos, uv, baseColor, specColor, oneMinusRoughness, normalWorld,
|
||||
_LightPos.xyz, _LightPos.xyz + _LightAxis.xyz * _LightLength, _LightColor.xyz, _LightRadius, _LightPos.w);
|
||||
}
|
||||
ENDCG
|
||||
|
||||
Pass {
|
||||
Fog { Mode Off }
|
||||
ZWrite Off
|
||||
Blend One One
|
||||
Cull Front
|
||||
ZTest Always
|
||||
|
||||
|
||||
CGPROGRAM
|
||||
#pragma target 3.0
|
||||
#pragma vertex vert_deferred
|
||||
#pragma fragment frag
|
||||
#pragma exclude_renderers nomrt
|
||||
|
||||
fixed4 frag (unity_v2f_deferred i) : SV_Target
|
||||
{
|
||||
half4 light = CalculateLightDeferred(i);
|
||||
// TODO: squash those NaNs at their source
|
||||
return isnan(light) ? 0 : light;
|
||||
}
|
||||
|
||||
ENDCG
|
||||
}
|
||||
|
||||
}
|
||||
Fallback Off
|
||||
}
|
@ -1,9 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 2e6fd90941a3e3c458d01f851dca21ed
|
||||
timeCreated: 1442344786
|
||||
licenseType: Pro
|
||||
ShaderImporter:
|
||||
defaultTextures: []
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -1,55 +0,0 @@
|
||||
#ifndef TUBE_LIGHT_ATTENUATION_LEGACY
|
||||
#define TUBE_LIGHT_ATTENUATION_LEGACY 0
|
||||
#endif
|
||||
|
||||
#if TUBE_LIGHT_ATTENUATION_LEGACY
|
||||
|
||||
float Attenuation(float distNorm)
|
||||
{
|
||||
return 1.0 / (1.0 + 25.0 * distNorm);
|
||||
}
|
||||
|
||||
float AttenuationToZero(float distNorm)
|
||||
{
|
||||
float att = Attenuation(distNorm);
|
||||
|
||||
// Replicating unity light attenuation - pulled to 0 at range
|
||||
// if (distNorm > 0.8 * 0.8)
|
||||
// att *= 1 - (distNorm - 0.8 * 0.8) / (1 - 0.8 * 0.8);
|
||||
// Same, simplified
|
||||
float oneDistNorm = 1.0 - distNorm;
|
||||
att *= lerp(1.0, oneDistNorm * 2.78, step(0.64, distNorm));
|
||||
|
||||
att *= step(0.0, oneDistNorm);
|
||||
|
||||
return att;
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
float Attenuation(float distSqr)
|
||||
{
|
||||
float d = sqrt(distSqr);
|
||||
float kDefaultPointLightRadius = 0.25;
|
||||
return 1.0 / pow(1.0 + d/kDefaultPointLightRadius, 2);
|
||||
}
|
||||
|
||||
float AttenuationToZero(float distSqr)
|
||||
{
|
||||
// attenuation = 1 / (1 + distance_to_light / light_radius)^2
|
||||
// = 1 / (1 + 2*(d/r) + (d/r)^2)
|
||||
// For more details see: https://imdoingitwrong.wordpress.com/2011/01/31/light-attenuation/
|
||||
float d = sqrt(distSqr);
|
||||
float kDefaultPointLightRadius = 0.25;
|
||||
float atten = 1.0 / pow(1.0 + d/kDefaultPointLightRadius, 2);
|
||||
float kCutoff = 1.0 / pow(1.0 + 1.0/kDefaultPointLightRadius, 2); // cutoff equal to attenuation at distance 1.0
|
||||
|
||||
// Force attenuation to fall towards zero at distance 1.0
|
||||
atten = (atten - kCutoff) / (1.f - kCutoff);
|
||||
if (d >= 1.f)
|
||||
atten = 0.f;
|
||||
|
||||
return atten;
|
||||
}
|
||||
|
||||
#endif
|
@ -1,9 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 3d6df6428d576d147994b0b7ac0d5ea5
|
||||
timeCreated: 1456703457
|
||||
licenseType: Pro
|
||||
ShaderImporter:
|
||||
defaultTextures: []
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -1,38 +0,0 @@
|
||||
half ShadowPlane(half3 worldPos, half4 plane, half feather)
|
||||
{
|
||||
half x = plane.w - dot(worldPos, plane.xyz);
|
||||
// Compiler bug workaround
|
||||
x += 0.0001;
|
||||
return smoothstep(-feather, feather, x);
|
||||
}
|
||||
|
||||
float4 _ShadowPlane0;
|
||||
float _ShadowPlaneFeather0;
|
||||
float4 _ShadowPlane1;
|
||||
float _ShadowPlaneFeather1;
|
||||
|
||||
half ShadowPlanes(half3 worldPos)
|
||||
{
|
||||
half att = 1;
|
||||
att *= ShadowPlane(worldPos, _ShadowPlane0, _ShadowPlaneFeather0);
|
||||
att *= ShadowPlane(worldPos, _ShadowPlane1, _ShadowPlaneFeather1);
|
||||
return att;
|
||||
}
|
||||
|
||||
struct TubeLightShadowPlane
|
||||
{
|
||||
float4 plane0;
|
||||
float4 plane1;
|
||||
float feather0;
|
||||
float feather1;
|
||||
float padding0;
|
||||
float padding1;
|
||||
};
|
||||
|
||||
half ShadowPlanes(half3 worldPos, TubeLightShadowPlane params)
|
||||
{
|
||||
half att = 1;
|
||||
att *= ShadowPlane(worldPos, params.plane0, params.feather0);
|
||||
att *= ShadowPlane(worldPos, params.plane1, params.feather1);
|
||||
return att;
|
||||
}
|
@ -1,9 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: f4ec63bd62722b840b982641528198db
|
||||
timeCreated: 1457385992
|
||||
licenseType: Pro
|
||||
ShaderImporter:
|
||||
defaultTextures: []
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -1,190 +0,0 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!21 &2100000
|
||||
Material:
|
||||
serializedVersion: 6
|
||||
m_ObjectHideFlags: 0
|
||||
m_PrefabParentObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 0}
|
||||
m_Name: TubeLightSource
|
||||
m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0}
|
||||
m_ShaderKeywords: _EMISSION
|
||||
m_LightmapFlags: 0
|
||||
m_CustomRenderQueue: -1
|
||||
stringTagMap: {}
|
||||
m_SavedProperties:
|
||||
serializedVersion: 2
|
||||
m_TexEnvs:
|
||||
- first:
|
||||
name: _BumpMap
|
||||
second:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- first:
|
||||
name: _DetailAlbedoMap
|
||||
second:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- first:
|
||||
name: _DetailMask
|
||||
second:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- first:
|
||||
name: _DetailNormalMap
|
||||
second:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- first:
|
||||
name: _EmissionMap
|
||||
second:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- first:
|
||||
name: _MainTex
|
||||
second:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- first:
|
||||
name: _MetallicGlossMap
|
||||
second:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- first:
|
||||
name: _OcclusionMap
|
||||
second:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- first:
|
||||
name: _ParallaxMap
|
||||
second:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- first:
|
||||
name: _SpecGlossMap
|
||||
second:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
m_Floats:
|
||||
- first:
|
||||
name: _BumpScale
|
||||
second: 1
|
||||
- first:
|
||||
name: _CullMode
|
||||
second: 2
|
||||
- first:
|
||||
name: _Cutoff
|
||||
second: 0.5
|
||||
- first:
|
||||
name: _DetailMode
|
||||
second: 0
|
||||
- first:
|
||||
name: _DetailNormalMapScale
|
||||
second: 1
|
||||
- first:
|
||||
name: _DstBlend
|
||||
second: 0
|
||||
- first:
|
||||
name: _GlossMapScale
|
||||
second: 1
|
||||
- first:
|
||||
name: _Glossiness
|
||||
second: 0.234
|
||||
- first:
|
||||
name: _GlossyReflections
|
||||
second: 1
|
||||
- first:
|
||||
name: _LightProbeScale
|
||||
second: 1
|
||||
- first:
|
||||
name: _MetaDiffuseScale
|
||||
second: 1
|
||||
- first:
|
||||
name: _MetaEmissionScale
|
||||
second: 1
|
||||
- first:
|
||||
name: _MetaMetallicSoup
|
||||
second: 1
|
||||
- first:
|
||||
name: _MetaSpecularScale
|
||||
second: 1
|
||||
- first:
|
||||
name: _MetaUseCustom
|
||||
second: 0
|
||||
- first:
|
||||
name: _Metallic
|
||||
second: 0
|
||||
- first:
|
||||
name: _Mode
|
||||
second: 0
|
||||
- first:
|
||||
name: _OcclusionStrength
|
||||
second: 1
|
||||
- first:
|
||||
name: _Parallax
|
||||
second: 0.02
|
||||
- first:
|
||||
name: _ReflectionProbeBoost
|
||||
second: 1
|
||||
- first:
|
||||
name: _SmoothnessTextureChannel
|
||||
second: 0
|
||||
- first:
|
||||
name: _SpecularHighlights
|
||||
second: 1
|
||||
- first:
|
||||
name: _SrcBlend
|
||||
second: 1
|
||||
- first:
|
||||
name: _Translucency
|
||||
second: 0
|
||||
- first:
|
||||
name: _UVDetailMask
|
||||
second: 0
|
||||
- first:
|
||||
name: _UVSec
|
||||
second: 0
|
||||
- first:
|
||||
name: _VertexOcclusionPower
|
||||
second: 1
|
||||
- first:
|
||||
name: _ZWrite
|
||||
second: 1
|
||||
m_Colors:
|
||||
- first:
|
||||
name: _Color
|
||||
second: {r: 0.47794116, g: 1, b: 0.85685486, a: 1}
|
||||
- first:
|
||||
name: _EmissionColor
|
||||
second: {r: 1, g: 1, b: 1, a: 1}
|
||||
- first:
|
||||
name: _MetaDiffuseAdd
|
||||
second: {r: 0, g: 0, b: 0, a: 1}
|
||||
- first:
|
||||
name: _MetaDiffuseTint
|
||||
second: {r: 1, g: 1, b: 1, a: 1}
|
||||
- first:
|
||||
name: _MetaEmissionAdd
|
||||
second: {r: 0, g: 0, b: 0, a: 1}
|
||||
- first:
|
||||
name: _MetaEmissionTint
|
||||
second: {r: 1, g: 1, b: 1, a: 1}
|
||||
- first:
|
||||
name: _MetaSpecularAdd
|
||||
second: {r: 0, g: 0, b: 0, a: 1}
|
||||
- first:
|
||||
name: _MetaSpecularTint
|
||||
second: {r: 1, g: 1, b: 1, a: 1}
|
||||
- first:
|
||||
name: _SpecColor
|
||||
second: {r: 0.19999996, g: 0.19999996, b: 0.19999996, a: 1}
|
@ -1,8 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 86b3c638dc56298409890ac32f9e6baf
|
||||
timeCreated: 1446644410
|
||||
licenseType: Pro
|
||||
NativeFormatImporter:
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -1,180 +0,0 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!1 &154090
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
m_PrefabParentObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 100100000}
|
||||
serializedVersion: 4
|
||||
m_Component:
|
||||
- 4: {fileID: 466162}
|
||||
- 114: {fileID: 11466842}
|
||||
- 33: {fileID: 3327276}
|
||||
- 23: {fileID: 2315154}
|
||||
- 114: {fileID: 114000012794840980}
|
||||
m_Layer: 0
|
||||
m_Name: TubeLight
|
||||
m_TagString: Untagged
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!4 &466162
|
||||
Transform:
|
||||
m_ObjectHideFlags: 1
|
||||
m_PrefabParentObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 100100000}
|
||||
m_GameObject: {fileID: 154090}
|
||||
m_LocalRotation: {x: -0.7071068, y: 0, z: 0, w: 0.7071067}
|
||||
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
m_Children: []
|
||||
m_Father: {fileID: 0}
|
||||
m_RootOrder: 0
|
||||
--- !u!23 &2315154
|
||||
MeshRenderer:
|
||||
m_ObjectHideFlags: 1
|
||||
m_PrefabParentObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 100100000}
|
||||
m_GameObject: {fileID: 154090}
|
||||
m_Enabled: 1
|
||||
m_CastShadows: 0
|
||||
m_ReceiveShadows: 0
|
||||
m_MotionVectors: 1
|
||||
m_LightProbeUsage: 0
|
||||
m_ReflectionProbeUsage: 0
|
||||
m_Materials:
|
||||
- {fileID: 2100000, guid: 86b3c638dc56298409890ac32f9e6baf, type: 2}
|
||||
m_SubsetIndices:
|
||||
m_StaticBatchRoot: {fileID: 0}
|
||||
m_ProbeAnchor: {fileID: 0}
|
||||
m_LightProbeVolumeOverride: {fileID: 0}
|
||||
m_ScaleInLightmap: 1
|
||||
m_PreserveUVs: 0
|
||||
m_IgnoreNormalsForChartDetection: 0
|
||||
m_ImportantGI: 0
|
||||
m_SelectedWireframeHidden: 0
|
||||
m_MinimumChartSize: 4
|
||||
m_AutoUVMaxDistance: 0.5
|
||||
m_AutoUVMaxAngle: 89
|
||||
m_LightmapParameters: {fileID: 0}
|
||||
m_SortingLayerID: 0
|
||||
m_SortingOrder: 0
|
||||
--- !u!33 &3327276
|
||||
MeshFilter:
|
||||
m_ObjectHideFlags: 1
|
||||
m_PrefabParentObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 100100000}
|
||||
m_GameObject: {fileID: 154090}
|
||||
m_Mesh: {fileID: 0}
|
||||
--- !u!114 &11466842
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 1
|
||||
m_PrefabParentObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 100100000}
|
||||
m_GameObject: {fileID: 154090}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: 5a3b99ed98424ea4587ec18d930a1d77, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
m_Intensity: 0.8
|
||||
m_Color: {r: 1, g: 1, b: 1, a: 1}
|
||||
m_Range: 10
|
||||
m_Radius: 0.3
|
||||
m_Length: 0
|
||||
m_Sphere: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0}
|
||||
m_Capsule: {fileID: 10208, guid: 0000000000000000e000000000000000, type: 0}
|
||||
m_ProxyShader: {fileID: 4800000, guid: 2e6fd90941a3e3c458d01f851dca21ed, type: 3}
|
||||
m_RenderSource: 1
|
||||
m_ShadowPlanes:
|
||||
- {fileID: 0}
|
||||
- {fileID: 0}
|
||||
--- !u!1001 &100100000
|
||||
Prefab:
|
||||
m_ObjectHideFlags: 1
|
||||
serializedVersion: 2
|
||||
m_Modification:
|
||||
m_TransformParent: {fileID: 0}
|
||||
m_Modifications:
|
||||
- target: {fileID: 0}
|
||||
propertyPath: m_RenderSource
|
||||
value: 1
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 0}
|
||||
propertyPath: m_Radius
|
||||
value: .340000004
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 0}
|
||||
propertyPath: m_Length
|
||||
value: .649999976
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 0}
|
||||
propertyPath: m_LocalRotation.x
|
||||
value: -.707106829
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 0}
|
||||
propertyPath: m_LocalRotation.w
|
||||
value: .707106709
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 0}
|
||||
propertyPath: m_LocalPosition.x
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 0}
|
||||
propertyPath: m_LocalPosition.y
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 0}
|
||||
propertyPath: m_LocalPosition.z
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 0}
|
||||
propertyPath: m_CastShadows
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 0}
|
||||
propertyPath: m_ReceiveShadows
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 0}
|
||||
propertyPath: m_UseLightProbes
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 0}
|
||||
propertyPath: m_ReflectionProbeUsage
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 0}
|
||||
propertyPath: m_Materials.Array.data[0]
|
||||
value:
|
||||
objectReference: {fileID: 2100000, guid: 86b3c638dc56298409890ac32f9e6baf, type: 2}
|
||||
m_RemovedComponents: []
|
||||
m_ParentPrefab: {fileID: 0}
|
||||
m_RootGameObject: {fileID: 154090}
|
||||
m_IsPrefabParent: 1
|
||||
--- !u!114 &114000012794840980
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 1
|
||||
m_PrefabParentObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 100100000}
|
||||
m_GameObject: {fileID: 154090}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: 097385f2a510795498370c4d62e61572, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
m_IntensityMult: 1
|
||||
m_RangeMult: 1
|
||||
m_BlurShadowmapShader: {fileID: 4800000, guid: 701192b62a7678549918bc87434699fe,
|
||||
type: 3}
|
||||
m_CopyShadowParamsShader: {fileID: 4800000, guid: 33fc45db43408764c8dd7647b877e561,
|
||||
type: 3}
|
||||
m_ForceOnForFog: 0
|
||||
m_Shadows: 0
|
||||
m_ShadowmapRes: 256
|
||||
m_BlurIterations: 0
|
||||
m_BlurSize: 1
|
||||
m_ESMExponent: 40
|
||||
m_Bounded: 1
|
@ -1,8 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: fdeb35bdab08b7442a67e36ffe2ff830
|
||||
timeCreated: 1444651113
|
||||
licenseType: Pro
|
||||
NativeFormatImporter:
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
Loading…
x
Reference in New Issue
Block a user