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?
Tal vez sea cosa de mip-mapping. ¿Has probado a no crear niveles de mip-map al crear la textura?.
Saludos.
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.
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.
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
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?
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.
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