void OnPreRender() { if (IsEditorCamera && !DisplayInSceneView) { m_vaporCompute.SetTexture(m_integrateClearKernel, "_IntegratedTexture", m_integratedTexture); m_vaporCompute.DispatchScaled(m_integrateClearKernel, m_integratedTexture.width, m_integratedTexture.height, m_integratedTexture.volumeDepth); Shader.SetGlobalTexture("_VaporFogTexture", m_integratedTexture); return; } if (Camera.current.stereoEnabled && Camera.current.stereoActiveEye == Camera.MonoOrStereoscopicEye.Right) { return; } m_cullGroup.SetBoundingSphereCount(VaporObject.All.Count); //Get direction light & bind random acess textures for (int i = 0; i < VaporObject.All.Count; i++) { var vaporLight = VaporObject.All[i] as VaporLight; if (vaporLight == null || !vaporLight.HasShadow || vaporLight.LightType != LightType.Directional) { continue; } vaporLight.CreateShadowResources(); Graphics.SetRandomWriteTarget(1, vaporLight.MatrixBuffer); //Graphics.SetRandomWriteTarget(6, vaporLight.LightSplitsBuffer); } Shader.SetGlobalTexture("_VaporFogTexture", m_integratedTexture); if (Camera.current.actualRenderingPath == RenderingPath.Forward) { Shader.SetGlobalFloat("_VaporForward", 1); } else { Shader.SetGlobalFloat("_VaporForward", 0); } }
public override void Inject(Vapor vapor, ComputeShader compute, Matrix4x4 viewProj) { if (HasShadow) { if (GetShadowMapResolution() != m_shadowMap.width) { DestroyImmediate(m_shadowMap); CreateShadowTex(); } } //TODO: This doesn't really need to run every frame UpdateCommandBuffer(); //Setup basic params Vector4 posRange = transform.position; posRange.w = 1.0f / (m_light.range * m_light.range); compute.SetVector("_LightPosRange", posRange); Vector4 lightStrength = m_light.color * m_light.intensity * FogScatterIntensity; lightStrength *= 10; compute.SetVector("_LightColor", lightStrength); //Per light type things switch (LightType) { case LightType.Directional: int dirKernel; if (HasShadow) { if (QualitySettings.shadowCascades > 1) { dirKernel = vapor.LightDirKernel.GetKernel(VaporKernel.ShadowMode.Cascaded); } else { dirKernel = vapor.LightDirKernel.GetKernel(VaporKernel.ShadowMode.Shadowed); } } else { dirKernel = vapor.LightDirKernel.GetKernel(VaporKernel.ShadowMode.None); } compute.SetVector("_LightPosRange", m_light.transform.forward); if (HasShadow) { compute.SetBuffer(dirKernel, "_MatrixBuf", MatrixBuffer); compute.SetTexture(dirKernel, "_ShadowMapTexture", m_shadowMap); } else { compute.SetTexture(dirKernel, "_ShadowMapTexture", Texture2D.whiteTexture); } vapor.SetLightAccum(dirKernel, false); Profiler.BeginSample("Dir Light pass"); var tex = vapor.GetDensityTex(); compute.DispatchScaled(dirKernel, tex.width, tex.height, tex.volumeDepth); Profiler.EndSample(); break; case LightType.Point: vapor.SetLightAccum(vapor.LightPointKernel, false); vapor.InjectObject(viewProj, vapor.LightPointKernel, this); break; case LightType.Spot: int spotKernel = vapor.LightSpotKernel.GetKernel(HasShadow ? VaporKernel.ShadowMode.Shadowed : VaporKernel.ShadowMode.None); if (HasShadow) { Matrix4x4 v = transform.worldToLocalMatrix; Matrix4x4 p = GL.GetGPUProjectionMatrix(Matrix4x4.Perspective(m_light.spotAngle, 1.0f, m_light.shadowNearPlane, m_light.range), true); //For some reason z is flipped :( p *= Matrix4x4.Scale(new Vector3(1.0f, 1.0f, -1.0f)); compute.SetMatrix("_SpotShadowMatrix", p * v); compute.SetTexture(spotKernel, "_SpotShadow", m_shadowMap); } var lightProjMatrix = Matrix4x4.identity; float d = Mathf.Deg2Rad * m_light.spotAngle * 0.5f; d = Mathf.Cos(d) / Mathf.Sin(d); lightProjMatrix[3, 2] = 2f / d; lightProjMatrix[3, 3] = SpotBaseSize; var mat = lightProjMatrix * transform.worldToLocalMatrix; compute.SetMatrix("_SpotMatrix", mat); if (m_light.cookie != null) { compute.SetTexture(spotKernel, "_SpotCookie", m_light.cookie); } else { compute.SetTexture(spotKernel, "_SpotCookie", vapor.SpotCookie); } vapor.SetLightAccum(spotKernel, false); vapor.InjectObject(viewProj, spotKernel, this); break; } }