コード例 #1
0
    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);
        }
    }
コード例 #2
0
    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);
                }
            }
        }
    }
コード例 #3
0
	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;
	}
コード例 #4
0
	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);
				}
			}
		}
	}
コード例 #5
0
    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);
    }