Unity3d shader Shader's Boolean switch variable [Toggle] componente C# script control is invalid problem solution

pregunta

El shader de efectos de un modelo se llama en el efecto de escena, y el programa necesita modificar dinámicamente un atributo del shader. Los atributos son los siguientes:

[Toggle(_USELINE_ON)] _UseLine("Use Line", Float) = 0

Según mi entendimiento previo, no debería haber problema si directamente modifico el valor de Float a 1 o 0:

//关闭
 AniMat2.SetFloat("_UseLine", 0);
 
//打开
 AniMat2.SetFloat("_UseLine", 1);

Sin embargo, no funcionó, y después de buscar durante mucho tiempo en la página web, no se encontraron resultados.Finalmente, se encontró un gran avance en el código generado por el sombreador.

Solución

Vea muchos fragmentos similares en el código de sombreado:

#ifdef _USELINE_ON
...
#else
...
#endif

[Toggle(_USELINE_ON)] está asociado con _USELINE_ON
Esta es una definición de macro, luego puedo modificar dinámicamente la definición de macro para completar el control

La forma de hacerlo es esta = definición de macro de modificación dinámica =
deshabilitar la palabra clave del sombreador local para este material. Método Material.DisableKeyword:

inserte la descripción de la imagen aquí
Habilita la palabra clave del sombreador local para este material. Método Material.EnableKeyword:

inserte la descripción de la imagen aquí
De esta forma, puedes controlar el efecto Toggle del shader

//关闭
  AniMat2.DisableKeyword("_USELINE_ON");
//打开
  AniMat2.EnableKeyword("_USELINE_ON");

Inválido después de empacar

El problema de que esta función no es válida después del empaquetado, lo resolví a través de https://www.jianshu.com/p/32f6e8a217d6 .

Lo resolví modificando Shader - multi_compile por el método 3.

Supongo que te gusta

Origin blog.csdn.net/weixin_43149049/article/details/127352662
Recomendado
Clasificación