Jump to content
UnitySpain

Search the Community

Showing results for tags 'shader'.



More search options

  • Search By Tags

    Type tags separated by commas.
  • Search By Author

Content Type


Forums

  • Inicio
    • Proyectos
    • Offtopic
    • Unity Feeds
    • Website
  • Mesa de ayuda
    • Unity
    • Arte
    • Otras Especialidades
    • Builds & Dispositivos
  • Aportes de la Comunidad
    • Recursos
    • Eventos
    • Buenas Prácticas
  • Bolsa de trabajo & Colaboraciones
    • Ofertas y Demandas
  • Post Antiguos
    • General (Antiguo)

Blogs

  • byGui
  • El Blog de Pioj

Find results in...

Find results that contain...


Date Created

  • Start

    End


Last Updated

  • Start

    End


Filter by number of...

Joined

  • Start

    End


Group


Especialidad

Found 12 results

  1. Hola a todos, mi nombre es David y este es el primero de una serie de tutoriales sobre Unity3D. Esta iniciativa surge del programa Unity Student Ambassador y están creados por mi inicialmente para workshops presenciales. Los he adaptado a este formato pero si tienes cualquier duda no dudes en preguntarme. Espero que os guste. Introducción ¿Que es Shader Graph? La creación de shaders en Unity ha sido tradicionalmente el terreno de juego de personas con habilidades para programar. Shader Graph abre el campo para artistas y otros miembros del equipo para que la creación de shaders sea mucho más sencilla. Solo conecta nodos en una red gráfica y podrás ver los cambios al instante. Requisitos El Shader Graph está disponible desde Unity 2018.1. Está diseñado para funcionar con otra característica de Unity 2018.1: Scriptable Render Pipeline (SRP). Por lo tanto, no puede usarlo con el Built-In Unity Renderer. Tiene por tanto soporte tanto para LWRP como para HDRP (o para su propio SRP). Para este tutorial usaré la versión 2019.2.9f1. ¡Comencemos! Lo primero que necesitamos es abrir Unity y crear un nuevo proyecto. Asegúrese de que elige usar el nuevo SRP. En nuestro caso elegiremos el LWRP. Confirmamos y esperamos que Unity lo prepare todo. Una vez dentro de Unity ya podemos ponernos a trabajar. Por defecto debería tener incluido el paquete Shader Graph. Puedes comprobar ese y otros paquetes instalados en Windows/Package Manager. Nuestro primer Shader En la ventana Project, pulsamos el botón y elegimos Create/Shader/PBR Graph. Si queréis conocer más acerca del PBR está es una buena guía: https://blog.teamtreehouse.com/beginners-guide-physically-based-rendering-unity Nombramos el archivo con el nombre que queráis. En este caso le llamaremos Standard_Color. Ya tendríamos nuestro primer Shader creado, vamos abrirlo. Lo seleccionamos y en la ventana Inspector pulsamos Open Shader Editor. Si todo ha ido bien, deberíamos ver esto: Dentro del Shader Editor podemos ver tres sectores claramente diferenciados: PBR Master Node: Es el nodo principal, al que acaban llegando todos los demás. Es el encargado de mostrar las características en el material. BlackBoard: Puedes activarlo y desactivarlo arriba a la derecha. Es donde creas y guardas las propiedades que necesitas usar. Encontrarás Colores, Vectores, Texturas etc… Estas pueden aparecer en el inspector del material para ser usadas más adelante. Preview: Es la previsualización actual de la entrada del PBR Master Node. Puedes cambiar el tipo de renderización pulsando el botón derecho. (Cubo, quad,sphere…) Una vez conocemos las partes vamos a añadirle funcionalidad a nuestro nuevo Shader. Comencemos añadiendo color. Vamos a abrir el Blackboard y vamos a pulsar en el +. Con esto podremos crear una variable de entre las que Shader Graph nos ofrece. En este caso elegiremos Color. Ahora podremos cambiarle el nombre, pero en nuestro caso lo dejaremos tal y como está, con el nombre Color, que al fin y al cabo es lo que será para nosotros. El toggle de Exposed indica si quieres que esa variable aparezca posteriormente en el material para ser editada de forma rápida. En nuestro caso así lo queremos así que la dejamos marcada. En Default puedes elegir el color que desees por defecto, como he dicho podrás cambiarlo después en el material pero si quieres ver como queda en el Shader Editor tendrás que cambiarlo aquí. Por último el Mode te permite establecer el color como HDR. Puedes hacer efectos realmente atractivos con esto pero de momento lo dejaremos como está. Una vez creado nuestro Color vamos a arrastrarlo hacia el Grid donde esta el PBR Master y lo soltamos. Como vemos este nodo Color solo tiene una salida, conectamos la salida con la entrada de Albedo. Si habías cambiado el color default verás que la Preview ahora aparece de otro color. Sino puedes ir ahora y cambiarlo. Una vez hecho esto pulsamos arriba a la izquierda en Save Asset y podemos cerrar el editor. Ahora solo nos falta ver nuestro shader en pantalla. Para esto añadimos una esfera a la escena y creamos un nuevo material. Le pondremos de nombre Standard_Color_MAT, por ejemplo. Una vez creado el material, lo seleccionamos y en el desplegable del Shader elegimos ShaderGraph/Standard_Color o como llamases a tu Shader. Arrastramos nuestro nuevo material y lo soltamos encima de la esfera y … Ahora podemos cambiar cambiar desde el Material el Color, ya que anteriormente lo activamos. Nodos importantes Antes de continuar el tutorial voy a explicar algunos de los nodos más usados ya que los vamos a usar más adelante. Me dejo muchos pero para esta introducción son suficientes: Math Basic: Son las operaciones matemáticas más comunes. Suma, División, Multiplicación, Resta … UV: Son nodos que actúan sobre las coordenadas de uv. Podemos rotarlas, moverlas y darle algunos efectos como el Twirl o Spherize. Veremos un ejemplo más adelante. Shapes: Son texturas generadas proceduralmente dentro del editor. Podemos crear círculos, rectángulos, polígonos etc… One Minus: es simplemente la operación 1 - x. Es muy útil como veremos más tarde, tanto que tiene su propio nodo. Noise: es un nodo generador de ruido. Veremos también su uso más adelante. Step: es un nodo que dado un valor entre 0 y 1, compara la entrada con ese valor y devuelve 0 si es menor y 1 si es mayor. Por ejemplo: si nuestro valor es 0.4, todos los valores por encima que entren en el nodo, serán convertidos a 1 y todos los inferiores serán 0. Dot: es un nodo que calcula el Producto Escalar entre vectores. Devuelve 1 si apuntan exactamente en la misma dirección, -1 si apuntan en direcciones completamente opuestas y 0 si los vectores son perpendiculares. Lerp: es un nodo que devuelve el resultado de la interpolación lineal entre las dos entradas en función de la entrada T. El valor de la entrada T está sujeto al rango de 0 a 1. Por ejemplo, cuando el valor de la entrada T es 0, el valor de retorno es igual al valor de la entrada A , cuando es 1, el valor de retorno es igual al valor de la entrada B y cuando es 0.5, el valor de retorno es el punto medio de la dos entradas A y B . Dissolve Shader Una vez conocemos los nodos más importantes, vamos a hacer un Shader algo más complejo que el anterior. Vamos a crear un efecto que disuelva el objeto haciendo que desaparezca y aparezca a nuestro gusto: Para esto volvemos a crear un nuevo Shader y le ponemos de nombre Dissolve. Lo abrimos y seleccionando el PBR Master pulsamos en el icono del engranaje. Aquí vamos a encontrar algunos ajustes interesantes como si el objeto es Opaco o Transparente. En este caso lo dejaremos como está (Opaque) y lo único que marcaremos será el Two Sided. Esto hará que el objeto pinte también sus caras internas, lo que conlleva eso sí, un coste extra. Tenlo en cuenta en el futuro, en este caso para el Cubo en cuestión, nos interesa que las caras internas también se vean cuando está disolviendo. Una vez marcado, vamos a crear algunas variables que usaremos. En primer lugar necesitaremos un valor comprendido entre 0 y 1 que se encargue de llevar el progreso disuelto. Será 0 cuando el objeto se vea por completo y 1 cuando esté completamente disuelto. Para eso en el BlackBoard crearemos un Vector1(que no es más que un simple número) y lo nombraremos como Dissolve Value por ejemplo. Para facilitarnos el trabajo, podemos cambiar el tipo de número con Mode. En nuestro caso está comprendido entre 0 y 1 por lo que elegiremos Slider y rellenaremos el min y el max con esos valores. A su vez, necesitaremos también un Color para el objeto, como en nuestro anterior Shader y un Color diferente para la parte que se esté disolviendo. Creamos ambas variables, estableciendo el Color para disolver cómo HDR si quieres que brille como el del gif (necesitarás también tener el paquete de post procesos y activar el Bloom). Por último necesitaremos un valor que indique el grosor que tendrá el dissolve. Podemos revisar el Gif para ver el grosor que tiene la parte que se está disolviendo. Creadas todas las variables en mi caso quedó así: Para el efecto de disolver necesitamos en primer lugar una textura que genere ruido donde las zonas negras indiquen lo que llevamos disuelto y las zonas blancas lo que nos queda por disolver. Por suerte, como vimos antes, tenemos un nodo de ruido perfecto para este uso: Simple Noise, asique lo añadimos. Podemos cambiar el valor de Scale del nodo a nuestro gusto. Cuanto menor sea el valor más “zoom” hará el ruido. También vamos a necesitar el nodo Step que si tenías dudas de su uso, en este caso lo vas a entender perfectamente. Ahora unimos la salida de Simple Noise a la entrada Edge del Step. Ahora podemos cambiar el valor del Step entre 0 y 1 para ver su utilidad real. Los valores de ruido que estén por debajo de ese valor devolverán 0 y los que estén por encima devolverán 1. Es decir cuando el Step sea 0 el objeto no se verá y cuando sea 1 se verá completamente. Justo lo que queremos que ocurra. Simplemente conectamos nuestra variable DissolveValue a la entrada In del Step. Para hacer pruebas vamos a colocar la salida del Step en el Albedo del PBR Master. Vamos a guardar y vamos a Añadir un cubo a nuestra escena. Crearemos un material con nuestro shader y se lo colocaremos al cubo. En nuestro material podremos cambiar el valor del DissolveValue. Como vemos el efecto se acerca a lo que buscamos, aunque tenemos dos problemas. Primero no se está disolviendo realmente ya que está pasando de negro a blanco simplemente. Y segundo que el efecto está al contrario, cuando el DissolveValue vale 0 debería verse el objeto completo y cuando está a 1 indica que el objeto está completamente disuelto. Vamos a volver a abrir el Shader Editor para solucionar ambas cosas. Primero vamos a hacer que la parte negra se convierta en transparente. Para ello simplemente tienes que conectar la salida del Step con el Alpha del PBR Master. También tendrás que activar el AlphaClip. Aunque el valor que entra por defecto es 1 tendrás que ponerle tu el valor a través de un nodo. Simplemente crea un nodo Integer (que es un número sin decimal) y conectalo a AlphaClip. Para el segundo problema simplemente usaremos el nodo que comentamos anteriormente. OneMinus. Si a 1 le restamos el DissolveValue obtendremos la parte contraria, que es justo lo que necesitamos. Si guardamos y probamos comprobamos nuestro material ahora podemos ver que funciona como queriamos. Se disuelve de blanco a negro con el ruido que creamos. Solo nos falta añadirle color. Para ello volvemos al editor. Necesitamos pintar el borde que se disuelve y a raíz de ahí lo que tengamos a un lado del borde lo borramos y lo demás lo pintamos del color normal. Una forma de encontrar el borde es sumar el DissolveValue y el borde y restar por un lado el Step de la suma y por otro el Step del DissolveValue solo. Es más fácil de entender con una imagen (para que sea más visual he cambiado el valor default del Dissolve Value a 0.5): Como vemos ahora tenemos el borde diferenciado, pero no lo estamos usando. Lo que vamos a hacer es pintar con los colores que creamos al principio. Una buena forma de hacerlo es usar Lerp. Podemos hacer que si la resta es 1(blanco) se coloree con el Color del Borde y si es 0(negro) el color sea el normal. Y esa salida del Lerp la conectamos a Albedo. Ahora podemos guardar y probar el shader. Si todo ha ido bien debería funcionar como esperábamos. Puedes cambiar a tu gusto los valores del material, como los colores o el borde. Si eres perfeccionista te darás cuenta de que si el borde es muy grande, pueden quedar algunos restos al disolverse. Esto podemos arreglarlo con un simple cambio. Sumando el valor del borde al dissolve antes de hacer el OneMinus. También podrías crear una variable para el Scale del Simple Noise. Así tendrías un valor más que podrías modificar desde fuera sin tener que cambiar el shader. Por último vamos a añadir una textura que se añada al color, así lo podremos usar en más objetos. Simplemente crea una variable de tipo Texture2D y arrastrala al grid con los demás nodos. Tendrás que sacar un nodo llamado Sample Texture 2D y arrastrar la textura a la entrada correspondiente. Luego solo queda multiplicar por el color normal y sustituirlo en la entrada A del Lerp anterior. Guardamos y desde el inspector del material añadimos la textura que queramos y habríamos terminado. No es la única forma de hacer este efecto, hay muchas otras, esta es la forma que yo usé. Espero que os sea útil. Cualquier duda que tengáis hacérmela saber y estaré encantado de ayudaros. Nos vemos en el siguiente.
  2. Hace unas semanas que hice este shader que quise compartir gratuitamente en la Asset Store. Me lo han declinado un par de veces y como es muy tedioso el proceso de subir algo a la asset store me doy por vencido. La intención que tenía publicando este shader es recibir algo de feedback y crítica. El shader en cuestión está bastante completo: tiene una textura principal (prescindible) y un color que le pueden multiplicar; una textura foam para simular la espuma(también prescindible); dos slider para elegir la dirección y velocidad a la que se mueve la textura; un shoreline que le puedes cambiar la profundidad a lo pinta y la intensidad del gradiente; y, como no, frecuencia, velocidad y amplitud de la ola. https://github.com/RubioDeLimon/Toon-Water Podéis dejarme vuestras opiniones y preguntas por aquí o por el vídeo de youtube.
  3. Hola! Me gustaría implementar algo similar a esta aplicación para Android quieres e está hecha con Unity: https://play.google.com/store/apps/details?id=com.StormhiveGames.FlowPlay He estado leyendo sobre como hacerlo, pero no lo tengo aún muy claro porque no he encontrado mucha información, solo que se usan Shaders. También he leido que hay ciertos problemas al intentar usar Shaders con Android. He mirado en la Asset Store y h e encontrado el paquete Cocuy pero según he leido en foros no es compatible con todas las versiones de Android. Alguien podría ayudarme y guiarme un poco sobre el tema? Muchas gracias de antemano!! :D
  4. Hola, se que en este grupo la mayoria no programa en Shaders, pero bueno a ver si un alma que si programe en shaders lo pueda ver y ayudarme. No encuentro el error mas que me dice que todas las salidas del sombreador pero eso no lo entiendo aca el codigo: Shader "Unlit/ShaderPracticles" { Properties { _ColorPrimario("color",Color) = (1,1,1,1) _ColorEmission("Color",Color) = (1,1,1,1) _EmissionIntensity("value",Range(0,1)) = 0.0 _DiffuseIntesity("Value",Range(0,5)) = 0.0 _MainText("Texture",2D) = "white" {} } SubShader { Tags { "LightMode"="ForwardBase" } LOD 100 Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" fixed4 _ColorPrimario; fixed4 _ColorEmission; fixed4 _LightColor0; half _EmissionIntensity; half _DiffuseIntesity; sampler2D _MainText; fixed4 _MainText_ST; struct v2f { float4 vertex : SV_POSITION ; float2 uv : TEXCOORD0; float4 color : COLOR; }; v2f vert ( appdata_base v) { v2f o; fixed3 normals = normalize(mul(v.normal,(fixed3x3)unity_WorldToObject)); fixed3 lightDir = normalize(_WorldSpaceLightPos0.xyz); half NdotL = max(0.0,dot(normals,lightDir)); fixed4 diff = NdotL * _ColorPrimario * _LightColor0; o.color = diff; o.uv = TRANSFORM_TEX(v.texcoord,_MainText); return o; } fixed4 frag (v2f i) : SV_Target { fixed3 c = _ColorEmission.rgb * _EmissionIntensity; i.color.rgb = c; return i.color; } ENDCG } } } Y mi error es: Output variable vert contains a system-interpreted value (SV_POSITION) which must be written in every execution path of the shader. Unconditional initialization may help. at line 41 (on d3d11). Nunca entendí este error, aunque si he pasado horas tratando de arreglarlo. Disculpen nuevamente se que acá la mayoria programa es en c#. Pero el desespero abunda en mi jajajaja. Ah, no ya lo solucione, disculpen. Para quienes tengan este problema en verdad es de muy novatos jajajaja (como yo al parecer). Hay que enviar las coordenadas de salidas a las del clip pos osea: v2f vert( appdata_base v) { v2f o; fixed3 normals = normalize(mul(v.normal,(fixed3x3)unity_WorldToObject)); fixed3 lightDir = normalize(_WorldSpaceLightPos0.xyz); half NdotL = max(0.0,dot(normals,lightDir)); fixed4 diff = NdotL * _ColorPrimario * _LightColor0; o.vertex = UnityObjectToClipPos(v.vertex); <- Miren, hay que hacer esto o.color = diff; o.uv = TRANSFORM_TEX(v.texcoord,_MainText); return o; }
  5. Hola, queria comentarles de este genial asset, hace poco me cruce con esta maravilla, basicamente es un shader (+ mallas + materiales + prefabs ...) que mapea una textura pero basandose en coordenadas globales, es decir que de arriba a abajo (idem para otras direcciones) proyectara una textura determinada manteniendo sus dimensiones, sin importar la mesh donde lo haga ni sus UV's (la mesh que tenga el shader). Es muy bueno para hacer assets variados partiendo de un solo mesh, para terrenos por ejemplo, o incluso un terreno entero. Trae varios parametros como el blend entre distintas direcciones, LOD, glossines, specular power, etc .... Aca un intento para demostrarlo: Mesh original (Prefab): Mesh duplicadas (en un intento de Cueva): El proceso es mas divertido ya que nunca , o por lo menos es poco probable que vayan a quedar incoherencias entre distintos materiales. Como desventaja es que usar demasiados de estos materiales cuesta mas. Aca dejo el asset por si alguien lo quiere bajar: https://www.assetstore.unity3d.com/en/#!/content/33428
  6. Buenas de nuevo a todos. Continuo trabajando en un shooter multijugador y me he visto un poco parado por el tema de Shaders. Tenía la intención de hacer un shader para que cuando pulsaras una habilidad pudieras ver a todos los enemigos al estilo de widomaker en el overwatch. He buscado por la web y me he encontrado con esto. http://wiki.unity3d.com/index.php/Silhouette-Outlined_Diffuse. Esta bastante bien y quería entenderlo por lo que me mire unos cuantos tutoriales para hacerme al lenguaje y la forma de implementación. Me he encontrado con el problema de que mi personaje esta formado por diversas partes por lo que se ve extraño: ZTest Always Ztest LEqual Estas dos lineas en el código se que manejan la visualización del shader. Las he ido modificando para que se viera como yo quiero, que seria: Que se viera la silueta del modelo como uno (Quizá para eso haya que modificar algo más del código) y que a través de los objetos se viera solo la silueta. Editado: He continuado haciendo pruebas y adjunto otra captura de otro problema de utilizar el ZTest para anteponer el objeto a otros. Realmente yo solo quiero que la silueta se vea si el personaje enemigo esta detras de una pared para poder detectarlo: Me sería muy útil si alguna persona pudiera orientarme un poco. Gracias de antemano.
  7. Hola a todos queria presentarles un tutorial que hice un poco rapido acerca de como crear espejos en Unity no se necesita saber programación ni es nada dificil pueden echarle un vistazo, si desean y de paso se pasan por el canal se suscriben y ven el otro video que tengo. :)
  8. Alguien me puede decir qué sucede con este shader? Adjunto una foto de Fable donde se dibuja una línea sobre el contorno del enemigo. Quisiera lograr el mismo efecto, pero a través de mi personaje se sale ese efecto. Por favor ayuda.
  9. Buenas noches. Quiero animar una bandera y queria saber si es mejor (en terminos de prestacion) una bandera con el Cloth de Unity o un shader que mueva los vertices aplicado a ella.Gracias. P.D: De hecho creo que son lo mismo pero en caso de duda...
  10. Guest

    Problema con shader

    Hola comunidad !! Quisiera saber como puedo hacer que la desintegracion de mi shader se mueva con respecto a la textura. Tengo esa duda desde hace 2 dias y aun no puedo solucionarlo. Aqui les posteo el codigo y si me pueden hechar una mano les estaria super agradecido. Desde ya muchas gracias ! Shader "Custom/Holograma" { Properties { _Color ("Color", Color) = (1,1,1,1) _MainTex ("Albedo (RGB)", 2D) = "white" {} _ScrollXSpeed ("X Scroll Speed", Range (0, 10)) = 2 _ScrollYSpeed ("Y Scroll Speed", Range (0,10)) = 2 _SliceGuide ("Slice Guide (RGB)", 2D) = "white" {} _SliceAmount ("Slice Amount", Range(0.0, 1.0)) = 0.5 } SubShader { Tags { "RenderType"="Opaque" } LOD 200 CGPROGRAM #pragma surface surf Standard fullforwardshadows #pragma target 4.0 sampler2D _MainTex; float _ScrollXSpeed; float _ScrollYSpeed; struct Input { float2 uv_MainTex; float2 uv_SliceGuide; float _SliceAmount; }; sampler2D _SliceGuide; float _SliceAmount; float4 _Color; void surf (Input IN, inout SurfaceOutputStandard o) { float2 scrolledUV = IN.uv_MainTex; float xScrollValue = _ScrollXSpeed * _Time; float yScrollValue = _ScrollYSpeed * _Time; scrolledUV += float2 (xScrollValue,yScrollValue); clip(tex2D (_SliceGuide, IN.uv_SliceGuide).rgb - _SliceAmount); fixed4 c = tex2D (_MainTex, fixed2 (scrolledUV )) * _Color; o.Albedo = c.rgb; o.Alpha = c.a; } ENDCG } FallBack "Diffuse" }
  11. Guest

    Problemas con shaders

    Hola comunidad !! Quisiera saber como puedo hacer que la desintegracion de mi shader se mueva con respecto a la textura. Tengo esa duda desde hace 2 dias y aun no puedo solucionarlo. Aqui les posteo el codigo y si me pueden hechar una mano les estaria super agradecido. Desde ya muchas gracias ! Shader "Custom/Holograma" { Properties { _Color ("Color", Color) = (1,1,1,1) _MainTex ("Albedo (RGB)", 2D) = "white" {} _ScrollXSpeed ("X Scroll Speed", Range (, 10)) = 2 _ScrollYSpeed ("Y Scroll Speed", Range (,10)) = 2 _SliceGuide ("Slice Guide (RGB)", 2D) = "white" {} _SliceAmount ("Slice Amount", Range(0.0, 1.0)) = 0.5 } SubShader { Tags { "RenderType"="Opaque" } LOD 200 CGPROGRAM #pragma surface surf Standard fullforwardshadows #pragma target 4.0 sampler2D _MainTex; float _ScrollXSpeed; float _ScrollYSpeed; struct Input { float2 uv_MainTex; float2 uv_SliceGuide; float _SliceAmount; }; sampler2D _SliceGuide; float _SliceAmount; float4 _Color; void surf (Input IN, inout SurfaceOutputStandard o) { float2 scrolledUV = IN.uv_MainTex; float xScrollValue = _ScrollXSpeed * _Time; float yScrollValue = _ScrollYSpeed * _Time; scrolledUV += float2 (xScrollValue,yScrollValue); clip(tex2D (_SliceGuide, IN.uv_SliceGuide).rgb - _SliceAmount); fixed4 c = tex2D (_MainTex, fixed2 (scrolledUV )) * _Color; o.Albedo = c.rgb; o.Alpha = c.a; } ENDCG } FallBack "Diffuse" }
  12. Hola a todos, de seguro que es una tontería pero no he podido usar el espejo de unity correctamente Tengo un shader y un script que he encontrado aquí "Espejo 4" pero resulta que la reflexión sucede en el eje "Y" es decir solo hacia arriba si quiero un espejo en mi baño, no funka... la idea que he tenido es añadir algo al script o al shader (la verdad no se si toque modificar los dos) para dejar como variable accesible en el editor el eje en el que se producirá la reflexión, algo como un "Flip Edjes" , no se, pero necesito ayuda con esto, y pues de paso me parece que esta seria la mejor manera de ayudar a todos los que desearan usarlo luego, de ahí lo de dejarlo en variables. agradezco de antemano toda su ayuda,
×
×
  • Create New...