Noticias

¡RECUERDA QUE SI ERES UN NUEVO USUARIO, DEBES PRESENTARTE PARA PODER PUBLICAR MENSAJES! | TENEMOS CANAL OFICIAL DE TELEGRAM: t.me/unity3dspain

Convertir material opaco en transparente

Iniciado por Centauro5legs, Noviembre 11, 2017, 09:17:55 PM

Tema anterior - Siguiente tema
Noviembre 11, 2017, 09:17:55 PM Ultima modificación: Noviembre 11, 2017, 09:21:31 PM por Centauro5legs
Ok, esto es complicado, hice un script que debería, primero convertir los materiales de un objeto en "Standard/Transparent", y después reducir su alpha, para hacer que se desvanezca. El problema, es que si bien si se cambia a "Transparent" y se desvanece, pero no se llega a volver totalmente trasparente, sino que se queda grisaseo, ademas aunque cambio le doy un "Glossiness" (Brillo) 0, sigue reflejando la luz. Y si yo pauso el juego, y modifico manualmente el material (Aunque no modifique el alpha), inmediatamente se corrige. ¿Alguien sabe porque pasa esto, y como corregirlo??
 

private float[] a;
private Color32[] c;
void Start(){
c = new Color32[transform.childCount];
    a = new float[transform.childCount];
for (int i = 0; i < transform.childCount; i++)
    {
   Material[] m = transform.GetChild(i).GetComponent<Renderer>().materials;
        for (int j=0; j < m.Length; j++)
        {
      m[j].shader = Shader.Find("Standard");
            m[j].SetFloat("_Mode", 3f);
            m[j].SetFloat("_Glossiness", 0f);
            m[j].DisableKeyword("_ALPHATEST_ON");
            m[j].DisableKeyword("_ALPHABLEND_ON");
            m[j].EnableKeyword("_ALPHAPREMULTIPLY_ON");
            m[j].SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One);
            m[j].SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha);
            m[j].SetInt("_ZWrite", 0);
            m[j].renderQueue = 5000;
        }
}
}
void Update(){
for (int i = 0; i < transform.childCount; i++)
    {
       Material[] m = transform.GetChild(i).GetComponent<Renderer>().materials;
        c = new Color32(c.r, c.g, c.b, (byte)a);
   a -= Time.deltaTime;
         
        for(int j =0; j<m.Length; j++)
           m[j].SetColor("_Color", c);
   if(a[0]<=0)
          Destroy(gameobject);
}
}

Cita de: Centauro5legs date=1510431475... y se desvanece, pero no se llega a volver totalmente trasparente, sino que se queda grisaseo...
   


Transparent te los deja así, es intencional, incluso si les ponés un mapa totalmente "transparente" (canal alpha en negro), salvo que intentes haces lo que estás haciendo, pero no es lo correcto si vas a hacer un fade. Pensalo a transparent para un vidrio o cristal, necesitas que refleje cierta luz siendo transparente ... el que no te los deja así y te los hace desaparecer por completo es "Fade".
 
 
 
Cita de: Centauro5legs date=1510431475ademas aunque cambio le doy un "Glossiness" (Brillo) 0, sigue reflejando la luz. Y si yo pauso el juego, y modifico manualmente el material (Aunque no modifique el alpha), inmediatamente se corrige. ¿Alguien sabe porque pasa esto, y como corregirlo??
   


no tenés nullreferences ni nada? Te iba a poner que seguro erraste en alguna letra o mayúscula, o que quizás no era glossiness pero después de chequear parecería que está bien.
 
Para agregar una data que me vino joya, leí por ahí que si le das click derecho al material y ponés select shader te muestra en inspector todas las propiedades! ... que trucazo.
 

 
 
 
 

Cita de: lightbug date=1510437932 
   

Cita de: lightbug date=1510437932 
   


Jajajaja por error di clic en quote y tratando de deshacerme del primer quote termine agregando un segundo........
 
 
 
Mi respuesta no es de programacion pero depronto le sirva a @Centauro5legs el gloss que ves en el modelo es debido al tipo de material, blinn, phong, etc todos dan gloss incluso con 100% de transparencia, si cambias el material a unlit te queda como lo necesitas.
 
 

Ya lo corregir, solo había que cambiar el el "_SrcBlend" de "One" a "SrcAlpha", desactivar el "_ALPHAPREMULTIPLY_ON" y activar el "_ALPHABLEND_ON". Quedo del siguiente modo
 

   for (int i = 0; i < transform.childCount; i++)
{
   Material[] m = transform.GetChild(i).GetComponent<Renderer>().materials;
          for (int j=0; j < m.Length; j++)
       {
              m[j].shader = Shader.Find("Standard");
            m[j].SetFloat("_Mode", 2f);
            m[j].SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.SrcAlpha);
            m[j].SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha);
            m[j].SetInt("_ZWrite", 0);
      m[j].DisableKeyword("_ALPHATEST_ON");
            m[j].EnableKeyword("_ALPHABLEND_ON");
            m[j].DisableKeyword("_ALPHAPREMULTIPLY_ON");
            m[j].SetFloat("_Glossiness", 0f);
            m[j].renderQueue = 5000;
   }
}

 
 

Etiquetas: