private Texture2D CreateTexture() { if (this.entries.Count <= 0) { return((Texture2D)null); } int length = 32; int num1 = Mathf.Max(this.entries.Count, 64); this.ReleaseTexture(); this.texture = new Texture2D(length, num1, (TextureFormat)17, false, true); ((Object)this.texture).set_name("SubsurfaceProfiles"); ((UnityEngine.Texture) this.texture).set_wrapMode((TextureWrapMode)1); ((UnityEngine.Texture) this.texture).set_filterMode((FilterMode)1); Color[] pixels = this.texture.GetPixels(0); for (int index = 0; index < pixels.Length; ++index) { pixels[index] = Color.get_clear(); } Color[] target = new Color[length]; for (int index1 = 0; index1 < this.entries.Count; ++index1) { SubsurfaceProfileData data = this.entries[index1].data; data.SubsurfaceColor = SubsurfaceProfileTexture.ColorClamp(data.SubsurfaceColor, 0.0f, 1f); data.FalloffColor = SubsurfaceProfileTexture.ColorClamp(data.FalloffColor, 0.009f, 1f); target[0] = data.SubsurfaceColor; target[0].a = (__Null)0.0; SeparableSSS.CalculateKernel(target, 1, 13, data.SubsurfaceColor, data.FalloffColor); SeparableSSS.CalculateKernel(target, 14, 9, data.SubsurfaceColor, data.FalloffColor); SeparableSSS.CalculateKernel(target, 23, 6, data.SubsurfaceColor, data.FalloffColor); int num2 = length * (num1 - index1 - 1); for (int index2 = 0; index2 < 29; ++index2) { Color color = Color.op_Multiply(target[index2], new Color(1f, 1f, 1f, 0.3333333f)); ref __Null local = ref color.a;
public static void SetKernel(ref SkinData data, List <Vector4> kernel) { Vector3 SSSC = new Vector3(data.SubsurfaceColor.r, data.SubsurfaceColor.g, data.SubsurfaceColor.b); Vector3 SSSFC = new Vector3(data.SubsurfaceFalloff.r, data.SubsurfaceFalloff.g, data.SubsurfaceFalloff.b); SeparableSSS.CalculateKernel(kernel, 11, SSSC, SSSFC); }
private void Awake() { cam = GetComponent <Camera>(); buffer = new CommandBuffer(); Vector3 SSSC = new Vector3(SSSColor.r, SSSColor.g, SSSColor.b); Vector3 SSSFC = new Vector3(SSSFalloff.r, SSSFalloff.g, SSSFalloff.b); SeparableSSS.calculateKernel(KernelArray, 20, SSSC, SSSFC); }
public static void CalculateKernel(Color[] target, int targetStart, int targetSize, Color subsurfaceColor, Color falloffColor) { float single; int num = targetSize; int num1 = num * 2 - 1; float single1 = (num1 > 20 ? 3f : 2f); float single2 = 2f; Color[] colorArray = new Color[num1]; float single3 = 2f * single1 / (float)(num1 - 1); for (int i = 0; i < num1; i++) { float single4 = -single1 + (float)i * single3; float single5 = (single4 < 0f ? -1f : 1f); colorArray[i].a = single1 * single5 * Mathf.Abs(Mathf.Pow(single4, single2)) / Mathf.Pow(single1, single2); } for (int j = 0; j < num1; j++) { single = (j > 0 ? Mathf.Abs(colorArray[j].a - colorArray[j - 1].a) : 0f); float single6 = (j < num1 - 1 ? Mathf.Abs(colorArray[j].a - colorArray[j + 1].a) : 0f); Vector3 vector3 = (single + single6) / 2f * SeparableSSS.Profile(colorArray[j].a, falloffColor); colorArray[j].r = vector3.x; colorArray[j].g = vector3.y; colorArray[j].b = vector3.z; } Color color = colorArray[num1 / 2]; for (int k = num1 / 2; k > 0; k--) { colorArray[k] = colorArray[k - 1]; } colorArray[0] = color; Vector3 vector31 = Vector3.zero; for (int l = 0; l < num1; l++) { vector31.x += colorArray[l].r; vector31.y += colorArray[l].g; vector31.z += colorArray[l].b; } for (int m = 0; m < num1; m++) { colorArray[m].r /= vector31.x; colorArray[m].g /= vector31.y; colorArray[m].b /= vector31.z; } target[targetStart] = colorArray[0]; for (uint n = 0; (ulong)n < (long)(num - 1); n++) { target[checked ((IntPtr)((long)targetStart + (ulong)n + (long)1))] = colorArray[checked ((IntPtr)((long)num + (ulong)n))]; } }
void UpdateSubsurface() { ///SSS Color Vector3 SSSC = Vector3.Normalize(new Vector3(SubsurfaceColor.r, SubsurfaceColor.g, SubsurfaceColor.b)); Vector3 SSSFC = Vector3.Normalize(new Vector3(SubsurfaceFalloff.r, SubsurfaceFalloff.g, SubsurfaceFalloff.b)); SeparableSSS.CalculateKernel(KernelArray, 25, SSSC, SSSFC); SubsurfaceEffects.SetVectorArray(Kernel, KernelArray); SubsurfaceEffects.SetFloat(SSSScaler, SubsurfaceScaler); ///SSS Buffer SubsurfaceBuffer.Clear(); SubsurfaceBuffer.GetTemporaryRT(SceneColorID, RenderCamera.pixelWidth, RenderCamera.pixelHeight, 0, FilterMode.Trilinear, RenderTextureFormat.DefaultHDR); SubsurfaceBuffer.BlitStencil(BuiltinRenderTextureType.CameraTarget, SceneColorID, BuiltinRenderTextureType.CameraTarget, SubsurfaceEffects, 0); SubsurfaceBuffer.BlitSRT(SceneColorID, BuiltinRenderTextureType.CameraTarget, SubsurfaceEffects, 1); }
private void DrawSkinBlur() { SkinBlurCommandBuffer.Clear(); ///SSS Color /// 这里不应该normalize Vector3 SSSC = new Vector3(SubsurfaceColor.r, SubsurfaceColor.g, SubsurfaceColor.b); Vector3 SSSFC = new Vector3(SubsurfaceFalloff.r, SubsurfaceFalloff.g, SubsurfaceFalloff.b); SeparableSSS.CalculateKernel(KernelArray, 25, SSSC, SSSFC); SkinBlurEffect.SetVectorArray(Kernel, KernelArray); SkinBlurEffect.SetFloat(SSSScaler, SubsurfaceScaler); SkinBlurCommandBuffer.GetTemporaryRT(SkinBlurRT_TMP_ID, Screen.width, Screen.height, 0, FilterMode.Trilinear, RenderTextureFormat.DefaultHDR); SkinBlurCommandBuffer.BlitStencil(BuiltinRenderTextureType.CameraTarget, SkinBlurRT_TMP_ID, BuiltinRenderTextureType.CameraTarget, SkinBlurEffect, 0); SkinBlurCommandBuffer.BlitStencil(SkinBlurRT_TMP_ID, SkinBlurRT, BuiltinRenderTextureType.CameraTarget, SkinBlurEffect, 1); }
private Texture2D CreateTexture() { if (this.entries.Count <= 0) { return(null); } int num = 32; int num1 = Mathf.Max(this.entries.Count, 64); this.ReleaseTexture(); this.texture = new Texture2D(num, num1, TextureFormat.RGBAHalf, false, true) { name = "SubsurfaceProfiles", wrapMode = TextureWrapMode.Clamp, filterMode = FilterMode.Bilinear }; Color[] pixels = this.texture.GetPixels(0); for (int i = 0; i < (int)pixels.Length; i++) { pixels[i] = Color.clear; } Color[] subsurfaceColor = new Color[num]; for (int j = 0; j < this.entries.Count; j++) { SubsurfaceProfileData item = this.entries[j].data; item.SubsurfaceColor = SubsurfaceProfileTexture.ColorClamp(item.SubsurfaceColor, 0f, 1f); item.FalloffColor = SubsurfaceProfileTexture.ColorClamp(item.FalloffColor, 0.009f, 1f); subsurfaceColor[0] = item.SubsurfaceColor; subsurfaceColor[0].a = 0f; SeparableSSS.CalculateKernel(subsurfaceColor, 1, 13, item.SubsurfaceColor, item.FalloffColor); SeparableSSS.CalculateKernel(subsurfaceColor, 14, 9, item.SubsurfaceColor, item.FalloffColor); SeparableSSS.CalculateKernel(subsurfaceColor, 23, 6, item.SubsurfaceColor, item.FalloffColor); int num2 = num * (num1 - j - 1); for (int k = 0; k < 29; k++) { Color color = subsurfaceColor[k] * new Color(1f, 1f, 1f, 0.333333343f); ref float scatterRadius = ref color.a; scatterRadius = scatterRadius * (item.ScatterRadius / 1024f); pixels[num2 + k] = color; } }
private static Vector3 Profile(float r, Color falloffColor) { return(((((0.1f * SeparableSSS.Gaussian(0.0484f, r, falloffColor)) + (0.118f * SeparableSSS.Gaussian(0.187f, r, falloffColor))) + (0.113f * SeparableSSS.Gaussian(0.567f, r, falloffColor))) + (0.358f * SeparableSSS.Gaussian(1.99f, r, falloffColor))) + (0.078f * SeparableSSS.Gaussian(7.41f, r, falloffColor))); }
public static void CalculateKernel( Color[] target, int targetStart, int targetSize, Color subsurfaceColor, Color falloffColor) { int num1 = targetSize; int length = num1 * 2 - 1; float num2 = length > 20 ? 3f : 2f; float num3 = 2f; Color[] colorArray = new Color[length]; float num4 = 2f * num2 / (float)(length - 1); for (int index = 0; index < length; ++index) { float num5 = (float)(-(double)num2 + (double)index * (double)num4); float num6 = (double)num5 < 0.0 ? -1f : 1f; colorArray[index].a = (__Null)((double)num2 * (double)num6 * (double)Mathf.Abs(Mathf.Pow(num5, num3)) / (double)Mathf.Pow(num2, num3)); } for (int index = 0; index < length; ++index) { Vector3 vector3 = Vector3.op_Multiply((float)(((index > 0 ? (double)Mathf.Abs((float)(colorArray[index].a - colorArray[index - 1].a)) : 0.0) + (index < length - 1 ? (double)Mathf.Abs((float)(colorArray[index].a - colorArray[index + 1].a)) : 0.0)) / 2.0), SeparableSSS.Profile((float)colorArray[index].a, falloffColor)); colorArray[index].r = vector3.x; colorArray[index].g = vector3.y; colorArray[index].b = vector3.z; } Color color = colorArray[length / 2]; for (int index = length / 2; index > 0; --index) { colorArray[index] = colorArray[index - 1]; } colorArray[0] = color; Vector3 zero = Vector3.get_zero(); for (int index = 0; index < length; ++index) { ref __Null local1 = ref zero.x;
private static Vector3 Profile(float r, Color falloffColor) { return(Vector3.op_Addition(Vector3.op_Addition(Vector3.op_Addition(Vector3.op_Addition(Vector3.op_Multiply(0.1f, SeparableSSS.Gaussian(0.0484f, r, falloffColor)), Vector3.op_Multiply(0.118f, SeparableSSS.Gaussian(0.187f, r, falloffColor))), Vector3.op_Multiply(0.113f, SeparableSSS.Gaussian(0.567f, r, falloffColor))), Vector3.op_Multiply(0.358f, SeparableSSS.Gaussian(1.99f, r, falloffColor))), Vector3.op_Multiply(0.078f, SeparableSSS.Gaussian(7.41f, r, falloffColor)))); }
public void Execute() { SeparableSSS.CalculateKernel(kernel, 11, sssc, sssfc); }