Filtro o Shader para efecto de televisor CRT

Started by Ikki, March 20, 2017, 09:13:06 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Ikki

Para comenzar, saludos a todos los miembros de la comunidad. Soy un novato en el mundo de Bennu y un recién llegado al foro.

Estoy empezando a desarrollar un juego que va a intentar capturar el espíritu del software de las consolas de 16 bits (en especial de SEGA Mega Drive/Genesis). Para ello, deseo conseguir un efecto muy particular y estoy teniendo problemas para conseguirlo; la idea es aplicar un filtro o shader al juego para simular la pantalla de un antiguo televisor CRT, de manera similar a lo que se consigue al aplicar el filtro NTSC de Blargg en los emuladores de consolas clásicas. Estoy utilizando 320x224 como resolución, para luego escalar todo por medio de scale_resolution. ¿Es posible conseguir tal efecto? ¿Se pueden utilizar shaders en Bennu o Pixtudio? De ser así, puede alguien guiarme a un artículo o tutorial con la información de como hacerlo? Si es difícil de lograr, me contentaría con poder aplicar un ligero blur a todo el buffer de video y luego dibujar scanlines por encima, pero desconozco si es posible procesar dicho buffer antes de que sea puesto en pantalla en Bennu.

Agradecería cualquier tipo de ayuda.
Hadoken!!!

JaViS

Yo lo que hago es bajarme una de estas imagenes con el efecto scanline y adaptarla al tamaño de mi resolucion:


https://www.google.com.ar/search?q=CRT+layer+png&client=ubuntu&espv=2&source=lnms&tbm=isch&sa=X&ved=0ahUKEwjLh-CTgebSAhVKj5AKHVBDBPcQ_AUIBigB&biw=1440&bih=772#tbm=isch&q=CRT+effect+png&*&imgrc=lJpAWW3c0MBo3M:


La uso colocandola como un proceso encima del resto, con un flag = 32. El efecto no es tan bueno como el de un shader, pero queda bien: https://twitter.com/javisarias/status/817430502529495041
Working on Anarkade. A couch multiplayer 2D shooter.

Ikki

Quote from: JaViS on March 20, 2017, 09:24:04 PM
Yo lo que hago es bajarme una de estas imagenes con el efecto scanline y adaptarla al tamaño de mi resolucion:


https://www.google.com.ar/search?q=CRT+layer+png&client=ubuntu&espv=2&source=lnms&tbm=isch&sa=X&ved=0ahUKEwjLh-CTgebSAhVKj5AKHVBDBPcQ_AUIBigB&biw=1440&bih=772#tbm=isch&q=CRT+effect+png&*&imgrc=lJpAWW3c0MBo3M:


La uso colocandola como un proceso encima del resto, con un flag = 32. El efecto no es tan bueno como el de un shader, pero queda bien: https://twitter.com/javisarias/status/817430502529495041

JaViS, la solución que sugieres parece funcionar bastante bien en tu juego. ¿Que resolución utilizas? ¿Escalas la pantalla con scale_resolution? Puede que me equivoque, pero si usas una resolución muy baja (como en mi caso, 320x224), al poner la imagen de scanlines como un proceso va a escalarse y a pixelarse como el resto de los procesos cuando entre en efecto scale_resolution. Lo ideal sería poder estampar un png con los scanlines (que tenga el tamaño especificado en scale_resolution) justo antes del blit final que dibuje el buffer en pantalla. De todas maneras voy a probar tu sugerencia. Se agradece.
Hadoken!!!

JaViS

Estas en lo correcto.


Yo uso dos resoluciones, 640x 360, y 1280x720, y tengo dos imagenes, una para cada resolucion, lo que tienen que intentar es que el tamaño del pixel del efecto de scanline sea el mismo que el del resto del juego. En mi juego eso no se nota mucho de todos modos, porque uso un efecto de zoom, y el tamaño de los pixels varía.
Working on Anarkade. A couch multiplayer 2D shooter.

Ikki

