Hola, averiguando por ahí encontré un post muy útil en el foro oficial en donde un usuario indicaba como modificar la atenuación (https://forum.unity.com/threads/easiest-way-to-change-point-light-attenuation-with-deferred-path.254337/ (https://forum.unity.com/threads/easiest-way-to-change-point-light-attenuation-with-deferred-path.254337/)), los pasos para lograr esto son los siguientes (en Deferred Shading, algo modificado al del post):
1 - Descargarse los shaders correspondientes a su versión de Unity (otras versiones puede que también funcionen, pero por las dudas)
https://unity3d.com/get-unity/download/archive (https://unity3d.com/get-unity/download/archive)
2 - Pasar al proyecto los siguientes dos archivos: "Internal DeferredShading " y "UnityDeferredLibrary"
a una carpeta llamada "Resources" 3 - Reiniciar Editor (para que se actualice)
3 - En ProjectsSettings/Graphics, ir a "Built in Shaders Settings" , en Deferred cambiar de "built in" a "custom shader", luego seleccionar el shader (Internal deferred shading) (debería verse todo igual)
4 - Modificar el archivo "UnityDeferredLibrary", buscar la lineas del final , donde se define la SPOT y la POINT light y modificar el parámetro "att" a gusto:
.......
// spot light case
#if defined (SPOT)
float3 tolight = _LightPos.xyz - wpos;
half3 lightDir = normalize (tolight);
float4 uvCookie = mul (unity_WorldToLight, float4(wpos,1));
// negative bias because http://aras-p.info/blog/2010/01/07/screenspace-vs-mip-mapping/
float atten = tex2Dbias (_LightTexture0, float4(uvCookie.xy / uvCookie.w, 0, -8)).w;
atten *= uvCookie.w < 0;
float att = dot(tolight, tolight) * _LightPos.w;
att = pow(att , 0.25 ); <---------------------------------------------------------------------- MOD
atten *= tex2D (_LightTextureB0, att.rr).UNITY_ATTEN_CHANNEL;
atten *= UnityDeferredComputeShadow (wpos, fadeDist, uv);
// directional light case
#elif defined (DIRECTIONAL) || defined (DIRECTIONAL_COOKIE)
half3 lightDir = -_LightDir.xyz;
float atten = 1.0;
atten *= UnityDeferredComputeShadow (wpos, fadeDist, uv);
#if defined (DIRECTIONAL_COOKIE)
atten *= tex2Dbias (_LightTexture0, float4(mul(unity_WorldToLight, half4(wpos,1)).xy, 0, -8)).w;
#endif //DIRECTIONAL_COOKIE
// point light case
#elif defined (POINT) || defined (POINT_COOKIE)
float3 tolight = wpos - _LightPos.xyz;
half3 lightDir = -normalize (tolight);
float att = dot(tolight, tolight) * _LightPos.w;
att = pow(att , 0.4 ); <---------------------------------------------------------------------- MOD
float atten = tex2D (_LightTextureB0, att.rr).UNITY_ATTEN_CHANNEL;
atten *= UnityDeferredComputeShadow (tolight, fadeDist, uv);
#if defined (POINT_COOKIE)
atten *= texCUBEbias(_LightTexture0, float4(mul(unity_WorldToLight, half4(wpos,1)).xyz, -8)).w;
#endif //POINT_COOKIE
Se pueden lograr lindos efectos y/o corregir esos molestos "deslumbramientos" que aveces una point light puede llegar a provocar, manteniendo la intensidad practicamente igual. Aquí algunos ejemplos (la point light está casi pegada al suelo, el Color Space es por supuesto
"Linear"):
- Potencias de exponente 0.5 equivale a hacer la raiz Cuadrada, de un tercio equivale a raiz cubica, y así ...)
-->
Ver en FULL-Size para apreciar los detalles - Ver como en default el rango es mucho más notable que en por ej pow(att, 0.4)
Puede parecer que para algunos digan "eh, le subo la intensidad o le toco el rango y paso de una atenuación a otra ...." No, no funciona así, al final son diferentes equaciones.
Yo utilizo el "pow(att, 0.4)" incluso a veces paso de 0.4 a 0.3 , quiere decir que atenua antes de lo que debería, dando lugar a rangos más agradables en mi opinión , son gustos.
El siguiente paso es modificar directamente la textura que samplea la atenuación (y no solamente modificar este resultado) que son las "LightTexture0", así se pueden crear toda clase de efectos, pero será para después :) . En el mismo post mencionan como realizarlo pero no lo he probado ni entendido de momento nada. Si sale algo bueno lo agregaré.
esta bien el articulo, y la atenuacion potencia a ^0.4f me parece perfecta.
la segunda parte del articulo lo que parece que hace es sustituir la "rampa" del degradado por una rampa echa por él, hace un array (new Color[256]) donde cada color en la lista es color(1/i, 1/i, 1/i, 1/i) ...con lo que quedaria una "rampa" tipo exponencial....
creo que este metodo da muchas posibilidades... raras... jejeje
...porejemplo puedes hacer la rampa alreves... y crear averraciones de todo tipo
...o hacer que las luces iluminen al estilo "cell shading" (a "escalones").... o que la rampa se mantenga "alta" y luego caiga rapido.... o alreves...
o cosas asi...
Cita de: Igor date=1523288322esta bien el articulo, y la atenuacion potencia a ^0.4f me parece perfecta.
la segunda parte del articulo lo que parece que hace es sustituir la "rampa" del degradado por una rampa echa por él, hace un array (new Color[256]) donde cada color en la lista es color(1/i, 1/i, 1/i, 1/i) ...con lo que quedaria una "rampa" tipo exponencial....
creo que este metodo da muchas posibilidades... raras... jejeje
...porejemplo puedes hacer la rampa alreves... y crear averraciones de todo tipo
...o hacer que las luces iluminen al estilo "cell shading" (a "escalones").... o que la rampa se mantenga "alta" y luego caiga rapido.... o alreves...
o cosas asi...
claro, igual así con esto lo podés hacer, si le das un (1 - att) ilumina alrevés y si usas un sign (signo) corrido me parece que lo podés hacer ( sign(att - 0.5) ???) pero te da un step fijo, mmm voy a probar, lo ideal sería modificar esto directamente como decís tocando dicha textura.
Oh my god...
att = 1 - (
sign(att) - sign(att - 0.1) +
sign(att - 0.2) - sign(att - 0.3) +
sign(att - 0.4) - sign(att - 0.5) +
sign(att - 0.6) - sign(att - 0.7) +
sign(att - 0.8) - sign(att - 0.9) +
sign(att - 1)
);
--------------------------------------------------------------------------------------------------------
att = (1 - att) * (
sign(att) - sign(att - 0.1) +
sign(att - 0.2) - sign(att - 0.3) +
sign(att - 0.4) - sign(att - 0.5) +
sign(att - 0.6) - sign(att - 0.7) +
sign(att - 0.8) - sign(att - 0.9) +
sign(att - 1)
);
--------------------------------------------------------------------------------------------------------
att = (1 - exp(att)) * (
sign(att) - sign(att - 0.1) +
sign(att - 0.2) - sign(att - 0.3) +
sign(att - 0.4) - sign(att - 0.5) +
sign(att - 0.6) - sign(att - 0.7) +
sign(att - 0.8) - sign(att - 0.9) +
sign(att - 1)
);
Cita de: Igor date=1523297654jejeje...
...no se si servira para algo... pero divertido es
xD! puede servir, por ej había un juego de terror basado en sonido o parecido, podrías tener una sola franja, aumentar el radio y disminuir a la vez la intensidad, todo esto loopeado, y lograrías un "efecto sonar" (parecido al de no man sky), pero claro, esto es para todo el proyecto, pero bueno, es una posibilidad.
Cita de: lightbug date=1523305205pero claro, esto es para todo el proyecto...
se supone que afecta a todas las luces... de ese tipo, puedes aplicarlo solo a las spot... o solo a las point...
...y a la direccional? que pasa cos esa? se puede hacer "cosas raras" con esa?
Cita de: Igor date=1523569260se supone que afecta a todas las luces... de ese tipo, puedes aplicarlo solo a las spot... o solo a las point...
...y a la direccional? que pasa cos esa? se puede hacer "cosas raras" con esa?
Exacto, con la dir no toqué nada, las líneas son algo distintas, tendría que entender bien qué hace (cosa que de momento no tengo ganas de hacer) pero no creo que sea vital tocarla, sí para la point y spot en mi caso que cada vez que meto una de estas en Linear el rango se "ve mal" por alguna razón (en la beta de Unity 2018 estaba bien... si mal no recuerdo)