estoy buscando informacion acerca de como hacer un shader de agua que deforme levemente la vision, me he bajado los ejemplos "wave" de la pagina de yoyo pero estoy bastante perdido, ¿alguien sabe donde encontrar tutoriales paso a paso para emepezar a meterle mano a los shaders? esta nueva opcion se ve poderosisima pero parece que tiene otro lenguaje diferente
Así es, para shaders hay varios lenguajes, YoYo se decidió por darle soporte al lenguaje GLSL ES. Anduve buscando y hay poco material para el novato que quiere aprender a manejar los shaders en GLSL ES. Me refiero no sólo a pegar líneas de código de un ejemplo y modificar algunos parámetros, sino a entender aspectos teóricos y fundamentos de los shaders. Incluso en los foros de YoYo los usuarios decían que había poca información para los principiantes, los que tienen experiencia con Shaders y hacen ejemplos, ya tienen experiencia con otros lenguajes de programación en otras plataformas. Ahora, en español, todavía es más difícil (o al menos yo tuve poco éxito) encontrar tutoriales para principiantes, específicamente hablando de GLSL en GM:S
Al igual que tú, andaba perdido, así que me puse a recolectar info y me decidí a realizar un tuto en español como introducción a los shaders, el cual estará listo en una o dos semanas. Pero creo que no resistirás tanto tiempo... XD
En GM, al abrir el shader, hay dos pestañas, vertex y fragment. No he visto ese efecto wave al que te refieres, pero probablemente la distorsión "de agua" basa en manipular el seno y coseno aplicados a coordenadas de la textura, ahí donde veas "sin" y "cos" puedes mover los parámetros para ajustar el efecto.
YoYo tiene un "tech blog" ahí tienen una "supuesta introducción" a los Shaders, la cual a mi me dejó bastantes dudas, por eso me puse a armar el tutorial, pero a lo mejor te sirve de algo.
http://www.yoyogames.com/tech_blog/20 (http://www.yoyogames.com/tech_blog/20)
eres un makina, esperare a ver ese tutorial antes de liarla por mi cuenta y le ire echando un ojo a ese link de yoyo que no veas si le tengo ganas a esos shaders
*pongo los links de los ejemplos que he encontrado:
http://gmc.yoyogames.com/index.php?showtopic=586380
http://gmc.yoyogames.com/index.php?showtopic=592688
CitarYoYo se decidió por darle soporte al lenguaje GLSL ES
¿pero no lo hace mas lento al juego? en minecraft, para sacar capturas artisticas se utiliza un mod que incorpora GlSL
al juego.Te aseguro que al probarlo me bajo 70 FPS en una pc decente.
¿en gm pasa lo mismo?
Cita de: ivn_eze en Enero 26, 2014, 04:34:19 AM
¿pero no lo hace mas lento al juego?
Creo que tendrías que hacer un enredo y caos con shaders para que se hiciera lento. No sé cómo funcione en otras plataformas, pero los shaders están diseñados para ejecutarse directamente en la tarjeta gráfica de la PC, por lo que un uso normal o hasta medio intenso no debería afectar el desempeño general.
Ignoro qué pasa con las PCs que tengan video integrado, no sé si ahí el rendimiento sí se vea afectado (o no) por el uso de shaders.
una cosa que no me queda clara, por lo que veo las shaders redibujan los sprites... se podria usar para afectar(una deformacion de varias ondas senoidales por ej) todo lo que salga en pantalla (o quede detras del objeto agua), o hay que redibujar todos los objetos en la shader uno a uno?
Sabía que no resistirías XD
Lo que preguntas no lo había probado, así que no sabía qué pasaba. Usé el shader de onda que pusiste en uno de los mensajes anteriores. Sin estar 100% seguro (puede que haya otro método que funcione) lo que me sucedió al querer dibujar más de una instancia con una sola llamada a un shader desde un solo objeto es que se presentan problemas en el dibujo, por lo que yo diría que no es recomendable.
Para activar un shader, usas shader_set(mi_shader). Pero aunque se usen shaders, las leyes gamemakerianas siguen aplicando, es decir, usa el evento draw como dictan los cánones.
- Lo que dibujas primero, queda por debajo de lo que dibujas después.
- Puedes dibujar el sprite asociado a esta instancia (usando draw_self())
-Puedes dibujar fondos o tiles, ya que los fondos no son propiedad exclusiva de un objeto, sino que pertenecen a una habitación y están disponibles para ser manipulados desde cualquier objeto
Luego intenté usar la sentencia With dentro del evento DRAW para "entrar" a otro objeto (llamémosle objeto B) y dibujar un sprite (ya fuera el sprite asociado a la instancia o cualquier otro sprite). En primer lugar, el objeto_B YA se dibujaba a si mismo, cosa que hacen todos los objetos cuando los pones en la habitación y tienen un sprite asociado a ellos. Al usar draw_self(), se volvía a dibujar el sprite del objeto B, con el efecto shader aplicado, y quedaba por debajo del sprite original de B (porque el objeto B tenía una mayor profundidad que el objeto desde donde estaba usando el shader)
El detalle es que lo que dibujaba en la sentencia With quedaba distorsionado, al irse moviendo en onda (según el efecto de shader), no nada más aparecía el sprite del objeto B, también aparecán partes del sprite del objeto desde donde estaba usando el shader. Ocurría algo similar al usar draw_sprite en lugar de draw_self
Estuve leyendo y al parecer es posible usar una textura como máscara dentro del shader, para especificar qué región queda afectada por el efecto. Eso sí, no tengo idea de cómo hacer eso, igual buscando con calma das con la solución (y la compartes por acá)
yo pensaba que se podia aplicar el shader a todo lo que hubiese debajo con un draw view o algo asi, si es tan lioso creo que trae mas cuenta hacerle el efecto al fondo con el vegas y hacerlo con imagenes en lugar de con shaders, eso si, solo afectaria al fondo... mi idea era que el efecto quedara por delante del jugador afectando tambien a este cuando pase por detras de dicho objeto con shader.. pero si hay que redibujarlo todo... total.. la solucion creo que va a ser cargar el fondo en el vegas aplicarle el efecto wave y exportar las imagenes para despues cargarlas como sprites.
Cita de: abramelin en Enero 28, 2014, 09:47:57 PM
yo pensaba que se podia aplicar el shader a todo lo que hubiese debajo con un draw view o algo asi, si es tan lioso creo que trae mas cuenta hacerle el efecto al fondo con el vegas y hacerlo con imagenes en lugar de con shaders, eso si, solo afectaria al fondo... mi idea era que el efecto quedara por delante del jugador afectando tambien a este cuando pase por detras de dicho objeto con shader.. pero si hay que redibujarlo todo... total.. la solucion creo que va a ser cargar el fondo en el vegas aplicarle el efecto wave y exportar las imagenes para despues cargarlas como sprites.
Pero es que imagínate, que por defecto todos los Shaders funcionaran al revés, de manera global para todo lo que estuviera en la vista, todo mundo estaría preguntando lo contrario: como hacer que el shader afectara solo a un objeto, que sería lo más lógico, ya que en GM se trabaja con objetos y se requiere tener el control individual de objetos.
Ahora, si quieres que todo se vea afectado por el shader, se puede, no desesperes. Ahí están las benditas surfaces. Aun no he hecho pruebas, pero leyendo la comunidad de YoYo he dado con esta función
view_surface_id[]
que según entiendo (y peude que me equivoque) enlaza una superficie a una vista 8). Aquí se discute o se dan indicios de cómo aplicar el efecto de una shader a toda la pantalla mediante surfaces.
http://gmc.yoyogames.com/index.php?showtopic=586298 (http://gmc.yoyogames.com/index.php?showtopic=586298)
Pero aun sin shaders se puede hacer. Mira, esto es de GM8.1
ANTES:
(http://sia1.subirimagenes.net/img/2014/01/29/140129021634719720.jpg)
DESPUÉS:
(http://sia1.subirimagenes.net/img/2014/01/29/140129022503859723.gif)
:D :D :D todo con surfaces
no era exactamente a toda la view, sino que la parte de view que quede detras o en colision con el objeto que lleve el shader (que estaria colocado solo donde hubiese agua) se vea afectado por el efecto, de todas formas como estoy muy verde y como todavia no he llegado a los niveles de agua esperare a que termines ese tutorial de shaders y ya empiezo pasito a pasito.