Tanoda
LightShafts.Resources.cs
Go to the documentation of this file.
1using UnityEngine;
2using System.Collections;
3
4public partial class LightShafts : MonoBehaviour
5{
7 LightShaftsShadowmapMode m_ShadowmapModeOld = LightShaftsShadowmapMode.Dynamic;
8 public Camera[] m_Cameras;
9 public Camera m_CurrentCamera;
10 bool m_ShadowmapDirty = true;
11 public Vector3 m_Size = new Vector3(10, 10, 20);
12 public float m_SpotNear = 0.1f;
13 public float m_SpotFar = 1.0f;
14 public LayerMask m_CullingMask = ~0;
15 public LayerMask m_ColorFilterMask = 0;
16 public float m_Brightness = 5;
17 public float m_BrightnessColored = 5;
18 public float m_Extinction = 0.5f;
19 public float m_MinDistFromCamera = 0.0f;
20
21 public int m_ShadowmapRes = 1024;
22 Camera m_ShadowmapCamera;
23 RenderTexture m_Shadowmap;
24 public Shader m_DepthShader;
25 RenderTexture m_ColorFilter;
26 public Shader m_ColorFilterShader;
27 public bool m_Colored = false;
28 public float m_ColorBalance = 1.0f;
29
30 public int m_EpipolarLines = 256;
31 public int m_EpipolarSamples = 512;
32 RenderTexture m_CoordEpi;
33 RenderTexture m_DepthEpi;
34 public Shader m_CoordShader;
35 Material m_CoordMaterial;
36 Camera m_CoordsCamera;
37
38 RenderTexture m_InterpolationEpi;
39 public Shader m_DepthBreaksShader;
40 Material m_DepthBreaksMaterial;
41
42 RenderTexture m_RaymarchedLightEpi;
43 Material m_RaymarchMaterial;
44 public Shader m_RaymarchShader;
45
46 RenderTexture m_InterpolateAlongRaysEpi;
48 Material m_InterpolateAlongRaysMaterial;
49
50 RenderTexture m_SamplePositions;
52 Material m_SamplePositionsMaterial;
53 bool m_SamplePositionsShaderCompiles = false;
54
56 Material m_FinalInterpolationMaterial;
57
58 public float m_DepthThreshold = 0.5f;
59 public int m_InterpolationStep = 32;
60
61 public bool m_ShowSamples = false;
62 public bool m_ShowInterpolatedSamples = false;
63 public float m_ShowSamplesBackgroundFade = 0.8f;
64
65 public bool m_AttenuationCurveOn = false;
66 public AnimationCurve m_AttenuationCurve;
67 Texture2D m_AttenuationCurveTex;
68
69 Light m_Light;
70 LightType m_LightType = LightType.Directional;
71 bool m_DX11Support = false;
72 bool m_MinRequirements = false;
73
74 void InitLUTs ()
75 {
76 if (m_AttenuationCurveTex)
77 return;
78
79 m_AttenuationCurveTex = new Texture2D (256, 1, TextureFormat.ARGB32, false, true);
80 m_AttenuationCurveTex.wrapMode = TextureWrapMode.Clamp;
81 m_AttenuationCurveTex.hideFlags = HideFlags.HideAndDontSave;
82
83 if (m_AttenuationCurve == null || m_AttenuationCurve.length == 0)
84 m_AttenuationCurve = new AnimationCurve(new Keyframe(0, 1), new Keyframe(1, 1));
85
86 if (m_AttenuationCurveTex)
87 UpdateLUTs ();
88 }
89
90 public void UpdateLUTs ()
91 {
92 InitLUTs ();
93
94 if (m_AttenuationCurve == null)
95 return;
96
97 for (int i = 0; i < 256; ++i)
98 {
99 float v = Mathf.Clamp (m_AttenuationCurve.Evaluate(i/255.0f), 0.0f, 1.0f);
100 m_AttenuationCurveTex.SetPixel (i, 0, new Color(v,v,v,v));
101 }
102 m_AttenuationCurveTex.Apply ();
103 }
104
105 void InitRenderTexture(ref RenderTexture rt, int width, int height, int depth, RenderTextureFormat format, bool temp = true)
106 {
107 if (temp)
108 {
109 rt = RenderTexture.GetTemporary(width, height, depth, format);
110 }
111 else
112 {
113 if (rt != null)
114 {
115 if (rt.width == width && rt.height == height && rt.depth == depth && rt.format == format)
116 return;
117
118 rt.Release();
119 DestroyImmediate(rt);
120 }
121
122 rt = new RenderTexture(width, height, depth, format);
123 rt.hideFlags = HideFlags.HideAndDontSave;
124 }
125 }
126
127 void InitShadowmap()
128 {
129 bool dynamic = (m_ShadowmapMode == LightShaftsShadowmapMode.Dynamic);
130 if (dynamic && m_ShadowmapMode != m_ShadowmapModeOld)
131 {
132 // Destroy static render textures, we only need temp now
133 if (m_Shadowmap)
134 m_Shadowmap.Release();
135 if (m_ColorFilter)
136 m_ColorFilter.Release();
137 }
138 InitRenderTexture(ref m_Shadowmap, m_ShadowmapRes, m_ShadowmapRes, 24, RenderTextureFormat.RFloat, dynamic);
139 m_Shadowmap.filterMode = FilterMode.Point;
140 m_Shadowmap.wrapMode = TextureWrapMode.Clamp;
141
142 if (m_Colored)
143 InitRenderTexture(ref m_ColorFilter, m_ShadowmapRes, m_ShadowmapRes, 0, RenderTextureFormat.ARGB32, dynamic);
144
145 m_ShadowmapModeOld = m_ShadowmapMode;
146 }
147
148 void ReleaseShadowmap()
149 {
151 return;
152
153 RenderTexture.ReleaseTemporary(m_Shadowmap);
154 RenderTexture.ReleaseTemporary(m_ColorFilter);
155 }
156
157 void InitEpipolarTextures()
158 {
161
162 InitRenderTexture(ref m_CoordEpi, m_EpipolarSamples, m_EpipolarLines, 0, RenderTextureFormat.RGFloat);
163 m_CoordEpi.filterMode = FilterMode.Point;
164 InitRenderTexture(ref m_DepthEpi, m_EpipolarSamples, m_EpipolarLines, 0, RenderTextureFormat.RFloat);
165 m_DepthEpi.filterMode = FilterMode.Point;
166 InitRenderTexture(ref m_InterpolationEpi, m_EpipolarSamples, m_EpipolarLines, 0, m_DX11Support ? RenderTextureFormat.RGInt : RenderTextureFormat.RGFloat);
167 m_InterpolationEpi.filterMode = FilterMode.Point;
168
169 InitRenderTexture(ref m_RaymarchedLightEpi, m_EpipolarSamples, m_EpipolarLines, 24, RenderTextureFormat.ARGBFloat);
170 m_RaymarchedLightEpi.filterMode = FilterMode.Point;
171 InitRenderTexture(ref m_InterpolateAlongRaysEpi, m_EpipolarSamples, m_EpipolarLines, 0, RenderTextureFormat.ARGBFloat);
172 m_InterpolateAlongRaysEpi.filterMode = FilterMode.Point;
173 }
174
175 void InitMaterial(ref Material material, Shader shader)
176 {
177 if (material || !shader)
178 return;
179 material = new Material(shader);
180 material.hideFlags = HideFlags.HideAndDontSave;
181 }
182
183 void InitMaterials()
184 {
185 InitMaterial(ref m_FinalInterpolationMaterial, m_FinalInterpolationShader);
186 InitMaterial(ref m_CoordMaterial, m_CoordShader);
187 InitMaterial(ref m_SamplePositionsMaterial, m_SamplePositionsShader);
188 InitMaterial(ref m_RaymarchMaterial, m_RaymarchShader);
189 InitMaterial(ref m_DepthBreaksMaterial, m_DepthBreaksShader);
190 InitMaterial(ref m_InterpolateAlongRaysMaterial, m_InterpolateAlongRaysShader);
191 }
192
193 Mesh m_SpotMesh;
194 float m_SpotMeshNear = -1;
195 float m_SpotMeshFar = -1;
196 float m_SpotMeshAngle = -1;
197 float m_SpotMeshRange = -1;
198
199 void InitSpotFrustumMesh()
200 {
201 if (!m_SpotMesh)
202 {
203 m_SpotMesh = new Mesh();
204 m_SpotMesh.hideFlags = HideFlags.HideAndDontSave;
205 }
206
207 Light l = m_Light;
208 if (m_SpotMeshNear != m_SpotNear || m_SpotMeshFar != m_SpotFar || m_SpotMeshAngle != l.spotAngle || m_SpotMeshRange != l.range)
209 {
210 float far = l.range * m_SpotFar;
211 float near = l.range * m_SpotNear;
212 float tan = Mathf.Tan(l.spotAngle * Mathf.Deg2Rad * 0.5f);
213 float halfwidthfar = far * tan;
214 float halfwidthnear = near * tan;
215
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;
226
227 if (m_SpotMesh.GetTopology( 0 ) != MeshTopology.Triangles || m_SpotMesh.triangles == null || m_SpotMesh.triangles.Length != 36)
228 {
229 // far near top right left bottom
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;
232 }
233
234 m_SpotMeshNear = m_SpotNear;
235 m_SpotMeshFar = m_SpotFar;
236 m_SpotMeshAngle = l.spotAngle;
237 m_SpotMeshRange = l.range;
238 }
239 }
240
241 public void UpdateLightType()
242 {
243 if (m_Light == null)
244 m_Light = GetComponent<Light>();
245
246 m_LightType = m_Light.type;
247 }
248
249 bool ShaderCompiles(Shader shader)
250 {
251 if (!shader.isSupported)
252 {
253 Debug.LogError("LightShafts' " + shader.name + " didn't compile on this platform.");
254 return false;
255 }
256
257 return true;
258 }
259
261 {
262 m_DX11Support = SystemInfo.graphicsShaderLevel >= 50;
263
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);
268
269 if (!m_MinRequirements)
270 Debug.LogError("LightShafts require Shader Model 3.0 and render textures (including the RGFloat and RFloat) formats. Disabling.");
271
272 bool shadersCompile = ShaderCompiles(m_DepthShader) &&
273 ShaderCompiles(m_ColorFilterShader) &&
274 ShaderCompiles(m_CoordShader) &&
275 ShaderCompiles(m_DepthBreaksShader) &&
276 ShaderCompiles(m_RaymarchShader) &&
277 ShaderCompiles(m_InterpolateAlongRaysShader) &&
278 ShaderCompiles(m_FinalInterpolationShader);
279
280 if (!shadersCompile)
281 Debug.LogError("LightShafts require above shaders. Disabling.");
282
283 m_MinRequirements &= shadersCompile;
284
285 m_SamplePositionsShaderCompiles = m_SamplePositionsShader.isSupported;
286
287 return m_MinRequirements;
288 }
289
290 void InitResources()
291 {
293
294 InitMaterials();
295 InitEpipolarTextures();
296 InitLUTs();
297 InitSpotFrustumMesh();
298 }
299
300 void ReleaseResources()
301 {
302 ReleaseShadowmap();
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);
308 }
309}
LightShaftsShadowmapMode
UnityEngine.Debug Debug
Definition: TanodaServer.cs:19
UnityEngine.Color Color
Definition: TestScript.cs:32
Shader m_SamplePositionsShader
LayerMask m_CullingMask
LayerMask m_ColorFilterMask
float m_ShowSamplesBackgroundFade
LightShaftsShadowmapMode m_ShadowmapMode
Shader m_FinalInterpolationShader
Shader m_InterpolateAlongRaysShader
AnimationCurve m_AttenuationCurve