Unity Spain

Post Antiguos => General (Antiguo) => Mensaje iniciado por: juanchodeth en Diciembre 12, 2015, 04:54:14 PM

Título: Ayuda, shaders y programacion.
Publicado por: juanchodeth en Diciembre 12, 2015, 04:54:14 PM
Hola, por lo que he podiido ver escasea la gente que sepa de programar o entienda la programacion de shaders en unity, y busco a alguien que pueda ayudarme con un problema que tengo, lo expongo por si alguien sabe como hacerlo.Mi problema consta de dos partes, la primera y mas sencilla, quiero conseguir el efecto de glitter de la arena /nieve, pero lomaximo que me llega a alcanzar con e,l specular  blanco negro es esto;https://gyazo.com/cd1f46cb73249feeeda9f1eb446ef105 y quiero aproximarme mas a esto;https://gyazo.com/188935428b690b017d195166634ab917Se que esa imagen lleva mucho Bloom, pero tiene que funcionar mucho mejor en el shader aun; si alguien sabe como hacerlo mas exagerado o sabe de algun shader que lo haga. Mi segundo problema es el siguiente.En mi proyecto todo va con Toon lit, es un toon normal pero quiero que genere sombras; y aparte tengo otro material que genera una textura encima de un objeto segun un float y sus normales tal que asi.https://gyazo.com/a686540d17d74e1432efe936075a18fb https://gyazo.com/aaac32ad81e164186042a639a8cc33d6
 pero el personaje ha de verse así, con el toon lit; https://gyazo.com/9ddb37d0fb074acc85e31409a25857a1 mi problea es ese, el color blanco de la nieve se da segun un condicional dentro del codigo del shader, y querria que el normal map apareciese junto con el color blanco, no que afecte a todo el modelo desde un principio.  Si alguien sabe sobre esto agradeceria mucho su ayuda. Gracias.
Título: Ayuda, shaders y programacion.
Publicado por: Antonio en Diciembre 13, 2015, 04:43:53 PM
Lo que dices no lo he hecho, pero bueno, según entiendo.

Yo entiendo que el efecto glitter sí va en el campo Specular, puede que tengas que cambiar el Gloss, (en el surf StandardSpecular se llama Smoothness, si usas otro puede que la variable de salida tenga otro nombre, no me acuerda @_@), mientras más bajo, más extendido es el brillo, mientras más alto, más concentrado, y si queda flojo, puede que tengas que multiplicar algunos números por el color del Specular para aumentar su potencia, ( aparte del reflejo de la luz en sí, que ya hace eso).

