Hola! tengo un problema! o mas que un problema desconocimiento de como hacerlo pero me pasa lo siguiente actualmente mi luz de ambiente esta seteada con un color claro lo que le da a todo mas luminosidad y vida pero! no me esta haciendo bien las sombras y los sitios donde no debería haber luz ya que la luz ambiente afecta a todo el mundo tengo zonas del juego como bodega cuevas y demás que debería ser oscuro pero con la luz de ambiente no se pone. Bien e cambiado la luz ambiente a SKYBOX y si hace las sombras y demás como debe pero! queda todo muy oscuro aquí dos ejemplos de sin o con.
Asi lo tengo ahora: no se ve una luz natural realista por que apenas hay sombras.
Asi lo queiro pero con mas luz (Claridad en las sombras): En esta imagen la luz trabaja como debe con las sombras y demás solo que queda muy oscuro la parte de sombras.
Como puedo arreglar esto para tener un equilibrio para que la luz trabaje asi pero la parte de sombra quede con un poco de mas luz solo un poco mas.
No puedo poner luces point ni nada simular ya que es un MMO de mundo abierto de 900 km
Que hago mal o que me falta por hacer?
GRACIAS CHICOS!
Cita de: ZOOSTAGE date=1502827678Como puedo arreglar esto para tener un equilibrio para que la luz trabaje asi pero la parte de sombra quede con un poco de mas luz solo un poco mas.
No puedo poner luces point ni nada simular ya que es un MMO de mundo abierto de 900 km
Que hago mal o que me falta por hacer?
900 km? maldito loco desquiciado jajaj
De la imagen tenes muchisima luz ambiente, generalmente se le da un toque para dar el efecto pero ahi directamente eliminaste toda sombra, y encima el bloom ayuda mas.
Si queres interiores oscuros vs exteriores iluminados no podes setear un ambient light y quedar feliz, generalmente te tenes que comer la molesta luz esa o usar global illumination para simular un poco una luz mas real. Si deseas interiores oscuros primero tenes que decir que la amb = 0, nada, y despues fakeaer esa ambient afuera mediante points o spots, no tiene porque ser en todos los lugares sino es lugares estrategicos, podes ayudarte del bloom (usas un buen radio) y del tone mapping.
Mira este ej que te hice:
Esto tiene ambient cero, izquierda tiene tres spot fakeando la ambient + tonemapping + bloom exagerado , derecha algo de bloom. Lo bueno es que los parametros los podes cambiar cuando ingresas a una cueva por ejemplo.
lo verde del ambient lo notas en las rocas, solo en el objeto de interes no tenes que fakear el ambient para todo el terreno.
Si queres usar el ambient te puedo mencionar un juego que hacia un lindo truquito, en farcry 3 (y 4 tmb) cuando te metias a una cueva el amb se ponia en cero o eso es lo que me parecia que pasaba. Depende tambien de que clase de interior sea si es una choza de 5x5 m2 no vas a hacer ese truco, queda muy feo si miras para afuera, ahora si tenes una cueva medianamente grande podes meterte cuando pasas una cierta distancia (sin la posibilidad de mirar hacia afuera ni tan adentro) hacer un "fade" de ambient light.
Saludos
A ver. Es como dice lightbug: Usas mucha luz ambiental.
No tengo claro que versión de unity usas pero lo que debes saber es que es imposible combinar zonas iluminadas(exteriores) y zonas no iluminadas(interiores) sin encontrarte problemas de iluminación. Antaño(y aun ahora) se empleaba la luz ambiental y se modificaba con un script: En muchos juegos aun se ve como la luz ambiental cambia al entrar a interiores.
Otra forma de tratar este problema es emplear vertexColor: Los vértices de las meshes se pintan(al menos uno de los canales) para indicar las zonas en las que es interior. Luego usas un shader especial que lea esta información y la use en la iluminación. Unity no tiene una herramienta para pintar meshes peeeeero... las hay por internet y yo tengo una propia. A parte de que en el modelador 3d esto no te supondrá un problema.
Supondré que usas el sistema de terrenos de unity3d y colocas objetos en el editor. Con esto te recomiendo la primera idea(modificar la luz ambiental con un script). Aunque no es realista es lo mejor (aunque eso lo decides tu).
Una solucion es via script, como dicen @marcoscuro1, cambiar el ambientLight igual al entrar en contacto con unos "trigrer" o como se escriba (disparadores/collider)... usando un "lerp" o algun otro metodo para suavizar el cambio...
Sino tambien puedes hacerlo con un shader "postEffect" en la camara que modifique los valores RGB multiplicandolos por una constante que tambien deberias cambiarla via script como antes...
Solo que via shader, ya que te pones a hacer un shader de "luminance", puedes hacer uno de contraste y saturacion con dos variables, lo cual te dara mas libertad y mas un abanico mas amplio de posibilidades, incluso puedes poner variables independientes para cada canal (RGB) para asi poder realzar cada color indepentientemete, puede usarse para por ejemplo realzar solo los tonos rojos, hacer que cuando desciende la vida se vallan apagando los tonos hasta volverse en blanco y negro (tonos de gris) o poner todo en tono sepia, etc, hize uno hace mogollon que hacia esas cosas, no se si funcionara en unity porque lo hice hace al menos 7 años para el "motor" DarkBasic, era muy simple (costaba poco procesamiento) multiplicaba los valores RGB por las variables, creo recordar que primero sumaba los tres valores r+g+b y los dividia entre tres(dividir entre tres es multiplicar por 0.3333333) para hallar la media de los tres tonos, luego no me acuerdo muy bien como hacia con ese valor para calcular la saturacion... Ummmm...
Nose, voy a ver si lo encuentro y lo modifico para unity y sino lo hago otra vez
Postdada: lo de dividir /3 es igual a multiplicar *0.3333333, parece una tonteria pero multiplicar es un proceso mas simple que dividir, en la cpu/gpu cuesta menos tiempo(realmente no se si es cierto, lo lei en algun lado...) pero siempre que puedo (si es una constante porejemplo, en vez de dividir entre diez, multiplico por 0.1f) multiplico por su correspondiente valor, sobre todo si esta dentro de un bucle "for" o algo asi...
Cita de: Igor date=1502895602Postdada: lo de dividir /3 es igual a multiplicar *0.3333333, parece una tonteria pero multiplicar es un proceso mas simple que dividir
Aunque instruccion a instruccion cuesta menos (gracias al algoritmo de booth) dependera de la arquitectura del procesador(hay calculos matriciales importantisimos que sea hacen en una sola instruccion, sobre todo en celulares) o del compilador (hablo de programacion en general), quizas pones dividir por 2, pero el compilador a nivel instrucciones te hace un *0.5f" porque lo ve conveniente, la verdad ni idea. Pero si, siempre es recomendable, si el error de truncamiento lo permite usar multiplicacion, por ej si no podes representar el 0.3(periodico) en float vas a tener un error.
daria un numero...mmm creo que asi... a ver.. me llevo una ... sumo un dos por aqui... mmm ... Si, asi:
0.3(periodico) --> 0.3333333
432674407958984375 pero bueno, esta mas que bien para el resultado que se quiere y cuesta menos. buen dato
.
Cita de: Igor date=1502895602pero siempre que puedo (si es una constante porejemplo, en vez de dividir entre diez, multiplico por 0.1f) multiplico por su correspondiente valor, sobre todo si esta dentro de un bucle "for" o algo asi...
Si yo hago lo mismo.
Shader "Custom/satu" {
Properties {
_MainTex ("Base (RGB)", 2D) = "white" {}
_Satu ("Saturance", float) = 1.0
_Lumi ("Luminance", float) = 0.05
}
SubShader {
Tags {"RenderType"="Opaque"}
LOD 200
CGPROGRAM
#pragma surface surf Lambert
sampler2D _MainTex;
float _Satu;
float _Lumi;
struct Input {
float2 uv_MainTex;
};
void surf (Input IN, inout SurfaceOutput o) {
half4 c = tex2D (_MainTex, IN.uv_MainTex);
float gray = (c.r + c.g + c.b) * 0.333333;
c.r = (c.r + _Lumi + (gray * (_Satu-1))) / _Satu;
c.g = (c.g + _Lumi + (gray * (_Satu-1))) / _Satu;
c.b = (c.b + _Lumi + (gray * (_Satu-1))) / _Satu;
o.Albedo = c.rgb;
o.Alpha = o.a;
}
ENDCG
}
FallBack "Diffuse"
}
Encontre el shader, esta es la version simple, como antes habia hablado de el, lo pongo aqui para el que lo quiera, sean libres de usarlo, modificarlo, u mandarlo a la papelera de reciclaje
la satu normal es 1, con satu de 0.5 los colores son el doble de intensos, si pones un 2, seran la mitad, contra mas alto el numero mas gris sera todo
La "lumi" si pones 0 esla luz normal, lo que pongas se añade, como si fuera otra ambient light mas,
Para controlar cada canal por separado pones 3 variables de saturacion (_SatuR, _SatuG, _SatuB) en "properties", y despues de CGPROGRAM donde sampler2D _MainTex....
Y cambias en "void surf" en la operacion c.r = , c.g = , c.r = cada "_Satu" respectibamente por _SatuR, _SatuG y _SatuB
Esto te permitiria porejemplo en tu juego quitar(volver en tonos de grises) de repente todos los colores menos el rojo, como en la fantastica pelicula "SinCity" :)
En realidad es un shader muy cutre, jeje, lo hize hace mogollon y ahora mirandolo creo que las operaciones me las invente un poco a lo loco, me parece que no son muy "correctas"... Pero hacen lo que queria que hiciesen, jeje, bueno, jeje, para colmo he visto que divido varias vezes
Postdata: @lightbug gracias por tu info complementaria sobre las divisiones/multiplicaciones, habia leido que costaba menos pero no sabia ni porque ni nada, no estaba muy seguro de que fuese cierto pero con lo que has dicho le veo mas sentido, si sabia que al hacer el cambio en alguna operacion se perdia algo de precision ...no siempre lo hacia (cambiar division por multiplicacion) a veces viene mal o a veces no se puede...
El problema es que cuando bajo la luz ambiente las texturas se me ven muy negras apagadas sin vida y realmente no son así no se si a la textura independiente mente le hace falta algún mapa de luz o algún añadido.
Estuve trabajando un poco en la luz y ahora se acerca mucho a lo que quiero pero sin embargo miren la textura del barco esta apagada.
https%3A%2F%2Ftwitter.com%2Fageofseas%2Fstatus%2F898177838326710277
gracias chicos por su ayuda!
Cita de: ZOOSTAGE date=1503044933El problema es que cuando bajo la luz ambiente las texturas se me ven muy negras apagadas sin vida y realmente no son así no se si a la textura independiente mente le hace falta algún mapa de luz o algún añadido.
La textura es lo que es, suponiendo que usas un shader standard podes decir cuanto toma o refleja la luz pero mas que eso no, lo que podes hacer es primero verificar que la textura no tenga info de luz, por ejemplo si queres crear un material con el piso de madera de tu casa, tenes que sacarle una foto, no es lo mismo sacarsela al mediodia, que a las 7 pm con luz artificial, la textura va a tener informacion de luz implicita o con flash, obviamente la podes modificar un poco pero lo primero que tenes que buscar es que quede lo mas neutra y que tenga cierta versatilidad, por ejmplo:
(http://fc04.deviantart.com/fs30/f/2008/148/c/3/Wood_floor_by_gnrbishop.jpg)
esta textura es bien neutra, funciona para luz baja y para luz alta, se puede meter en casi cualquier escenario que queda bien (suponiendo un material bien seteado).
Si todavia no le encontras la "vida" a tus textures quizas (mejor dicho casi seguro) no tengas que levantar el amb light para conseguir algo en un material, no tiene sentido eso, lo que podes hacer luego es ir directamente a los postFX (suponiendo que tus texutras son correctas), modificar bloom , tonemapping, color correction, etc hasta tener lo que quieras, me parece que ahi le erraste en queres obtener un resultado con la herramienta equivocada.
Igor intente poner tu shader pero :
Como lo soluciono?
Shader error in 'Custom/satu': expression left of ."a" is not a struct or array at line 30 (on d3d9)
Como seria tu shader para 3d
gracias