Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Imagen difuminada en directX

Iniciado por bnl, 23 de Agosto de 2007, 06:51:30 PM

« anterior - próximo »

bnl

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?
Mi web: http://www.brausoft.com/
No sabían que era imposible, así que lo hicieron.

BeRSeRKeR

Tal vez sea cosa de mip-mapping. ¿Has probado a no crear niveles de mip-map al crear la textura?.

Saludos.
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!

bnl

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.
Mi web: http://www.brausoft.com/
No sabían que era imposible, así que lo hicieron.

BeRSeRKeR

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.
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!

bnl

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.



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



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

Saludos
Mi web: http://www.brausoft.com/
No sabían que era imposible, así que lo hicieron.

bnl

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?
Mi web: http://www.brausoft.com/
No sabían que era imposible, así que lo hicieron.

BeRSeRKeR

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.
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!

bnl

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
Mi web: http://www.brausoft.com/
No sabían que era imposible, así que lo hicieron.






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.