Jump to content
Unity Insider Forum
Sign in to follow this  
Kojote

Self-Illuminated + Transparent

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

Share this post


Link to post
Share on other sites

Weils net so einfach ist ;)    Also Gelb als Emissionsfarbe setzen und bei der Albedofarbe den Alphawert herunterdrehen (bis gewünschte Durchsichtigkeit)
Das Gelb beim Albedo sorgt für den optischen Look, das Gelb bei Emission sorgt für die abgegebene Lichtfarbe ...

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

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;
    }
}

 

  • Like 1

Share this post


Link to post
Share on other sites
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.

Share this post


Link to post
Share on other sites

Sehr cool! :D

Aber was macht Scroll Speed? Hat irgendwie keinen Einfluss oder täusche ich mich?

Edited by Kojote

Share this post


Link to post
Share on other sites

Das scrollt die UVs des Materials, sieht man aber nur wenn das Material eine Textur hat ;) Der Code kommt von meiner Polizeileuchte ^^

So hier mein Diamandtest mit Bloom. Man sieht leider keine Kanten, denke das liegt am Modell...
https://streamable.com/wbqdi

Share this post


Link to post
Share on other sites

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 ...

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

Tricksen muss man doch immer ein wenig, gehört glaube ich zu Unity dazu.^^ Dürfte ich das Script verwenden? Das passt eigentlich ziemlich gut zu meinem "Diamanten". ^_^

Share this post


Link to post
Share on other sites

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;
    }
}

 

  • Like 1

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×