public void Bind(ComputeShader comp, int kernel, ScatterSettings blendTo, float blendTime) { // 在两个配置间插值 Color lerpAledo = Color.Lerp(this.albedo, blendTo.albedo, blendTime); float lerpExtinction = Mathf.Lerp(this.extinction, blendTo.extinction, blendTime); Color lerpEmission = Color.Lerp(this.emission, blendTo.emission, blendTime); Color lerpAmbient = Color.Lerp(this.ambient, blendTo.ambient, blendTime); // 自发光调整 lerpEmission = lerpEmission * lerpEmission.a; lerpEmission.r /= lerpAledo.r + 1; lerpEmission.g /= lerpAledo.g + 1; lerpEmission.b /= lerpAledo.b + 1; Color ambientEmission = lerpAmbient * lerpAmbient.a; Color totalEmission = (lerpEmission + ambientEmission) * 5.0f; comp.SetVector("_AlbedoExt", new Vector4(lerpAledo.r, lerpAledo.g, lerpAledo.b, lerpExtinction)); comp.SetFloat("_Extinction", lerpExtinction); comp.SetVector("_Emission", new Vector4(totalEmission.r, totalEmission.g, totalEmission.b)); comp.SetFloat("_Time", Time.time * 10.0f); float heightStart = Mathf.Lerp(heightGradient.start, blendTo.heightGradient.start, blendTime); float heightEnd = Mathf.Lerp(heightGradient.end, blendTo.heightGradient.end, blendTime); float distanceStart = Mathf.Lerp(distanceGradient.start, blendTo.distanceGradient.start, blendTime); float distanceEnd = Mathf.Lerp(distanceGradient.end, blendTo.distanceGradient.end, blendTime); float heightSize = Mathf.Max(0, heightEnd - heightStart); float distSize = Mathf.Max(0, distanceEnd - distanceStart); Vector4 gradientSettings = new Vector4(1.0f / heightSize, -heightStart / heightSize, 1.0f / distSize, -distanceStart / distSize); comp.SetVector("_GradientSettings", gradientSettings); comp.SetTexture(kernel, "_GradientTexture", gradientTex); if (blendTime > 0) { comp.SetTexture(kernel, "_GradientTextureBlend", blendTo.gradientTex); comp.SetFloat("_SettingBlend", blendTime); } else { comp.SetTexture(kernel, "_GradientTextureBlend", Texture2D.whiteTexture); comp.SetFloat("_SettingBlend", 0.0f); } }
private void Scatter(ScatterSettings settings) { var count = Random.Range(settings.CountMin, settings.CountMax); for (var i = 0; i < count; i++) { var model = Instantiate <GameObject>(settings.Model); if (settings.RadiusMax == 0 && settings.RadiusMin == 0) { model.transform.position = Vector3.zero; model.transform.rotation = Random.rotation; } else { model.transform.position = Random.onUnitSphere * Random.Range(settings.RadiusMin, settings.RadiusMax); if (settings.LookAtCenter) { model.transform.rotation = LookAtWithRandomTwist(model.transform.position, Vector3.zero); } else { model.transform.rotation = Random.rotation; } } model.transform.localScale = Vector3.one * Random.Range(settings.ScaleMin, settings.ScaleMax); model.transform.SetParent(_parent); if (settings.UseMaterials) { model.GetComponent <Renderer>().material = settings.Materials[Random.Range(0, settings.Materials.Count)]; } else { if (settings.Textures != null && settings.Textures.Any()) { var tex = settings.Textures[Random.Range(0, settings.Textures.Count)]; var colr = settings.Colors[Random.Range(0, settings.Colors.Count)].GetRandom(); model.GetComponent <Renderer>().material = CreateMaterial(tex, colr); } } } }
private ScatterSettings ScatterGUI(ScatterSettings so) { EditorGUILayout.BeginHorizontal(); so.IsActive = GUILayout.Toggle(so.IsActive, "", GUILayout.Width(10)); EditorGUILayout.LabelField(so.Name, EditorStyles.boldLabel); EditorGUILayout.EndHorizontal(); so.Name = EditorGUILayout.TextField("Name", so.Name); so.Model = EditorExtensions.ObjectField<GameObject>("Model", so.Model, false); // Radius var radius = EditorExtensions.FloatRange("Radius", so.RadiusMin, so.RadiusMax); so.RadiusMin = radius.Min; so.RadiusMax = radius.Max; // Count var count = EditorExtensions.IntRange("Count", so.CountMin, so.CountMax); so.CountMin = count.Min; so.CountMax = count.Max; // Scale var scale = EditorExtensions.FloatRange("Scale", so.ScaleMin, so.ScaleMax); so.ScaleMin = scale.Min; so.ScaleMax = scale.Max; so.LookAtCenter = GUILayout.Toggle(so.LookAtCenter, "Look at Centre"); // Materials so.UseMaterials = GUILayout.Toggle(so.UseMaterials, "Use materials"); if (so.UseMaterials) { so.Materials = EditorExtensions.GameObjectList<Material>("Materials", so.Materials, false); } else { // Textures so.Textures = EditorExtensions.GameObjectList<Texture>("Textures", so.Textures, false); // Colours if (so.Colors == null) { so.Colors = new List<ColorRange>(); } for (var j = 0; j < so.Colors.Count; j++) { var clr = so.Colors[j]; EditorGUILayout.BeginHorizontal(); EditorGUILayout.PrefixLabel("Color"); clr.Color1 = EditorGUILayout.ColorField(clr.Color1); clr.Color2 = EditorGUILayout.ColorField(clr.Color2); if (GUILayout.Button("X")) { so.Colors.RemoveAt(j); } EditorGUILayout.EndHorizontal(); } if (GUILayout.Button("Add Color")) { so.Colors.Add(new ColorRange()); } } return so; }
private void Scatter(ScatterSettings settings) { var count = Random.Range(settings.CountMin, settings.CountMax); for (var i = 0; i < count; i++) { var model = Instantiate<GameObject>(settings.Model); if (settings.RadiusMax == 0 && settings.RadiusMin == 0) { model.transform.position = Vector3.zero; model.transform.rotation = Random.rotation; } else { model.transform.position = Random.onUnitSphere * Random.Range(settings.RadiusMin, settings.RadiusMax); if (settings.LookAtCenter) { model.transform.rotation = LookAtWithRandomTwist(model.transform.position, Vector3.zero); } else { model.transform.rotation = Random.rotation; } } model.transform.localScale = Vector3.one * Random.Range(settings.ScaleMin, settings.ScaleMax); model.transform.SetParent(_parent); if (settings.UseMaterials) { model.GetComponent<Renderer>().material = settings.Materials[Random.Range(0, settings.Materials.Count)]; } else { if (settings.Textures != null && settings.Textures.Any()) { var tex = settings.Textures[Random.Range(0, settings.Textures.Count)]; var colr = settings.Colors[Random.Range(0, settings.Colors.Count)].GetRandom(); model.GetComponent<Renderer>().material = CreateMaterial(tex, colr); } } } }
private ScatterSettings ScatterGUI(ScatterSettings so) { EditorGUILayout.BeginHorizontal(); so.IsActive = GUILayout.Toggle(so.IsActive, "", GUILayout.Width(10)); EditorGUILayout.LabelField(so.Name, EditorStyles.boldLabel); EditorGUILayout.EndHorizontal(); so.Name = EditorGUILayout.TextField("Name", so.Name); so.Model = EditorExtensions.ObjectField <GameObject>("Model", so.Model, false); // Radius var radius = EditorExtensions.FloatRange("Radius", so.RadiusMin, so.RadiusMax); so.RadiusMin = radius.Min; so.RadiusMax = radius.Max; // Count var count = EditorExtensions.IntRange("Count", so.CountMin, so.CountMax); so.CountMin = count.Min; so.CountMax = count.Max; // Scale var scale = EditorExtensions.FloatRange("Scale", so.ScaleMin, so.ScaleMax); so.ScaleMin = scale.Min; so.ScaleMax = scale.Max; so.LookAtCenter = GUILayout.Toggle(so.LookAtCenter, "Look at Centre"); // Materials so.UseMaterials = GUILayout.Toggle(so.UseMaterials, "Use materials"); if (so.UseMaterials) { so.Materials = EditorExtensions.GameObjectList <Material>("Materials", so.Materials, false); } else { // Textures so.Textures = EditorExtensions.GameObjectList <Texture>("Textures", so.Textures, false); // Colours if (so.Colors == null) { so.Colors = new List <ColorRange>(); } for (var j = 0; j < so.Colors.Count; j++) { var clr = so.Colors[j]; EditorGUILayout.BeginHorizontal(); EditorGUILayout.PrefixLabel("Color"); clr.Color1 = EditorGUILayout.ColorField(clr.Color1); clr.Color2 = EditorGUILayout.ColorField(clr.Color2); if (GUILayout.Button("X")) { so.Colors.RemoveAt(j); } EditorGUILayout.EndHorizontal(); } if (GUILayout.Button("Add Color")) { so.Colors.Add(new ColorRange()); } } return(so); }