JaViS, muchas gracias por tus respuestas. Voy a seguir buscando en el foro, a ver si doy con una forma de hacerlo. Mi intención es utilizar gráficos para una resolución de 320x224, pero en todo caso podría tener varios conjuntos de gráficos pre-escalados en los fpg y emplear desde el comienzo resoluciones mayores, en lugar de trabajar con una pantalla virtual pequeña para luego ampliarla con scale_resolution. De todas formas, dejo el tema abierto por si surge una solución en algún momento.
Hadoken!!!

JaViS

No entiendo cual es el problema que estas teniendo particularmente.


Si escalas, todos los pixels de la pantalla son escalados, asi que la proporcion del pixel del layer del efecto va a ser la misma que la del juego, no vas a tener un problema ahi
Working on Anarkade. A couch multiplayer 2D shooter.

Ikki

#6
He hecho un par de capturas para que se entienda mejor lo que tengo ganas de hacer.

Primero, éste es el resultado que obtengo al poner los gráficos en pantalla con el filtro, usando:


scale_resolution=08000600;
set_mode(320, 224, 32);




Se puede ver que las scanlines se escalan con el resto de los procesos, y el efecto es un tanto tosco.

La siguente imagen muestra el resultado que me gustaría lograr:



Las scanlines son más sutiles y el ligero difuminado ayuda a esconder el escalado de los pixels de los gráficos en baja resolución.
Hadoken!!!

SplinterGU

Quote from: JaViS on March 22, 2017, 07:31:13 PM
No entiendo cual es el problema que estas teniendo particularmente.


Si escalas, todos los pixels de la pantalla son escalados, asi que la proporcion del pixel del layer del efecto va a ser la misma que la del juego, no vas a tener un problema ahi

lo que dice es que quiere tener el efecto sin que se escale...

Quote from: Ikki on March 23, 2017, 12:05:57 AM
He hecho un par de capturas para que se entienda mejor lo que tengo ganas de hacer.

Primero, éste es el resultado que obtengo al poner los gráficos en pantalla con el filtro, usando:


scale_resolution=08000600;
set_mode(320, 224, 32);




Se puede ver que las scanlines se escalan con el resto de los procesos, y el efecto es un tanto tosco.

La siguente imagen muestra el resultado que me gustaría lograr:



Las scanlines son más sutiles y el ligero difuminado ayuda a esconder el escalado de los pixels de los gráficos en baja resolución.

de todos modos, no deja de verse genial...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Drumpi

Si usas scale_resolution, lo escalas todo, filtro incluido.
Bennu no tiene shaders, no al menos en el sentido clásico de la palabra, es decir, efectos de postrocesado. Puedes modificar el buffer de video antes del volcado a pantalla, pero es la imágen a la resolución que tu has puesto, que luego se manda a la tarjeta de video y allí se agranda, pero no tienes control directo sobre lo que pasa allí (a menos que sepas programar para SDL y crees tu propia librería).

Si quieres que las scanlines sean más pequeñas que el tamaño de los pixels de tu juego, tendrás que escalar manualmente con size todos los gráficos (y modificar las posiciones y velocidades). Un pixel es un pixel, no hay nada más pequeño.
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

Ikki

Quote from: Drumpi on March 27, 2017, 12:25:03 AM
Si usas scale_resolution, lo escalas todo, filtro incluido.
Bennu no tiene shaders, no al menos en el sentido clásico de la palabra, es decir, efectos de postrocesado. Puedes modificar el buffer de video antes del volcado a pantalla, pero es la imágen a la resolución que tu has puesto, que luego se manda a la tarjeta de video y allí se agranda, pero no tienes control directo sobre lo que pasa allí (a menos que sepas programar para SDL y crees tu propia librería).

Si quieres que las scanlines sean más pequeñas que el tamaño de los pixels de tu juego, tendrás que escalar manualmente con size todos los gráficos (y modificar las posiciones y velocidades). Un pixel es un pixel, no hay nada más pequeño.

Gracias por la respuesta, Drumpi. Más adelante voy a intentar hacer algo por el lado de SDL, pero por lo pronto estoy enfocado en dominar un poco mejor Bennu (fui usuario de DIV2 en su momento, pero fue hace mucho tiempo y estoy bastante oxidado).
Hadoken!!!

La momia que fuma

