¿Efectos de postprocesado?

Started by Drumpi, July 07, 2016, 11:42:22 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Drumpi

Hola a todos:

Sigo dándole vueltas a un efecto que quiero conseguir y no saco nada en claro.
Vereis, en un nivel del Echo he puesto un fondo de scroll normal detrás del scroll tileado. Hay una parte del nivel 1-4 en la que quiero dar el efecto de que te mueves por el interior de tres torres diferentes, por lo que entre torre y torre quiero que se vea el cielo estrellado que diseñé para el primer nivel, sin que se mueva, pero esto no es posible porque, claro, tengo el scroll normal por detrás.
No puedo usar tres regiones+scrolls diferentes porque el resto del escenario sí necesito un único scroll a toda pantalla por detrás, y por desgracia, el hueco entre las torres no es cuadrado (creo). De serlo, crearía dos regiones intermedias y pondría el fondo que quiero en ambas, pintándola con una Z entre el scroll tileado (para que los tiles tapen las imperfecciones) y el scroll normal.

El caso es que había pensado en que una forma original sería rellenar ese hueco con tiles de un color diferente al resto, verde chillón, por ejemplo, y hacer como en los cromas de televisión, es decir, crear una función de postprocesado: una función que coja la imágen de la pantalla y que donde detecte ese color, pinte la imágen que yo quiero.
Lo que no sé es si eso se puede hacer, acceder al buffer de video justo antes del volcado, y modificarlo, y cómo hacerlo sin que caiga aun más el rendimiento de Wiz.

¿Alguna idea?
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)

SplinterGU

drumpi, probaste con tiles mas grandes? quizas jugando con el tamaño de los tiles tengas mejor rendimiento.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Drumpi

Sí, lo sé. De hecho, en el Echo v1.3 le añadí una mejora que detecta tiles repetidos contiguos y los sustituye por tiles más grandes creados en tiempo de ejecución.
De hecho, como tienes el código, lo puedes ver en src/game/level_play/generic_map.inc con las funciones grupo_tiles_mas_grande, crear_tiles_optimizados y optimice_map, que se llaman desde play_level.inc.
No es perfecto, no está todo lo testeado que debiera, y no optimiza todo lo que podría, pero al menos arañé unos cuantos fps, y las pausas de cambio de tile se redujeron bastante.
Pero no puedo usar tiles más grandes, tendría que ir creando bloques de 3x3 tiles de 16x16 en ejecución y eso podría tirarme abajo el rendimiento por usar funciones PUT, porque los gráficos han de ser sí o sí de 16x16: permite la distancia visible que quiero, con gráficos que se ven bien y un espacio suficiente para que no se haga monotona la exploración. Y a estas alturas, reescalar todo supondría reescribir el 40-50% del código :D

Por eso no te preocupes, tengo fe en el nuevo motor de scroll tileado. No he conseguido de momento los resultados esperados, pero aun me queda bastante debug que llevar a cabo.
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)

Drumpi

¿Entonces no se puede modificar el buffer de video justo antes del volcado a pantalla? ¿O alguna otra idea?
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)

SplinterGU

creo que con dump_type=-1 y restore_type = -1, podes controlarlo vos, pero tenes que incluso hacer el borrado de pantalla, ahora, si siempre habra algo dibujado por el scroll entonces no tienes problema
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Drumpi

A ver, te explico lo que quiero hacer.
Mi idea era crear tiles de color verde, de forma que al estar por delante del scroll de fondo, estos los tapaban y creaban una zona verde. Una vez se hubiera pintado esto en el buffer de video, antes de volcarlo a pantalla, quería sustituir los pixels verdes por los pixels de una imágen fija, igual que se hace en los cromas de televisión, por ejemplo, con la información meteorológica:
http://static.betazeta.com/www.fayerwayer.com/up/2010/02/croma.jpg

No puedo hacer ese efecto con tiles porque la imagen que quiero superponer es estática en pantalla, y todo lo demás se mueve.
Una solución sería renderizarlo todo sobre un mapa, y hacer luego un:
for(cont1 = 0; cont1 < alto_imagen; cont1++)
    for (cont2 = 0; cont2 < ancho_imagen; cont2)
        if (map_get_pixel(0, img_volcado, cont2, cont1) == rgb(0,255,0))
            map_put_pixel(0, img_render, cont2, cont1, map_get_pixel(0, img_estatica, cont2, cont1));
        end
    end
