/// <summary> /// Bake SphericalHarmonicsL2 values /// </summary> /// <param name="probePosition"></param> /// <param name="position"></param> /// <param name="range"></param> /// <param name="color"></param> /// <param name="intensity"></param> /// <param name="shL2"></param> public static void SHAddPointLight(Vector3 probePosition, Vector3 position, float range, Color color, float intensity, ref SphericalHarmonicsL2 sphericalHarmonicsL2) { Vector3 probeToLight = position - probePosition; float attenuation = 1.0F / (1.0F + 25.0F * probeToLight.sqrMagnitude / (range * range)); sphericalHarmonicsL2.AddDirectionalLight(probeToLight.normalized, color, intensity * attenuation); }
void SHAddPointLight(Vector3 probePosition, Vector3 position, float range, Color color, float intensity, ref SphericalHarmonicsL2 sh) { // From the point of view of an SH probe, point light looks no different than a directional light, // just attenuated and coming from the right direction. Vector3 probeToLight = position - probePosition; float attenuation = 1.0F / (1.0F + 25.0F * probeToLight.sqrMagnitude / (range * range)); sh.AddDirectionalLight(probeToLight.normalized, color, intensity * attenuation); }
public SphericalHarmonicsL2 ProjectCubeIntoSH(Cubemap src, int miplevel) { Vector3[] vectorArray1 = new Vector3[0x12]; vectorArray1[0] = new Vector3(0f, 0f, -1f); vectorArray1[1] = new Vector3(0f, -1f, 0f); vectorArray1[2] = new Vector3(-1f, 0f, 0f); vectorArray1[3] = new Vector3(0f, 0f, 1f); vectorArray1[4] = new Vector3(0f, -1f, 0f); vectorArray1[5] = new Vector3(1f, 0f, 0f); vectorArray1[6] = new Vector3(1f, 0f, 0f); vectorArray1[7] = new Vector3(0f, 0f, 1f); vectorArray1[8] = new Vector3(0f, -1f, 0f); vectorArray1[9] = new Vector3(1f, 0f, 0f); vectorArray1[10] = new Vector3(0f, 0f, -1f); vectorArray1[11] = new Vector3(0f, 1f, 0f); vectorArray1[12] = new Vector3(1f, 0f, 0f); vectorArray1[13] = new Vector3(0f, -1f, 0f); vectorArray1[14] = new Vector3(0f, 0f, -1f); vectorArray1[15] = new Vector3(-1f, 0f, 0f); vectorArray1[0x10] = new Vector3(0f, -1f, 0f); vectorArray1[0x11] = new Vector3(0f, 0f, 1f); Vector3[] vectorArray = vectorArray1; float num = 0f; SphericalHarmonicsL2 sl = new SphericalHarmonicsL2(); sl.Clear(); int num2 = 0; while (num2 < 6) { Vector3 vector = vectorArray[num2 * 3]; Vector3 vector2 = -vectorArray[(num2 * 3) + 1]; Vector3 vector3 = -vectorArray[(num2 * 3) + 2]; Color[] pixels = src.GetPixels((CubemapFace)num2, miplevel); int num3 = src.width >> (miplevel & 0x1f); if (num3 < 1) { num3 = 1; } float num4 = -1f + (1f / ((float)num3)); float num5 = (2f * (1f - (1f / ((float)num3)))) / (num3 - 1f); int num6 = 0; while (true) { if (num6 >= num3) { num2++; break; } float num7 = (num6 * num5) + num4; int num8 = 0; while (true) { if (num8 >= num3) { num6++; break; } Color color = pixels[num8 + (num6 * num3)]; float num9 = (num8 * num5) + num4; float f = (1f + (num9 * num9)) + (num7 * num7); float num11 = 4f / (Mathf.Sqrt(f) * f); Vector3 vector4 = (vector3 + (vector * num9)) + (vector2 * num7); vector4.Normalize(); Color color2 = (color * color.a) * 8f; sl.AddDirectionalLight(-vector4, (QualitySettings.activeColorSpace != ColorSpace.Linear) ? color2 : color2.linear, num11 * 0.5f); num += num11; num8++; } } } return(sl * (4f / num)); }
public SphericalHarmonicsL2 RenderToSphericalHarmonics() { SphericalHarmonicsL2 result = default(SphericalHarmonicsL2); bool directLight = false; Color color = TOD_Util.ChangeSaturation(this.AmbientColor.linear, this.Ambient.Saturation); Vector3 vector = new Vector3(0.612372458f, 0.5f, 0.612372458f); Vector3 up = Vector3.up; Color linear = this.SampleAtmosphere(up, directLight).linear; result.AddDirectionalLight(up, linear, 0.428571433f); Vector3 direction = new Vector3(-vector.x, vector.y, -vector.z); Color color2 = TOD_Util.ChangeSaturation(this.SampleAtmosphere(direction, directLight).linear, this.Ambient.Saturation); result.AddDirectionalLight(direction, color2, 0.2857143f); Vector3 direction2 = new Vector3(vector.x, vector.y, -vector.z); Color color3 = TOD_Util.ChangeSaturation(this.SampleAtmosphere(direction2, directLight).linear, this.Ambient.Saturation); result.AddDirectionalLight(direction2, color3, 0.2857143f); Vector3 direction3 = new Vector3(-vector.x, vector.y, vector.z); Color color4 = TOD_Util.ChangeSaturation(this.SampleAtmosphere(direction3, directLight).linear, this.Ambient.Saturation); result.AddDirectionalLight(direction3, color4, 0.2857143f); Vector3 direction4 = new Vector3(vector.x, vector.y, vector.z); Color color5 = TOD_Util.ChangeSaturation(this.SampleAtmosphere(direction4, directLight).linear, this.Ambient.Saturation); result.AddDirectionalLight(direction4, color5, 0.2857143f); Vector3 left = Vector3.left; Color color6 = TOD_Util.ChangeSaturation(this.SampleAtmosphere(left, directLight).linear, this.Ambient.Saturation); result.AddDirectionalLight(left, color6, 0.142857149f); Vector3 right = Vector3.right; Color color7 = TOD_Util.ChangeSaturation(this.SampleAtmosphere(right, directLight).linear, this.Ambient.Saturation); result.AddDirectionalLight(right, color7, 0.142857149f); Vector3 back = Vector3.back; Color color8 = TOD_Util.ChangeSaturation(this.SampleAtmosphere(back, directLight).linear, this.Ambient.Saturation); result.AddDirectionalLight(back, color8, 0.142857149f); Vector3 forward = Vector3.forward; Color color9 = TOD_Util.ChangeSaturation(this.SampleAtmosphere(forward, directLight).linear, this.Ambient.Saturation); result.AddDirectionalLight(forward, color9, 0.142857149f); Vector3 direction5 = new Vector3(-vector.x, -vector.y, -vector.z); result.AddDirectionalLight(direction5, color, 0.2857143f); Vector3 direction6 = new Vector3(vector.x, -vector.y, -vector.z); result.AddDirectionalLight(direction6, color, 0.2857143f); Vector3 direction7 = new Vector3(-vector.x, -vector.y, vector.z); result.AddDirectionalLight(direction7, color, 0.2857143f); Vector3 direction8 = new Vector3(vector.x, -vector.y, vector.z); result.AddDirectionalLight(direction8, color, 0.2857143f); Vector3 down = Vector3.down; result.AddDirectionalLight(down, color, 0.428571433f); return(result); }
public SphericalHarmonicsL2 ProjectCubeIntoSH3Func(Cubemap src, int miplevel) { Vector4[] array = new Vector4[] { new Vector4(0f, 0f, -1f, 0f), new Vector4(0f, -1f, 0f, 0f), new Vector4(-1f, 0f, 0f, 0f), new Vector4(0f, 0f, 1f, 0f), new Vector4(0f, -1f, 0f, 0f), new Vector4(1f, 0f, 0f, 0f), new Vector4(1f, 0f, 0f, 0f), new Vector4(0f, 0f, 1f, 0f), new Vector4(0f, -1f, 0f, 0f), new Vector4(1f, 0f, 0f, 0f), new Vector4(0f, 0f, -1f, 0f), new Vector4(0f, 1f, 0f, 0f), new Vector4(1f, 0f, 0f, 0f), new Vector4(0f, -1f, 0f, 0f), new Vector4(0f, 0f, -1f, 0f), new Vector4(-1f, 0f, 0f, 0f), new Vector4(0f, -1f, 0f, 0f), new Vector4(0f, 0f, 1f, 0f) }; Quaternion rotation = base.gameObject.transform.rotation; Matrix4x4 matrix4x = this.QuaternionToMatrix(rotation); for (int i = 0; i < 6; i++) { array[i] = matrix4x * array[i]; } Shader.SetGlobalMatrix("_SkyRotation", matrix4x); float num = 0f; SphericalHarmonicsL2 sphericalHarmonicsL = default(SphericalHarmonicsL2); sphericalHarmonicsL.Clear(); for (int j = 0; j < 6; j++) { Vector3 a = array[j * 3]; Vector3 a2 = -array[j * 3 + 1]; Vector3 a3 = -array[j * 3 + 2]; Color[] pixels = src.GetPixels((CubemapFace)j, miplevel); int num2 = src.width >> miplevel; if (num2 < 1) { num2 = 1; } float num3 = -1f + 1f / (float)num2; float num4 = 2f * (1f - 1f / (float)num2) / ((float)num2 - 1f); for (int k = 0; k < num2; k++) { float num5 = (float)k * num4 + num3; for (int l = 0; l < num2; l++) { Color a4 = pixels[l + k * num2]; float num6 = (float)l * num4 + num3; float num7 = 1f + num6 * num6 + num5 * num5; float num8 = 4f / (Mathf.Sqrt(num7) * num7); Vector3 a5 = a3 + a * num6 + a2 * num5; a5.Normalize(); Color color = a4 * a4.a * 8f; sphericalHarmonicsL.AddDirectionalLight(-a5, (QualitySettings.activeColorSpace != ColorSpace.Linear) ? color : color.linear, num8 * 0.5f); num += num8; } } } float rhs = 4f / num; sphericalHarmonicsL *= rhs; return(sphericalHarmonicsL); }