コード例 #1
0
    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;
コード例 #2
0
    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);
    }
コード例 #3
0
    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);
    }
コード例 #4
0
    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);
    }
コード例 #6
0
    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);
    }
コード例 #7
0
    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;
            }
        }
コード例 #8
0
 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)));
 }
コード例 #9
0
    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;
コード例 #10
0
 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))));
 }
コード例 #11
0
 public void Execute()
 {
     SeparableSSS.CalculateKernel(kernel, 11, sssc, sssfc);
 }