end


Pero sería tres veces más costoso que el código actual, y ya dije que me falta al menos un 20% de rendimiento extra para que funcione en Wiz :S
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)

SplinterGU

tendria que pensarlo... recuerdamelo mas tarde... mandame un mail o un privado, por favor.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Drumpi

Ok, hecho.
De todas formas, me interesa saber si alguien ha hecho algo parecido o sabe cómo podría hacerlo. Si no, pues nada, dejaré la cosa como está.
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)

Fede

Quote from: Drumpi on July 07, 2016, 11:42:22 PM
Hola a todos:

Sigo dándole vueltas a un efecto que quiero conseguir y no saco nada en claro.
Vereis, en un nivel del Echo he puesto un fondo de scroll normal detrás del scroll tileado. Hay una parte del nivel 1-4 en la que quiero dar el efecto de que te mueves por el interior de tres torres diferentes, por lo que entre torre y torre quiero que se vea el cielo estrellado que diseñé para el primer nivel, sin que se mueva, pero esto no es posible porque, claro, tengo el scroll normal por detrás.
No puedo usar tres regiones+scrolls diferentes porque el resto del escenario sí necesito un único scroll a toda pantalla por detrás, y por desgracia, el hueco entre las torres no es cuadrado (creo). De serlo, crearía dos regiones intermedias y pondría el fondo que quiero en ambas, pintándola con una Z entre el scroll tileado (para que los tiles tapen las imperfecciones) y el scroll normal.

El caso es que había pensado en que una forma original sería rellenar ese hueco con tiles de un color diferente al resto, verde chillón, por ejemplo, y hacer como en los cromas de televisión, es decir, crear una función de postprocesado: una función que coja la imágen de la pantalla y que donde detecte ese color, pinte la imágen que yo quiero.
Lo que no sé es si eso se puede hacer, acceder al buffer de video justo antes del volcado, y modificarlo, y cómo hacerlo sin que caiga aun más el rendimiento de Wiz.

¿Alguna idea?

¡Hola Drumpi!

Te respondo, aunque sin mucha idea de lo que quieres y no puedes hacer.

Pero cómo a mi me suele pasar una cosa, que es cuanto comento un problema con un compañero o incluso con un neófito en la materia, me suelen venir posibles soluciones, las cuales me ayudan bastante. A ver si tenemos suerte y te pasa algo parecido. :)

Vamos al lio.

Por lo que entiendo quieres dejar un fondo fijo y no puedes. Pero no entiendo el motivo.

Por lo que he leído, Bennu permite 10 niveles diferentes de scroll y un fondo.

¿Qué pasa con el fondo? ¿No vale porque los scrolls van antes?

Segundo: que te impide poner de fondo uno de los últimos scroll estáticos. O sea, definir un scroll pero que no se mueva. Tendrías igualmente una imagen fija, aunque sacrificando uno de los scrolls.


Todo esto se basa en que los scrolls permiten transparencia, o eso he entendido a leer la biblia de Osk.

Si vuelves a explicar porque no se puede, los mismo sigo diciendo más tonterías. :)

Saludos.
Si quieres ser sabio, aprende a interrogar razonablemente, a escuchar con atención, a responder serenamente y a callar cuando no tengas nada que decir.

SplinterGU

segun entendi es que no usa el scroll, sino un scroll propio tileado, pero por otro lado... creo lo mismo, si es fijo, poner un fondo y listo
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Drumpi

No, la idea es que necesito poner un fondo fijo y un scroll de Bennu, pero el fondo fijo debe verse en unos determinados huecos.

A ver, os pongo el caso que tengo entre manos (pero no os puedo poner imágenes). Imaginaos el Echo, que estais jugando al nivel 1-4. Hay una parte del nivel que son como 3 torres por las que debe subir y bajar. Lo que quiero hacer es que en la parte interior de las torres se vea el fondo de scroll (start_scroll con dos imágenes, moviéndose a la mitad de velocidad que el scroll tileado, y con un scroll[0].ratio=200), pero en el espacio entre torre y torre se vea el cielo estrellado del nivel 1-1 (que es una imágen fija).
El scroll tileado no interviene para nada. Lo que quiero es seleccionar partes de la pantalla en las que quiero que se vean trozos de la imágen fija, a pesar del start_scroll. Es como hacerle agujeros al scroll, no a las imágenes que se usan en el scroll.