Se me ocurre que en vez de reescalar todo, trabajando a la resolución real deseada, se puede usar un scroll que contenga el juego entero y renderizarlo a un mapa tamaño de la resolución "falsa" del juego. Ese mapa se lo metes a un proceso y lo escalas a tamaño resolución real, y por encima, otro proceso con el efecto CRT también a resolución real.


(De hecho...Me puse a hacer un ejemplo para echar el rato, pero....no consigo que funcione el scroll a mapa...no me acepta los dos parámetros extra de fpg y gráfico de destino. Probé también con un ejemplo de la wiki y otro de Javis que encontré por el foro y nada, que no me quiere los dos parámetros extra (Probé en Pixtudio y tras los mínimos cambiós de sintaxis necesarios ahí si compilan ambos).....No se, se eliminó esta característica? Iluminadme, please xD)

Ikki

Quote from: La momia que fuma on March 28, 2017, 02:34:57 PM
Se me ocurre que en vez de reescalar todo, trabajando a la resolución real deseada, se puede usar un scroll que contenga el juego entero y renderizarlo a un mapa tamaño de la resolución "falsa" del juego. Ese mapa se lo metes a un proceso y lo escalas a tamaño resolución real, y por encima, otro proceso con el efecto CRT también a resolución real.


(De hecho...Me puse a hacer un ejemplo para echar el rato, pero....no consigo que funcione el scroll a mapa...no me acepta los dos parámetros extra de fpg y gráfico de destino. Probé también con un ejemplo de la wiki y otro de Javis que encontré por el foro y nada, que no me quiere los dos parámetros extra (Probé en Pixtudio y tras los mínimos cambiós de sintaxis necesarios ahí si compilan ambos).....No se, se eliminó esta característica? Iluminadme, please xD)

Momia, si podés completar el ejemplo y lo hacés público, sería excelente; si no, igual se agradece la intención.  ;D
Hadoken!!!

La momia que fuma

En cuanto algún buen samaritano del foro me aclare por que puñetas no me acepta los puñeteros parámetros extra de start_scroll para renderizar a mapa (Véase en los ejemplos que enlacé antes...no compilan, protesta por el start_scroll), dalo por hecho, que tengo ganas de probar :D


Es raro, recuerdo haber trasteado con eso en su día sin mayor problema, y por si acaso me aseguré de usar la última versión de Bennu, pero ni por esas... :-\

JaViS

Me parece que le estan dando demasiadas vueltas a algo que es bastante evidente y obvio.


Si queres tener los scanlines a una resolucion mas chica, simplemente haz el juego a la mitad (o menos incluso) de la resolucion del scanline, no hace falta escalar nada por software, simplemente tus graficos deben tener el tamaño (en proporcion a la resolucion) correcta. Es decir, si quieres puedes escalar tus graficos antes de meterlos en los FPG, o simplemente diseñarlos con un tamaño de pixel escalado
Working on Anarkade. A couch multiplayer 2D shooter.

La momia que fuma

Ahí entramos en terreno de gustos....haciéndolo así, los objetos del juego se moverían a mayor resolución de la que aparentan, sin regirse por la "cuadrícula" de pixels que representa gráficamente, cosa que hacen muchos juegos retro, y la verdad queda bien, aspecto de juego "de los de antes" pero con movimiento mas suave aunque pierde un poco de "feeling" retro.


Ahora, si lo que quieres es hacer un juego retro "purista" y escrupulosamente retro esto no vale (o te tienes que preocupar de que se muevan siempre en incrementos de pixel que simulen esa resolución menor, complicándote las cosas).


Javis, igual tú me puedes iluminar en el tema del scroll a mapa...como decía, tu propio ejemplo que enlazo ahí atrás (o el de la wiki) no compila con la última versión....sabes si ha cambiado la sintaxis o algo así? Yo creo que mi solución, una vez montada, es bastante sencilla (trabajar el juego normalmente a baja resolución en un scroll con todos los objetos del juego, renderizar el scroll al mapa de un proceso "pantalla" y ponerlo ampliado con el filtro por encima a resolución real).

(Es que ahora hasta que pueda hacer la prueba yo no me quedo tranquilo jajaja  ;D )