Foros - Stratos

Programadores => Programación gráfica => Mensaje iniciado por: bnl en 23 de Agosto de 2007, 06:51:30 PM

Título: Imagen difuminada en directX
Publicado por: bnl en 23 de Agosto de 2007, 06:51:30 PM
Buenas

Estoy dibujando un fragmento de una imagen usando DirectX y vertices transformados (es en 2D). La imagen me sale difuminada. Se suavizan las transiciones en entre colores.

Si la dibujo mediante un sprite se me dibuja correctamente.

Quiza sea algo relicionado con el antialiased.

¿Sabeis por dondo pueden ir los tiros?
Título: Imagen difuminada en directX
Publicado por: BeRSeRKeR en 23 de Agosto de 2007, 08:43:10 PM
Tal vez sea cosa de mip-mapping. ¿Has probado a no crear niveles de mip-map al crear la textura?.

Saludos.
Título: Imagen difuminada en directX
Publicado por: bnl en 23 de Agosto de 2007, 08:46:48 PM
No se lo que es el mip-mapping, asi que supongo que lo habre puesto al valor por defecto.

La forma en que creo la textura es:
TextureLoader.FromFile(dispositivo, fichero, 0, 0, 0, 0, Format.A8R8G8B8, Pool.Default, Filter.None, Filter.None, colorTransparente)

La textura es la misma tanto al dibujar con vertices transformados como al dibujar como sprites. Y con sprites la imagen se ve bien.
Título: Imagen difuminada en directX
Publicado por: BeRSeRKeR en 23 de Agosto de 2007, 10:55:31 PM
El 5º argumento de la función TextureLoader.FromFile es el número de niveles de mipmapping que se crean. Si está a cero, se crea una cadena completa. Prueba a poner sólo 1 (total, si la textura sólo se va a utilizar como sprite en coordenadas de pantalla...).

También asegúrate que los siguientes SamplerStageStates estan puestos a TextureFilter.None:

MinFilter
MagFilter
MipFilter

Para ello deberás utilizar la función Device.SetSamplerState. Se supone que por defecto tienen ese valor, pero por si acaso...

Saludos.
Título: Imagen difuminada en directX
Publicado por: bnl en 23 de Agosto de 2007, 10:57:18 PM
La primera imagen de arriba es la difuminada, la que se muestra al usar vertices y la de abajo es la correcta, la que se muestra usando sprites.

(http://img214.imageshack.us/img214/3600/dibujodifuminadopd7.png)

Lo mismo pero ampliado con el paint para mostar mejor el difuminado:

(http://img127.imageshack.us/img127/3259/dibujodifuminadograndexv4.png)

La imagen es de 32x32 pixeles y he puesto unos pixeles verdes en el borde para depurar.

Saludos
Título: Imagen difuminada en directX
Publicado por: bnl en 23 de Agosto de 2007, 11:27:02 PM
Muchisimas gracias. Era eso.
Lo he solucionado poniendo

dispositivo.SamplerState(0).MagFilter = TextureFilter.None
dispositivo.SamplerState(0).MinFilter = TextureFilter.None
dispositivo.SamplerState(0).MipFilter = TextureFilter.None

Lo de cambiar el numero de niveles no ha hecho falta.

La cuestion es que en cada iteración se vuelven a cambiar los valores de SamplerState.

Cuando hago el sprite.End se cambian los valores del dispositivo a

dispositivo.SamplerState(0).MagFilter = Point
dispositivo.SamplerState(0).MinFilter =   Point
dispositivo.SamplerState(0).MipFilter =   None

Cuando hago el sprite.Begin(SpriteFlags.AlphaBlend) se cambian los valores a

dispositivo.SamplerState(0).MagFilter   Anisotropic
dispositivo.SamplerState(0).MinFilter   Anisotropic
dispositivo.SamplerState(0).MipFilter   Linear

¿Es normal?¿Estoy haciendo algo mal?
Título: Imagen difuminada en directX
Publicado por: BeRSeRKeR en 24 de Agosto de 2007, 12:26:31 AM
No he utilizado la clase Sprite pero me imagino que End se limita a restaurar los estados que habían antes del Begin.

Así que o bien la documentación miente y los valores por defecto no son "None" sino los que has puesto que te salen después del End o bien es que hay algo por ahí que también está cambiando los estados.

De todas formas es curioso que con los estados:

MagFilter Anisotropic
MinFilter Anisotropic
MipFilter Linear

se te vea bien el sprite.

Saludos.

PD: pues sí, la documentación de MDX está mal. He mirado la documentación para C++ y efectivamente los valores por defecto son los que te restaura el método "End" del sprite.
Título: Imagen difuminada en directX
Publicado por: bnl en 24 de Agosto de 2007, 12:52:12 AM
Nada mas crear el device los valores son:

dispositivo.SamplerState(0).MagFilter = Point
dispositivo.SamplerState(0).MinFilter = Point
dispositivo.SamplerState(0).MipFilter = None

Y luego no se cambian en ningun punto mas que al hacer el begin y el end del sprite.

Es curioso que lo cambie el sprite pero luego el sprite no se ve afectado por ello.

¿Para que valen las 3 lineas de establecer el SamplerState?

Saludos y gracias