예제 #1
0
파일: SH9Helper.cs 프로젝트: whisperlin/TA
 public static void UpdateSH9FormCubeMap(Cubemap ibl, ref Cubemap curIbl, SH9Struct iblData)
 {
     if (curIbl != ibl)
     {
         if (null == ibl)
         {
             iblData.coefficients = new Vector4[0];
         }
         else
         {
             SH9Helper.ModifyTextureReadable(ibl);
             iblData.coefficients = new Vector4[9];
             if (SphericalHarmonics.CPU_Project_Uniform_9Coeff(ibl, iblData.coefficients))
             {
                 /*g_sph0.xyz * 0.2820947917f +
                  * g_sph1.xyz * 0.4886025119f * v.y;
                  * g_sph2.xyz * 0.4886025119f * v.z;
                  * g_sph3.xyz * 0.4886025119f * v.x;
                  * g_sph4.xyz * 1.0925484306f * v.x * v.y;
                  * g_sph5.xyz * 1.0925484306f * v.y * v.z;
                  * g_sph6.xyz * 0.3153915652f * (3.0f * v.z * v.z - 1.0f);
                  * g_sph7.xyz * 1.0925484306f * v.x * v.z;
                  * g_sph8.xyz * 0.5462742153f * (v.x * v.x - v.y * v.y);
                  */
                 iblData.coefficients[0] = iblData.coefficients[0] * 0.2820947917f;
                 iblData.coefficients[1] = iblData.coefficients[1] * 0.4886025119f;
                 iblData.coefficients[2] = iblData.coefficients[2] * 0.4886025119f;
                 iblData.coefficients[3] = iblData.coefficients[3] * 0.4886025119f;
                 iblData.coefficients[4] = iblData.coefficients[4] * 1.0925484306f;
                 iblData.coefficients[5] = iblData.coefficients[5] * 1.0925484306f;
                 iblData.coefficients[6] = iblData.coefficients[6] * 0.3153915652f;
                 iblData.coefficients[7] = iblData.coefficients[7] * 1.0925484306f;
                 iblData.coefficients[8] = iblData.coefficients[8] * 0.5462742153f;
             }
         }
         curIbl = ibl;
     }
 }
