2using System.Collections;
10 bool m_ShadowmapDirty =
true;
11 public Vector3
m_Size =
new Vector3(10, 10, 20);
22 Camera m_ShadowmapCamera;
23 RenderTexture m_Shadowmap;
25 RenderTexture m_ColorFilter;
32 RenderTexture m_CoordEpi;
33 RenderTexture m_DepthEpi;
35 Material m_CoordMaterial;
36 Camera m_CoordsCamera;
38 RenderTexture m_InterpolationEpi;
40 Material m_DepthBreaksMaterial;
42 RenderTexture m_RaymarchedLightEpi;
43 Material m_RaymarchMaterial;
46 RenderTexture m_InterpolateAlongRaysEpi;
48 Material m_InterpolateAlongRaysMaterial;
50 RenderTexture m_SamplePositions;
52 Material m_SamplePositionsMaterial;
53 bool m_SamplePositionsShaderCompiles =
false;
56 Material m_FinalInterpolationMaterial;
67 Texture2D m_AttenuationCurveTex;
70 LightType m_LightType = LightType.Directional;
71 bool m_DX11Support =
false;
72 bool m_MinRequirements =
false;
76 if (m_AttenuationCurveTex)
79 m_AttenuationCurveTex =
new Texture2D (256, 1, TextureFormat.ARGB32,
false,
true);
80 m_AttenuationCurveTex.wrapMode = TextureWrapMode.Clamp;
81 m_AttenuationCurveTex.hideFlags = HideFlags.HideAndDontSave;
86 if (m_AttenuationCurveTex)
97 for (
int i = 0; i < 256; ++i)
100 m_AttenuationCurveTex.SetPixel (i, 0,
new Color(v,v,v,v));
102 m_AttenuationCurveTex.Apply ();
105 void InitRenderTexture(ref RenderTexture rt,
int width,
int height,
int depth, RenderTextureFormat format,
bool temp =
true)
109 rt = RenderTexture.GetTemporary(width, height, depth, format);
115 if (rt.width == width && rt.height == height && rt.depth == depth && rt.format == format)
119 DestroyImmediate(rt);
122 rt =
new RenderTexture(width, height, depth, format);
123 rt.hideFlags = HideFlags.HideAndDontSave;
134 m_Shadowmap.Release();
136 m_ColorFilter.Release();
139 m_Shadowmap.filterMode = FilterMode.Point;
140 m_Shadowmap.wrapMode = TextureWrapMode.Clamp;
148 void ReleaseShadowmap()
153 RenderTexture.ReleaseTemporary(m_Shadowmap);
154 RenderTexture.ReleaseTemporary(m_ColorFilter);
157 void InitEpipolarTextures()
163 m_CoordEpi.filterMode = FilterMode.Point;
165 m_DepthEpi.filterMode = FilterMode.Point;
167 m_InterpolationEpi.filterMode = FilterMode.Point;
170 m_RaymarchedLightEpi.filterMode = FilterMode.Point;
172 m_InterpolateAlongRaysEpi.filterMode = FilterMode.Point;
175 void InitMaterial(ref Material material, Shader shader)
177 if (material || !shader)
179 material =
new Material(shader);
180 material.hideFlags = HideFlags.HideAndDontSave;
194 float m_SpotMeshNear = -1;
195 float m_SpotMeshFar = -1;
196 float m_SpotMeshAngle = -1;
197 float m_SpotMeshRange = -1;
199 void InitSpotFrustumMesh()
203 m_SpotMesh =
new Mesh();
204 m_SpotMesh.hideFlags = HideFlags.HideAndDontSave;
208 if (m_SpotMeshNear !=
m_SpotNear || m_SpotMeshFar !=
m_SpotFar || m_SpotMeshAngle != l.spotAngle || m_SpotMeshRange != l.range)
212 float tan = Mathf.Tan(l.spotAngle * Mathf.Deg2Rad * 0.5f);
213 float halfwidthfar = far * tan;
214 float halfwidthnear = near * tan;
216 Vector3[] vertices = (m_SpotMesh.vertices !=
null && m_SpotMesh.vertices.Length == 8) ? m_SpotMesh.vertices :
new Vector3[8];
217 vertices[0] =
new Vector3(-halfwidthfar, -halfwidthfar, far);
218 vertices[1] =
new Vector3( halfwidthfar, -halfwidthfar, far);
219 vertices[2] =
new Vector3( halfwidthfar, halfwidthfar, far);
220 vertices[3] =
new Vector3(-halfwidthfar, halfwidthfar, far);
221 vertices[4] =
new Vector3(-halfwidthnear, -halfwidthnear, near);
222 vertices[5] =
new Vector3( halfwidthnear, -halfwidthnear, near);
223 vertices[6] =
new Vector3( halfwidthnear, halfwidthnear, near);
224 vertices[7] =
new Vector3(-halfwidthnear, halfwidthnear, near);
225 m_SpotMesh.vertices = vertices;
227 if (m_SpotMesh.GetTopology( 0 ) != MeshTopology.Triangles || m_SpotMesh.triangles ==
null || m_SpotMesh.triangles.Length != 36)
230 int[] triangles =
new int[]{0,1,2, 0,2,3, 6,5,4, 7,6,4, 3,2,6, 3,6,7, 2,1,5, 2,5,6, 0,3,7, 0,7,4, 5,1,0, 5,0,4};
231 m_SpotMesh.triangles = triangles;
236 m_SpotMeshAngle = l.spotAngle;
237 m_SpotMeshRange = l.range;
244 m_Light = GetComponent<Light>();
246 m_LightType = m_Light.type;
249 bool ShaderCompiles(Shader shader)
251 if (!shader.isSupported)
253 Debug.LogError(
"LightShafts' " + shader.name +
" didn't compile on this platform.");
262 m_DX11Support = SystemInfo.graphicsShaderLevel >= 50;
264 m_MinRequirements = SystemInfo.graphicsShaderLevel >= 30;
265 m_MinRequirements &= SystemInfo.supportsRenderTextures;
266 m_MinRequirements &= SystemInfo.SupportsRenderTextureFormat(RenderTextureFormat.RGFloat);
267 m_MinRequirements &= SystemInfo.SupportsRenderTextureFormat(RenderTextureFormat.RFloat);
269 if (!m_MinRequirements)
270 Debug.LogError(
"LightShafts require Shader Model 3.0 and render textures (including the RGFloat and RFloat) formats. Disabling.");
281 Debug.LogError(
"LightShafts require above shaders. Disabling.");
283 m_MinRequirements &= shadersCompile;
287 return m_MinRequirements;
295 InitEpipolarTextures();
297 InitSpotFrustumMesh();
300 void ReleaseResources()
303 RenderTexture.ReleaseTemporary(m_CoordEpi);
304 RenderTexture.ReleaseTemporary(m_DepthEpi);
305 RenderTexture.ReleaseTemporary(m_InterpolationEpi);
306 RenderTexture.ReleaseTemporary(m_RaymarchedLightEpi);
307 RenderTexture.ReleaseTemporary(m_InterpolateAlongRaysEpi);
Shader m_SamplePositionsShader
float m_MinDistFromCamera
bool CheckMinRequirements()
LayerMask m_ColorFilterMask
bool m_AttenuationCurveOn
float m_BrightnessColored
Shader m_DepthBreaksShader
bool m_ShowInterpolatedSamples
float m_ShowSamplesBackgroundFade
LightShaftsShadowmapMode m_ShadowmapMode
Shader m_ColorFilterShader
Shader m_FinalInterpolationShader
Shader m_InterpolateAlongRaysShader
AnimationCurve m_AttenuationCurve