Jump to content
Unity Insider Forum

Self-Illuminated + Transparent


Kojote

Recommended Posts

Grüße!

Wie ich ein Objekt nun zur "Self-Illumination" bringe, versteh ich, wie ich ein Objekt eine Transparenzt verpasse, weis ich auch. Nun möchte ich mir gerne einen Kristall erstellen, der halb transparent ist und auf Befehl leuchten kann. Mit dem Standardshader wird das nix, die anderen sind auch ungeeignet. Habe nun schon eine ganze weile gelesen und eigentlich meinen alle, man braucht dazu einen speziellen Shader, ohne den ist das nicht möglich. Kennt ihr so einen Shader?

Grüße Kojote

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hier mal eine kleine Spielerei. Das emissive Material wird über Zeit heller und kehrt dann wieder auf die Ursprungsfarbe zurück. Ich habe 2 verschiedene Modi eingebaut (siehe keepColor) und man kann die Frequenz des Pulsing einstellen (siehe pulseSpeed).
Die Texturen werden auch rotiert, daß kann man ausbauen, wenn man es nicht mag ...

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class RotateAround : MonoBehaviour {

    public float maxBrightness = 2.0F;
    public float pulseSpeed = 2.0F;
    public bool keepColor = false;

    public float scrollSpeed = 0.5F;

    private Renderer m_Renderer;
    private Material m_Material;
    private float currentBrightness = 0;
    private Color startColor;

    void Start()
    {
        m_Renderer = GetComponent<Renderer>();
        m_Material = m_Renderer.material;
        m_Material.globalIlluminationFlags = MaterialGlobalIlluminationFlags.RealtimeEmissive;
        startColor = m_Material.GetColor("_EmissionColor");
    }

    void Update()
    {
        float offset = Time.time * scrollSpeed;
        float offset2 = Time.time * scrollSpeed*1.5f;
        m_Material.mainTextureOffset = new Vector2(offset, offset2);
        //material.doubleSidedGI = true;

        Color newColor;
        if (!keepColor)
        {
            newColor = new Color(Mathf.Clamp(startColor.r, startColor.r + currentBrightness, maxBrightness),
                                       Mathf.Clamp(startColor.g, startColor.g + currentBrightness, maxBrightness),
                                       Mathf.Clamp(startColor.b, startColor.b + currentBrightness, maxBrightness));
        } else
        {
            newColor = new Color(Mathf.Clamp(startColor.r, startColor.r + startColor.r*currentBrightness, maxBrightness),
                                       Mathf.Clamp(startColor.g, startColor.g + startColor.g*currentBrightness, maxBrightness),
                                       Mathf.Clamp(startColor.b, startColor.b +  startColor.b*currentBrightness, maxBrightness));
        }

        m_Material.SetColor("_EmissionColor", newColor);
        m_Renderer.UpdateGIMaterials();
        currentBrightness = Mathf.Abs(Mathf.Sin(Time.time * pulseSpeed)) * maxBrightness;
    }
}

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 13 Minuten schrieb Kojote:

Hab ich gemacht, Problem ist, erst ab einer bestimmten Stärke der des Alphawertes bei Albedo, wird die Emission sichtbar. Blöderweise ist die Alphastärke dann wieder dermaßen hoch, dass keine Transparenz möglich ist.

In dem Fall die Emission hochdrehen. Bei meinem Skript oben wäre das "maxBrightness". Allerdings, wenn das Objekt nicht sichtbar ist kann es auch kein Licht abgeben, also endlos kann man den Alpha nicht runterdrehen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hehe die Kanten sieht man nur, wenn man eine externe Lichtquelle hat. Ist irgendwo auch logisch, die Kanten entstehen über die Normals und die Flächen werden nur sichtbar, wenn sie von außen bestrahlt werden, scheinbar beleuchtet sich das Objekt nicht selbst ... 
Eigentlich sollte das Ambientlicht des Materials auf den Diamanten zurückstrahlen tut es aber offensichtlich nicht ...

Link zu diesem Kommentar
Auf anderen Seiten teilen

Man muss wieder tricksen, damit man den Shape des Diamanten sieht:
- ein Spotlight direkt vor dem Diamanten platzieren, kurze Range (3) und "Indirect Multiplier" auf 0
- Intensity realtiv hoch bei mir war's 16
- Ambient Material auf die Farbe in der die Facetten des Diamants zu sehen sein sollen

Hier das Ergebnis:
https://streamable.com/57g6h

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ja klar, ich hab nur noch 1 Zeile mit der Rotation dazugebaut, ansonsten ist es das Skript von oben:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class RotateAround : MonoBehaviour {

    public float maxBrightness = 2.0F;
    public float pulseSpeed = 1.0F;
    public bool keepColor = false;

    public float scrollSpeed = 0.5F;

    private Renderer m_Renderer;
    private Material m_Material;
    private float currentBrightness = 0;
    private Color startColor;

    void Start()
    {
        m_Renderer = GetComponent<Renderer>();
        m_Material = m_Renderer.material;
        m_Material.globalIlluminationFlags = MaterialGlobalIlluminationFlags.RealtimeEmissive;
        startColor = m_Material.GetColor("_EmissionColor");
    }

    void Update()
    {
        float offset = Time.time * scrollSpeed;
        float offset2 = Time.time * scrollSpeed*1.5f;
        m_Material.mainTextureOffset = new Vector2(offset, offset2);
        transform.Rotate(0, Time.deltaTime * 50f, 0, Space.World);

        //material.doubleSidedGI = true;

        Color newColor;
        if (!keepColor)
        {
            newColor = new Color(Mathf.Clamp(startColor.r, startColor.r + currentBrightness, maxBrightness),
                                       Mathf.Clamp(startColor.g, startColor.g + currentBrightness, maxBrightness),
                                       Mathf.Clamp(startColor.b, startColor.b + currentBrightness, maxBrightness));
        } else
        {
            newColor = new Color(Mathf.Clamp(startColor.r, startColor.r + startColor.r*currentBrightness, maxBrightness),
                                       Mathf.Clamp(startColor.g, startColor.g + startColor.g*currentBrightness, maxBrightness),
                                       Mathf.Clamp(startColor.b, startColor.b +  startColor.b*currentBrightness, maxBrightness));
        }

        m_Material.SetColor("_EmissionColor", newColor);
        m_Renderer.UpdateGIMaterials();
        currentBrightness = Mathf.Abs(Mathf.Sin(Time.time * pulseSpeed)) * maxBrightness;
    }
}

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...