Otro ejemplo: tengo una circunferencia en el centro de la pantalla. Fuera de la circunferencia hay un scroll que se mueve constantemente, y dentro hay parte de una imágen. Si movemos el círculo podemos ir viendo el resto de la imágen fija, mientras seguimos viendo ese scroll por la parte exterior, como si fuera una mirilla para ver a través de el scroll.

¿Queda más claro así?
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)

SplinterGU

mmm... si, podrias hacer algo con blend substractivo... podrias hacer un map_block_copy de la parte del fondo que te interese (agujero en la torre) y aplicar un grafico "mascara" con blend substractivo sobre ese recorte, luego crear un proceso que use ese grafico ya enmascarado y superponerlo sobre la ventana de la torre... con eso tendrias un grafico por encima de la torre, sobre el agujero de la ventana, pero con grafico del fondo... simulando que muestra lo que se ve detras... quizas sea un poco complejo de hacer los calculos pero se podria hacer...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Fede

#12
Vale, ya lo he cogido. Se te ha metido en la cabeza agujerear el scroll. :)

Por mi poca experiencia en Bennu, cualquier efecto de procesado de la imagen consume bastantes recursos. Así que huyo de ellos todo lo que puedo.

A ver..., se me han ocurrido un par de ideas:

- Que el scroll de fondo sea otro scroll de tiles sincronizado con el principal.
No podrás hacer cosas como que se vea a través de la ventanas, pero a nivel 'burdo' puedes agujerearlo cuando convenga.

-Modificar el scroll que te molesta  en tiempo real, lo mismo que el scroll de tiles.

Si es un círculo, pues tocaría borrar la zona del círculo.
Pero si es una columna, incluso se pueden tener tiles preparados para borrar al estilo 'niebla', pero en 'dither'. (Siempre pienso en una paleta de máximo 256 colores).

Conforme se acerca la zona, vas añadiendo tiles en dither para borrar.

-Deja de plantearte ideas tan retorcidas. (Esta es de bonus) :D

¿Por qué no tienes varios scrolles de tiles sincronizados que produzcan un efecto parecido o igual de vistoso?

Primer Scroll de tiles: el nivel en sí.
Segundo Scroll de tiles: fondo de pisos, coches destruidos, ruina en general.
tercer Scroll de tiles: niebla.
fondo: estrellas.

Lo sincronizas todo y a volar.

Lo bueno que le veo al mapa de tiles, es que si lo optimizas bastante cambias efectos de cpu por scrolles, que es lo que quiero.

No sé cuantos scrolles podrá admitir la Wiz, pero espero que 3 ó 4. :)
Si quieres ser sabio, aprende a interrogar razonablemente, a escuchar con atención, a responder serenamente y a callar cuando no tengas nada que decir.

Drumpi

Interesante idea, Splinter. Voy a darle una vuelta, porque así de primeras veo que va a consumir bastantes recursos.
Sería genial tener esas imágenes de blend sustractivo, afectando sólo al scroll y no a las imágenes que haya por detrás, así podría poner determinadas partes del scroll en color 0 (transparente) usando tiles especiales que estén entre el scroll tileado y el scroll de fondo, y que se vea el fondo del sistema.

Fede: sí, lo mismo es una idea demasiado retorcida, pero es por ver si se puede hacer, a ver si logro el efecto que quiero. Tengo pensado que si no se puede hacer, dejarlo, o símplelente colocar tiles de color cielo donde no quiera que se vea el scroll de detrás, sin estrellas, luna ni nada.
Hasta donde he visto, con mi motor de scroll tileado anterior, a pesar de los tirones cada cambio de tile (lo que ya se veía en las versiones 1.1 y 1.3), he podido meter tres planos de scroll en sendos scrolles sin que se resienta la Wiz. El problema vino porque los tirones duraban un poco más, y que cuando había más de 4 enemigos vivos, la velocidad empezaba a resentirse. En la parte que digo, el último tercio del nivel 1-4, la velocidad llegaba a bajar al 50% en la negrita, y por eso me puse con el nuevo motor. Cuando acabe las cosas más importantes, haré una prueba con el nuevo scroll, a ver si he ganado suficiente velocidad.
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)