Foros - Stratos

Programadores => Programación gráfica => Mensaje iniciado por: cht en 01 de Enero de 1970, 01:00:00 AM

Título: D3DXSprite sin filtro
Publicado por: cht en 01 de Enero de 1970, 01:00:00 AM
                                Hola a todos,
Hay alguna manera de dibujar un sprite con el D3DXSprite del DX8 sin aplicar un suavizado al escalarlo, es decir, que se vean los texels? gracias                                
Título: D3DXSprite sin filtro
Publicado por: Lord Trancos en 01 de Enero de 1970, 01:00:00 AM
                                has probado con algo asin ?



ID3DXSprite._Begin;

IDirect3DDevice8.SetTextureStageState(0, D3DTSS_MAGFILTER, ord(D3DTEXF_POINT));
IDirect3DDevice8.SetTextureStageState(0, D3DTSS_MINFILTER, ord(D3DTEXF_POINT));

ID3DXSprite.Draw(....);

ID3DXSprite._End;



por cierto, pq quieres ver los puntos ?                                
Título: D3DXSprite sin filtro
Publicado por: cht en 01 de Enero de 1970, 01:00:00 AM
                                creo que si que lo he probado, pero parece como si el sprite tuviera su propio estado. En realidad lo que quiero es hacer un juego 2d en el que el tio que llevas esta formado por 3 sprites distintos. Lo que pasa es que al dibujarlos me suaviza los bordes y entonces no encajan bien... no se si me explico.

por cierto, aprovecho para felicitarte por tu web y tutoriales que son una pasada.

hasta otra                                
Título: D3DXSprite sin filtro
Publicado por: Lord Trancos en 01 de Enero de 1970, 01:00:00 AM
                                Pos yo lo acabo de provar y funciona :lengua:

Si no recuerdo mal, si llamas al metodo Draw sin llamar al metodo _Begin antes, el metodo Draw lo llama el solito, y lo que hace ese metodo (_Begin) es establecer los renderStates y textureStageStates adecuados.

Asi que si haces esto


IDirect3DDevice8.SetTextureStageState(0, D3DTSS_MAGFILTER, ord(D3DTEXF_POINT));
IDirect3DDevice8.SetTextureStageState(0, D3DTSS_MINFILTER, ord(D3DTEXF_POINT));

ID3DXSprite.Draw(....);
ID3DXSprite.Draw(....);
ID3DXSprite.Draw(....);


no funcionara. Pero si haces esto, si funcionara:


ID3DXSprite._Begin;

IDirect3DDevice8.SetTextureStageState(0, D3DTSS_MAGFILTER, ord(D3DTEXF_POINT));
IDirect3DDevice8.SetTextureStageState(0, D3DTSS_MINFILTER, ord(D3DTEXF_POINT));

ID3DXSprite.Draw(....);
ID3DXSprite.Draw(....);
ID3DXSprite.Draw(....);

ID3DXSprite._End;


en cuanto al problema de que con el suavizado las texturas no te encajan, es curioso pq a mi no me pasa .... :-?

si quieres puedes enviarme una demo donde te pase eso y miro a ver si en mi pc tambien pasa. :ojo:

en cuanto a mi web, asias, asias :riendo:

[ Este Mensaje fue editado por: Lord Trancos el 2002-04-30 19:55 ]                                
Título: D3DXSprite sin filtro
Publicado por: BeRSeRKeR en 01 de Enero de 1970, 01:00:00 AM
                                Pues creo que lo de que los bordes no "encajen" debe ser porque el filtro bilineal calcula el color del texel en base a los texels adyacentes. Por eso puede ocurrir que en los bordes de la textura aparezcan píxels que no corresponden...

Un saludo
                               
Título: D3DXSprite sin filtro
Publicado por: Lord Trancos en 01 de Enero de 1970, 01:00:00 AM
                                Cierto, pero al llamar a _Begin, el pone los texture stage states D3DTSS_ADDRESSU y D3DTSS_ADDRESSV a D3DTADDRESS_CLAMP, con lo que lo que dices queda solventado. Osea que no deberia de pasar...                                
Título: D3DXSprite sin filtro
Publicado por: MChiz en 01 de Enero de 1970, 01:00:00 AM
                                Si, pero al hacer la interpolación de los pixels, le falta la info de la textura. Lo que hay que hacer es añadir esa info que falta ( aunque sea redundante ).
Un saludo!

< MChiz >                                
Título: D3DXSprite sin filtro
Publicado por: Lord Trancos en 01 de Enero de 1970, 01:00:00 AM
                                mande? :-?                                
Título: D3DXSprite sin filtro
Publicado por: cht en 01 de Enero de 1970, 01:00:00 AM
                                ya me funciona! hice una prueba empezando de nuevo y me fué a la primera, asi que debia tener el código un poco liado.
El problema con los bordes suavizados es debido que al aplicar el filtrado lineal los pixels del borde los filtra con los que se supone que son transparentes (en negro) y solo quedan transparentes los que son exactamente negros, al aplicar el colorkey... lo que decia berserker, vamos.
bueno, muxas gracias a todos.