Lo que me ha dejado perplejo en tu imagen, es que las motas también oscurecen la textura, y creo que eso no debería pasar cuando las texturas están saliendo por el Specular, (este canal añade iluminación sobre el canal diffuse / albedo  no "sustrae" por lo que me rayan esas motas oscuras @_@  ¿Estas usando el canal Specular o estás sacando la textura especular sumándosela al albedo?, he visto que a veces lo hacen, pero, claro, eso iluminaría las cosas también por la luz ambiental.



Bueno, sobre el toon no tengo ni idea (yo sé hacer lo de los modelos con la capa extra, pero no he pensado como lo harán con shaders O.ò) no obstante sobre lo del shader de normales que sólo afecte a la parte de nieve, yo imagino que eso va con una máscara, una textura nueva que le diga que partes dibujar y que partes no, (ya sea en el canal alpha o alguno de los de colores, lo que hace falta es una información blanco y negro), así pues con esa infomración, lo que queda es multiplicarla por la textura de la nieve antes de aplicarla al a textura de normales de salida. De la misma forma que harías para multiplicar la potencia del mapa de normales, pero que en vez de por número, pues venga por la textura, y bueno, si es negro es 0, mapa de normales x 0 = nada, si es blanco es 1, mapa de normales x 1 = mapa de normales, así puedes aplicar eso a las áreas específicas (aunque bueno, esto mismo ya está hecho en el shader standard o buscando como "microbumps" puedes hallar más ejemplos. 

 
Título: Ayuda, shaders y programacion.
Publicado por: juanchodeth en Diciembre 13, 2015, 09:14:57 PM
Muchas gracias por responder, si lo pongo como especular, pero creo que lo que tinta dde negro es lo metálico que lo puse, lo debria bajar casi al minimo, pero bueno, ya hice lo del smoothnes pero por alguna razon, si subes la intensidad con el smoothnes se concentra en apenas unos puntos y si lo bajas se difumina tanto que pierde mucha potencia, se podria hacer por programacion que por lo que vi mucha gente crea valores strength para poder darles intensidad que multiplican el especular cuando el smoothnes esta muy disperso, lo que da ese efecto que es lo que quiero, el problema es que no se implementarlo ya que cualquier cambio que hago en el codigo aun usando la logica, me dejua de funcionar el shader. En el segundo caso la teoria la se, aun que mas que un alfa que seria estático, seria igual que el color al fin y al cabo, ya que ambois se extenderian, pero otra vez, no se como implementarlo en código.
Título: Ayuda, shaders y programacion.
Publicado por: Antonio en Diciembre 16, 2015, 09:02:23 PM
No sé como lo tendrás programado en tu shader, pero yo normalmente veo que los pasos, lo que van mandando es la información de colores como vectores (en vez de ser XYZ pues reprensentan el Rojo, Verde, Azul, pero en general, tienen las mismas reglas.

Entre tu salida del canal especular y tu variable de la textura especular, en el tramo, habrás tenido que crear por ahí algún vector3 que coja la información RGB de la textura para sacarla por la salida. Puede que dicho vector tenga algunas modificaciones por el UV map o más cosas, pero imagino que estará por ahí. Si multiplicas una constante por el vector, el valor de la constante se multiplica por todos los elementos del vector (haciéndolo crecer) sería lo que necesitas para incrementar la intensidad.

Así para aumentar la intensidad, localiza ese vector que va a parar al canal especular (seguramente haya más vectores por cada textura de entrada) y multiplícale la variable de intensidad que veas.


Para el tema de las dobles capas, pues imagino que los tiros andarán también por lo mismo, para el canal albedo, este tiene que tener un vector que díga el color del píxel, lo normal sería que lo tomara de la textura A, pero si quieres que a veces pinte algo de una textura B, pues se me ocurre intentar copiar la estructura del vector de esa textura A, y cuando tenga los 2 vectores, crear un Vector C (que será el vector de salida) con una mezcla entre A y B, ayudándome de esa textura de máscara. (que sólo usa 1 canal blanco y negro, es decir esta no sería un vector, sería un float, puede ser el canal alpha de alguna textura o una textura independiente).

Algo así como:
c = b * mask + (a - a* mask); 
//le mandamos el vector B (el de la nieve) multiplicado por la potencia de la máscara
//y le sumamos el vector A, cuyos valores decrementarán a 0 dependiendo de la potencia de la máscara
//así, si la máscara es 1, se manda el valor B en su totalidad, si es 0.5, pues se manda un color medio entre A y B., etc...
Si no me equivoco, eso debería superponer los dos valores ¿no? O.ò
El caso es hallar la fórmula y mandar el vector resultante a la salida.  (aunque eso sería para un canal, por ejemplo el albedo, imagino que habría que hacer lo mismo con las textura especulares, normales, oclusión, etc.. de los dos materiales... :S
Título: Ayuda, shaders y programacion.
Publicado por: juanchodeth en Diciembre 17, 2015, 10:05:45 PM
Oh gracias, entiendo lo que dices pero me cuesta al no saber mucho de programacion en shaderlab.Al final lo del especular consegui lo que quise, tocando bien los alfas y los mapas tal que asi:https://gyazo.com/37299490ba999fcee876ae2ba6d77d9c lo puedo forzar mas pero la cosa es que lo conseguí.Ahora la cosa está en lo de conseguir primero mezclar estos dos shaders.Un toon lit de toda la vida que viene en el pack de unity:https://gyazo.com/15f9c571bf629911de2e94c92dbc668c (https://gyazo.com/15f9c571bf629911de2e94c92dbc668c) (crea sombras pero no delata los poligonos por la luz)y este otro shader:https://gyazo.com/7db640f7263535d86e4ee500300064d2(el código es este)
Shader "FX/SnowShader" {
    Properties {
        _Color ("Main Color", Color) = (0.5,0.5,0.5,1)
        _OutlineColor ("Outline Color", Color) = (0,0,0,1)
   _Outline ("Outline width", Range (.002, 1)) = .005
   _MainTex ("Base (RGB)", 2D) = "white" {}
   
   
   
   _Ramp ("Toon Ramp (RGB)", 2D) = "gray" {}
        _Bump ("Bump", 2D) = "bump" {}
        _Snow ("Snow Level", Range(0,1) ) = 0
        _SnowColor ("Snow Color", Color) = (1.0,1.0,1.0,1.0)
        _SnowDirection ("Snow Direction", Vector) = (0,1,0)
        _SnowDepth ("Snow Depth", Range(0,0.2)) = 0.1
       
       
   
    }
    SubShader {
        Tags { "RenderType"="Opaque" }
        UsePass "Toon/Lit/FORWARD"
   UsePass "Toon/Basic Outline/OUTLINE"
        LOD 200
 
        CGPROGRAM
        #pragma surface surf Lambert vertex:vert
       
       
       
        sampler2D _MainTex;
        sampler2D _Bump;
        float _Snow;
        float4 _SnowColor;
        float4 _SnowDirection;
        float _SnowDepth;
 
        struct Input {
            float2 uv_MainTex;
            float2 uv_Bump;
            float3 worldNormal;
            INTERNAL_DATA
        };
 
        void vert (inout appdata_full v) {
            //Convert the normal to world coortinates
            float3 snormal = normalize(_SnowDirection.xyz);
            float3 sn = mul((float3x3)_World2Object, snormal).xyz;
 
            if(dot(v.normal, sn) >= lerp(1,-1, (_Snow*2)/3))
            {
               v.vertex.xyz += normalize(sn + v.normal) * _SnowDepth * _Snow;
            }
        }
 
        void surf (Input IN, inout SurfaceOutput o) {
            half4 c = tex2D (_MainTex, IN.uv_MainTex);
            o.Normal = UnpackNormal (tex2D (_Bump, IN.uv_Bump));
            if(dot(WorldNormalVector(IN, o.Normal), _SnowDirection.xyz)>=lerp(1,-1,_Snow))
            {
                o.Albedo = _SnowColor.rgb;
               
            }
            else {
                o.Albedo = c.rgb;
            }
            o.Alpha = 1;
        }
        ENDCG
    }
   
    Fallback "Toon/Lit"
   
}
 

como puedes ver ya intente meter el toon, pero no me lo pilla bien.Pues con esos dos lo que quiero es juntarlos en uno, y poder hacer que el normal map se genere con el color en vez de afectar de base a todo el modelo (puedo llegar a prescindir de esta parte la verdad) en su defecto con poder tenerlos juntos y cambiar el color por un difuso seria perfecto; por lo que vi no es una cosa muy compleja pero hay que saber de shaderlab xD.Gracias por la ayuda.