예제 #2
0
    private void OnGUI()
    {
        modle = EditorGUILayout.Toggle("CubeMap", modle);
        if (modle)
        {
            input_cubemap = EditorGUILayout.ObjectField("Input Cubemap", input_cubemap, typeof(Cubemap), true) as Cubemap;
            isCopyNew     = EditorGUILayout.Toggle("从环境球获取", isCopyNew);
            if (input_cubemap != null)
            {
                EditorGUILayout.Space();

                if (GUILayout.Button("CPU Uniform 9 Coefficients"))
                {
                    Cubemap cm = input_cubemap;
                    if (isCopyNew)
                    {
                        test = cm = CopyFromEnvMap();
                    }

                    ModifyTextureReadable();
                    coefficients = new Vector4[9];
                    if (SphericalHarmonics.CPU_Project_Uniform_9Coeff(cm, coefficients))
                    {
                        setSH9Global();
                    }
                    if (isCopyNew)
                    {
                        GameObject.DestroyImmediate(cm, true);
                    }
                }

                EditorGUILayout.Space();

                if (GUILayout.Button("CPU Monte Carlo 9 Coefficients"))
                {
                    Cubemap cm = input_cubemap;
                    if (isCopyNew)
                    {
                        cm = CopyFromEnvMap();
                    }
                    ModifyTextureReadable();
                    coefficients = new Vector4[9];
                    if (SphericalHarmonics.CPU_Project_MonteCarlo_9Coeff(cm, coefficients, 4096))
                    {
                        setSH9Global();
                    }
                    if (isCopyNew)
                    {
                        GameObject.DestroyImmediate(cm, true);
                    }
                }

                EditorGUILayout.Space();

                if (GUILayout.Button("GPU Uniform 9 Coefficients"))
                {
                    Cubemap cm = input_cubemap;
                    if (isCopyNew)
                    {
                        input_cubemap = cm = CopyFromEnvMap();
                    }
                    ModifyTextureReadable();
                    coefficients = new Vector4[9];
                    if (SphericalHarmonics.GPU_Project_Uniform_9Coeff(cm, coefficients))
                    {
                        setSH9Global();
                    }
                    if (isCopyNew)
                    {
                        GameObject.DestroyImmediate(cm, true);
                    }
                }

                EditorGUILayout.Space();

                if (GUILayout.Button("GPU Monte Carlo 9 Coefficients"))
                {
                    Cubemap cm = input_cubemap;
                    if (isCopyNew)
                    {
                        cm = CopyFromEnvMap();
                    }
                    ModifyTextureReadable();
                    coefficients = new Vector4[9];
                    if (SphericalHarmonics.GPU_Project_MonteCarlo_9Coeff(cm, coefficients))
                    {
                        setSH9Global();
                    }
                    if (isCopyNew)
                    {
                        GameObject.DestroyImmediate(cm, true);
                    }
                }

                EditorGUILayout.Space();
            }
        }
        else
        {
            env_map = EditorGUILayout.ObjectField("360环境球", env_map, typeof(Texture2D), true) as Texture2D;

            if (env_map)
            {
                sun = EditorGUILayout.Toggle("太阳", sun);
            }

            enableLight = EditorGUILayout.Toggle("灯光", enableLight);

            if (enableLight)
            {
                GUILayout.BeginHorizontal();
                if (GUILayout.Button("+"))
                {
                    lights.Add(null);
                }
                if (GUILayout.Button("-"))
                {
                    if (lights.Count > 0)
                    {
                        lights.RemoveAt(lights.Count - 1);
                    }
                }


                GUILayout.EndHorizontal();
                for (int i = 0; i < lights.Count; i++)
                {
                    lights[i] = EditorGUILayout.ObjectField("360环境球", lights[i], typeof(Light), true) as Light;
                }
            }
            bool hasLight = false;
            for (int i = 0; i < lights.Count; i++)
            {
                if (lights [i] != null)
                {
                    hasLight = true;
                    break;
                }
            }
            //lights
            if (hasLight || env_map != null)
            {
                EditorGUILayout.Space();

                if (GUILayout.Button("CPU Uniform 9 Coefficients"))
                {
                    ModifyTextureReadable(env_map);
                    List <Light> ls = new List <Light> ();
                    foreach (Light l in lights)
                    {
                        if (l != null)
                        {
                            ls.Add(l);
                        }
                    }

                    coefficients = new Vector4[9];
                    if (SphericalHarmonics.CPU_Project_360HJQ(env_map, coefficients, 4096, sun, ls.ToArray()))
                    {
                        setSH9Global();
                    }
                }
            }
        }



        if (coefficients != null && coefficients.Length == 9)
        {
            if (GUILayout.Button("保存"))
            {
                SH9Data data = SH9Data.CreateInstance <SH9Data> ();
                data.coefficients = coefficients;

                string path = EditorUtility.SaveFilePanelInProject("Save SH9 Data", "ibl.asset", "asset",
                                                                   "Please enter a file name to save the texture to");
                if (path.Length != 0)
                {
                    if (System.IO.File.Exists(path))
                    {
                        /*if (EditorUtility.DisplayDialog("目标已存在", "替换", "取消"))
                         *      {
                         *
                         *      }*/

                        data.test         = new Vector4(1, 0, 0, 1);
                        data              = AssetDatabase.LoadAssetAtPath <SH9Data> (path);
                        data.coefficients = coefficients;
                        AssetDatabase.SaveAssets();
                    }
                    else
                    {
                        data.test = Vector4.one;
                        AssetDatabase.CreateAsset(data, path);
                        AssetDatabase.ImportAsset(path);
                    }
                }
            }
            EditorGUILayout.Space();
            for (int i = 0; i < 9; ++i)
            {
                EditorGUILayout.LabelField("c_" + i.ToString() + ": " + coefficients[i].ToString("f4"));
            }
        }


        EditorGUILayout.Space();
        if (tmp != null)
        {
            GUILayout.Label(tmp);
        }
    }
    private void OnGUI()
    {
        EditorGUILayout.PropertyField(sp_input_cubemap, new GUIContent("Input Cubemap"));

        so.ApplyModifiedProperties();

        if (input_cubemap != null)
        {
            EditorGUILayout.Space();

            if (GUILayout.Button("CPU Uniform 9 Coefficients"))
            {
                coefficients = new Vector4[9];
                if (SphericalHarmonics.CPU_Project_Uniform_9Coeff(input_cubemap, coefficients))
                {
                    for (int i = 0; i < 9; ++i)
                    {
                        view_mat.SetVector("c" + i.ToString(), coefficients[i]);
                        view_mat.SetTexture("input", input_cubemap);
                    }

                    SceneView.RepaintAll();
                }
            }

            EditorGUILayout.Space();

            if (GUILayout.Button("CPU Monte Carlo 9 Coefficients"))
            {
                coefficients = new Vector4[9];
                if (SphericalHarmonics.CPU_Project_MonteCarlo_9Coeff(input_cubemap, coefficients, 4096))
                {
                    for (int i = 0; i < 9; ++i)
                    {
                        view_mat.SetVector("c" + i.ToString(), coefficients[i]);
                        view_mat.SetTexture("input", input_cubemap);
                    }

                    SceneView.RepaintAll();
                }
            }

            EditorGUILayout.Space();

            if (GUILayout.Button("GPU Uniform 9 Coefficients"))
            {
                coefficients = new Vector4[9];
                if (SphericalHarmonics.GPU_Project_Uniform_9Coeff(input_cubemap, coefficients))
                {
                    for (int i = 0; i < 9; ++i)
                    {
                        view_mat.SetVector("c" + i.ToString(), coefficients[i]);
                        view_mat.SetTexture("input", input_cubemap);
                    }

                    SceneView.RepaintAll();
                }
            }

            EditorGUILayout.Space();

            if (GUILayout.Button("GPU Monte Carlo 9 Coefficients"))
            {
                coefficients = new Vector4[9];

                if (SphericalHarmonics.GPU_Project_MonteCarlo_9Coeff(input_cubemap, coefficients))
                {
                    for (int i = 0; i < 9; ++i)
                    {
                        view_mat.SetVector("c" + i.ToString(), coefficients[i]);
                        view_mat.SetTexture("input", input_cubemap);
                    }
                }
            }

            EditorGUILayout.Space();

            if (GUILayout.Button("Show"))
            {
                RenderSettings.skybox = view_mat;
            }

            view_mode = EditorGUILayout.Slider(view_mode, 0, 1);
            view_mat.SetFloat("_Mode", view_mode);

            EditorGUILayout.Space();

            //print the 9 coefficients
            if (coefficients != null)
            {
                for (int i = 0; i < 9; ++i)
                {
                    EditorGUILayout.LabelField("c_" + i.ToString() + ": " + coefficients[i].ToString("f4"));
                }
            }
        }

        EditorGUILayout.Space();
        if (tmp != null)
        {
            GUILayout.Label(tmp);
        }
    }