Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





OpenGL. Mal resultado tras usar Scalef o Rotatef

Iniciado por Elelegido, 09 de Abril de 2008, 02:36:53 AM

« anterior - próximo »

Elelegido

Hola de nuevo, tengo un programa que utiliza texturas de 24 bits para recrear un entorno en 2D y todo me va muy bien, hasta que hago que OpenGL trabaje transformando la información de esas texturas.

En esta imagen se ve a la izquierda la escena sin ninguna transformación de ese tipo, y a la derecha con un glScalef(1.3,1.3,1.0) por medio.



Fijaos en el contorno verde que le sale al muñeco por las buenas, y en las lineas del mismo color que salen alrededor de los tiles. Imagino que igual debí haber activado algo antes de renderizar, pero tras investigar por ahí (y por aquí xD) no he encontrado nada.

En mi caso, lo único que activo antes de dibujar la escena es lo siguiente:
   glEnable(GL_TEXTURE_2D);
   glEnable(GL_BLEND);
   glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

Eso es todo, a ver si me ayudais a quitarme de estos berenjenales que me traen frito... Gracias.

Loover

Tiene toda la pinta de que tengas que usar GL_CLAMP para "capar" la textura al borde.

Un saludo!
IndieLib Libreria 2.5d utilizando aceleración por hardware para la programación de juegos 2d.
Indie Rover The monkeys are reading!

Zaelsius

Desactiva el filtrado lineal para evitar el reborde verde del personaje. Creo que era algo como:

glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER , GL_NEAREST );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER , GL_NEAREST );


Y una entrada aleatoria de Google con la diferencia visualmente: http://jerome.jouvie.free.fr/OpenGl/Tutorials/Tutorial6.php

Sobre lo otro.. si, tiene que ver con el "CLAMP". Perrea perrea.. digo.. googlea googlea.

Elelegido

Pues si, parece que era muy elemental :oops:  Le he metido  GL_CLAMP_TO_EDGE y ya está todo en su sitio. Aunque lo del borde verde del muñeco no lo he solucionado, con el filtro GL_NEAREST es verdad que se quita, pero queda bastante mal (sobre todo en movimiento, si fuese epiléptico no habría sobrevivido a ese parpadeo). De todos modos ya se por donde tengo que tirar, seguiré investigando eso de los filtros MIN y MAG...  gracias a ambos :)

[EX3]

No veo la imagen aqui en la oficina (pu** proxi) pero me imagino que la textura tiene un color de fondo que usas como ColorKey. Yo deje de usar colorkey para representar transparencias en imagenes por estos motivos, ya que al dibujar la textura con suavizado de pixeles el colorkey se mezcla inevitablemente con los pixeles del cortorno de la figura de la textura, tal y como muestra el enlace de ZaeLSiuS, por lo que dichos pixeles no coincide con el colorkey y se dibujan dando ese efecto tan guarro. Yo te diria que usaras texturas en formato PNG y aplicaras transparencias por Alpha. En este caso a lo mucho los bordes se te mezclaran con los pixeles de la escena dando un efecto algo mas agradable, en algunos casos similar al antialiasing, pero sera menos apreciable que el efecto de fusion del colorkey con los pixeles del contorno.

Si decides seguir usando colorkey tendras que desactivar el suavizado de pixeles con el correspondiente efecto pixelado al rotar y escalar.

Salu2...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

Tei

para un juego con estilo  pixel art creo que hay que usar GL_NEAREST, como han dicho por ahi, o sufriremos una difuminacion de los detalles, que es mortal para el pixel art.

Prompt

Sin duda, conservar el pixel art, GL_NEAREST creo que debería ser tu mejor opción.

No se como cuanto de importante es para ti, aumentar la imagen y que esté difuminada pero, lo mismo consigues un buen efecto configurando bien el modo de renderizar.

Un saludo, ya nos contarás.

tamat

Cita de: "Elelegido"(sobre todo en movimiento, si fuese epiléptico no habría sobrevivido a ese parpadeo)

Parpadeo? eso no tiene nada que ver con texturas, los parpadeos se deben mas a temas como Z-fighting, usas depth test? Sino no me cuadra.
Por un stratos menos tenso

[EX3]

Por parpadeo supongo que se referira a que segun el nivel de transformacion que le este aplicando a la textura mostrara mas o menos reborde verde al fusionarse los pixeles del contorno con los del colorkey, de ahi que de sensacion de parpadeo y mas si estamos hablando de graficos pixelados donde canta mas el asunto.

Salu2...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

Elelegido

Me refería a que por ejemplo usando un escalado en la escena del 0.8 (constante), cuando hay movimiento no me paran de oscilar bruscamente de color algunos pixeles del interior del muñeco (no en los bordes, que si me parecería razonable). Aquí se puede ver claramente:



Para evitar un poco esto, he decidido cambiar de resolución. Antes trabajaba con 320x240, y ahora trabajo a 640x240 (simplemente he escalado todo al doble) que tal y como suponía disimula un poco ese oscilamiento que crea el filtro. No obstante, se nota un leve tembleque que es bastante molesto. Me parece raro que una misma textura, aplicándosele las mismas transformaciones y sin que su contexto cambie (osea, sin que haya ninguna textura encima) salvo los bordes, de como resultado una imagen donde sus pixeles internos (aquellos que no están en los bordes) son variables según la posición de la pantalla en la que se encuentre...

[EX3] No sabía que usando la transparencia del PNG se evitaba esto, precisamente yo uso PNG a los que previamente le meto un ColorKey con SDL, me va a venir bien ahorrarme ese paso. De todos modos, es cierto que no creo que me favorezca el efecto de difuminado a mis sprites. Si no fuese por ese tembleque que contaba antes, con GL_NEAREST estaría encantado.

PD: No uso depth test.

Prompt

Scalas el poligono ( cuadrado por 2 triangulos ) y la textura que tenga aplicada, pero es posible que al interpolar entre frames pase algo extraño.

Está el mucho quieto y sin animación cuando parpadea?

Un saludo.

Tei

CitarOpenGL. Mal resultado tras usar Scalef o Rotatef

¿Quiere esto decir (el titulo del hilo) que estos problemas te aparecieron justo despues de empezar a hacer rotaciones y escalados?

Elelegido

Cita de: "Prompt"Scalas el poligono ( cuadrado por 2 triangulos ) y la textura que tenga aplicada, pero es posible que al interpolar entre frames pase algo extraño.

Está el mucho quieto y sin animación cuando parpadea?

Un saludo.

No tiene animación, pero tampoco está quieto. Ocurre cuando se mueve ese sprite.

Y si, me ocurre cuando hago alguna rotación o escalado, aunque supongo que pasará con todo lo que altere de algún modo la imagen de la textura. Con translate y cosas así no sucede.

Estoy por subir una "demo" donde se vea el tembleque xD.

tamat

creo que deberias enterarte mejor de lo que es el MAG_FILTER y el MIN_FILTER.

Primero tenias problemas con el MAG_FILTER y lo pusiste a NEAR, de ese modo cuando el sprite ocupa en pantalla más espacio que pixeles tiene la textura lo que hace es coger el pixel más cercano, evitando difuminados que matan el pixel art.

Pero el MIN_FILTER es para el caso contrario, cuando el area donde se va a representar el sprite sea más pequeño que la textura, en tal caso coge los pixeles que más cerca quedan, pero se produce ese efecto de parpadeo ya que nada te garantiza que cada vez coja el mismo pixel.

Para evitar eso deberias actiar el MIN_FILTER para que use los mipmaps, es decir, versiones de menor resolucion de la imagen en las que se ha hecho un promedio. Prueba con GL_LINEAR_MIPMAP_LINEAR
Por un stratos menos tenso

Prompt

Por ahi iba yo tamat :)

Si cambia nada más cuando mueves el sprite, como dice tamat, no te asegura que vaya a coger los mismos pixeles siempre y el "mezclado" por el escalado y tal sean los mismos. Por lo cual parpadea.

Ya nos contarás. Saludooooooooooooos...






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.