Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Dx7

Iniciado por Pogacha, 26 de Diciembre de 2005, 12:19:13 PM

« anterior - próximo »

Pogacha

 Hola, como auto regalo de navidad me puse el 24 y 25  a hacer el renderer de D3D para el Dylo ...
La verdad es que avance muchisimo en 2 dias, o sea ... ya casi esta pero 2 cosas me tuvieron ayer todo el día y no logre resolver.

Puedo inicializar todo, dibujar los sprites con triangle fans y aplicar el alpha blending ...

1. Como hago para aplicar una modulación de color y alpha a la textura que voy a dibujar?
- Tengo que si o si usar color por vertex? Como se usa?
- Tampoco logre modular el canal alfa para el blending ... (en texturas que tengan o no tengan canal alfa)

2. Los sprites me quedan blureados, en modo ventana logré, restando 0.5f a las coordenadas de los vertices, que este problema desapareciera, pero en modo fullscreen si o si me queda como escalado  :blink:

3. Pregunta de yapa: Esta mal usar D3dx para facilitar el uso de D3D? que contras tiene?

Muchas gracias.

zupervaca

 Bueno... no creo que de ninguna solución a tus problemas ya que dx7 lo tengo muy olvidado, lo único decirte que pongas una pequeña demo de lo que te sucede para probarlo en diferentes ordenadores, en mi opinión no creo que este mal usar d3dx para facilitar el uso de d3d, yo por ejemplo uso los effects de d3dx9.

Pogacha

 Supongo que es un problema no solo de dx7 ya que lo he visto en muchos juegos, creo que en el Cow Abduction de la ultima compo me paso esto.

En OpenGL esto no me sucede, y no tuve que considerarlo nunca ...

En dx8 o 9, si quiero hacer un triangulo de tal color o con tal alpha como tendria que hacer?
Le doy al estado ambient pero no reacciona :(





Pogacha

 En definitiva, quien sería tan amable de traducirme esto a D3D:

glEnable(GL_BLEND);
glColor4f( r, g, b ,a ); // un color con el alpha modulando todo ...

glEnable(GL_TEXTURE);

glBegin( GL_QUADS );
 glTexCoord2f(0,0); glVector2i(x1,y1);
 glTexCoord2f(1,0); glVector2i(x2,y1);
 glTexCoord2f(1,1); glVector2i(x2,y2);
 glTexCoord2f(0,1); glVector2i(x1,y2);
glEnd();

glDisable(GL_TEXTURE);
glDisable(GL_BLEND);


Saludos

BeRSeRKeR

 Esto era para DX8...

Lo primero es crear una estructura de vértice que soporte la componente para el color:

#define D3DFVF_MIVERTICE (D3DFVF_XYZ|D3DFVF_DIFFUSE)

struct ColorVertex
{
       float x, y, z;
       DWORD color;
};


Y cuando vayas a renderizar el polígono, tendrás que especificar estos texture stage states:

pD3DDev->SetTexture(0, pTexture);
pD3DDev->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
pD3DDev->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_DIFFUSE);
pD3DDev->SetTextureStageState(0, D3DTSS_COLOROP,   D3DTOP_MODULATE);
pD3DDev->SetTextureStageState(0, D3DTSS_ALPHAOP,   D3DTOP_DISABLE);


Espero que esté bien, lo cierto es que hace muuuucho tiempo que no hago uso de la fixed pipeline. :)
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!

Ray

 prueba también con esto:


pDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP,  D3DTOP_SELECTARG1);
pDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE );

pDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE );  
pDevice->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_INVSRCALPHA);  
pDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_SRCALPHA);

Ray

 Me equivoqué, puse que el alpha estaba en la textura, mejor indicarle el valor alpha en otra función ( color 0x80 en este caso ).


pDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP,  D3DTOP_SELECTARG1);
pDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TFACTOR );

pDevice->SetRenderState(D3DRS_TEXTUREFACTOR, 0x80000000);

pDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE );  
pDevice->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_INVSRCALPHA);  
pDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_SRCALPHA);


creo que así valdría sin modificar el formato de vértice.

Pogacha

 Tendré que hacer las pruebas, pero la verdad es que me parece tan extraño que no se pueda asignar un color de modulación y ya. No quiero aun que no es la muerte tener que agregar componente de color a cada vertice, eso de D3DRS_TEXTUREFACTOR no lo habia visto lo voy a probar ...

Saludos y gracias.

BeRSeRKeR

 
Cita de: "Pogacha"Tendré que hacer las pruebas, pero la verdad es que me parece tan extraño que no se pueda asignar un color de modulación y ya. No quiero aun que no es la muerte tener que agregar componente de color a cada vertice, eso de D3DRS_TEXTUREFACTOR no lo habia visto lo voy a probar ...
Bueno, creo recordar que precisamente el D3DRS_TEXTUREFACTOR hace eso, especificar un color constante para la geometría y luego con este código modulas la textura con dicho color:

pD3DDev->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
pD3DDev->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_TFACTOR);
pD3DDev->SetTextureStageState(0, D3DTSS_COLOROP,   D3DTOP_MODULATE);


Si además quiere modular la componente alpha, tendrás que hacer:

pDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
pDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG2, D3DTA_TFACTOR);
pDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP,  D3DTOP_MODULATE);


Con eso no sería necesario la componente diffuse en el fromato de vértice.

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

Pogacha

 OK!  (ole)
Hice andar lo de la modulacion agregando el componente color en cada vertice. El costo: irá interpolando valores iguales de color de cada vertice. Probe con eso del FACTOR y nada, pero ahora que veo el codigo de BeRSeRKeR me doy cuenta que no puse  SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_TFACTOR);  (nooo) .
Esta noche vuelvo a hacer pruebas.

Para hacer un poligono sin textura simplemente cambio esto?pD3DDev->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TFACTOR);
pD3DDev->SetTextureStageState(0, D3DTSS_COLOROP,   D3DTOP_SELECTARG1);
o tengo que poner SetTexture(0, NULL); o algo así?

Otra pregunta ( creo que lo ultimo ), DirectX es bobo ( entiendase no inteligente )? o sea ... si cambio un estado con SetRenderState(...) me lo cambia sin importar si poco despues se contradice ?
Ejemplo:
pD3DDev->SetRenderState(D3DRS_ALPHABLENDENABLE,  FALSE);
pD3DDev->SetRenderState(D3DRS_ALPHABLENDENABLE,  TRUE);
pD3DDev->SetRenderState(D3DRS_ALPHABLENDENABLE,  FALSE);
pD3DDev->SetRenderState(D3DRS_ALPHABLENDENABLE,  TRUE);
pD3DDev->SetRenderState(D3DRS_ALPHABLENDENABLE,  FALSE);
pD3DDev->SetRenderState(D3DRS_ALPHABLENDENABLE,  TRUE);
pD3DDev->SetRenderState(D3DRS_ALPHABLENDENABLE,  FALSE);

Este codigo hace algo a nivel hardware? o DX se dará cuenta de que no tiene sentido?

( Tengo problemas de performance dx=300fps vs opengl sin optimizar = 1000 fps   <_< )

Saludos y muchas gracias.



BeRSeRKeR

 
Cita de: "Pogacha"Para hacer un poligono sin textura simplemente cambio esto?pD3DDev->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TFACTOR);
pD3DDev->SetTextureStageState(0, D3DTSS_COLOROP,   D3DTOP_SELECTARG1);
o tengo que poner SetTexture(0, NULL); o algo así?
Sí, tienes que poner el SetTexture a NULL y hacer lo que has dicho.

Cita de: "Pogacha"Otra pregunta ( creo que lo ultimo ), DirectX es bobo ( entiendase no inteligente )? o sea ... si cambio un estado con SetRenderState(...) me lo cambia sin importar si poco despues se contradice ?
Ejemplo:
pD3DDev->SetRenderState(D3DRS_ALPHABLENDENABLE,  FALSE);
pD3DDev->SetRenderState(D3DRS_ALPHABLENDENABLE,  TRUE);
pD3DDev->SetRenderState(D3DRS_ALPHABLENDENABLE,  FALSE);
pD3DDev->SetRenderState(D3DRS_ALPHABLENDENABLE,  TRUE);
pD3DDev->SetRenderState(D3DRS_ALPHABLENDENABLE,  FALSE);
pD3DDev->SetRenderState(D3DRS_ALPHABLENDENABLE,  TRUE);
pD3DDev->SetRenderState(D3DRS_ALPHABLENDENABLE,  FALSE);

Este codigo hace algo a nivel hardware? o DX se dará cuenta de que no tiene sentido?
Pues sí, efectivamente aunque el estado anterior fuera el mismo que quieres poner, el driver tiene que realizar ciertas validaciones. Por eso es común crearse un manager de estados que evite especificar estados redundantes.

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

Pogacha

 Muchisimas gracias!!!  :lol:

Saludos.

zupervaca

 Si quieres también puedes poner estas líneas para desactivar el texturado:

SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_DISABLE );
SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_DISABLE );
SetTexture( 0, NULL );

En antiguas pruebas que hice si se usaba multitextura y se ponía a NULL por ejemplo la 1 no fallaba, pero si desactivabas esos dos parámetros se ganaba unas cuantas FPS. Puedes probar aunque no se si con las tarjetas actuales se notara algo. Recuerda que luego tienes que volver a activarlo.
SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE );
SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1 );

Tambien debes de recordar que Direct3D usa el sistema de texturado escalonado, es decir, si anulas la textura 1 anulas las siguientes a estas, es bueno saberlo para optimizar :lol:.

Pogacha

 Lo tendre en cuenta, gracias!

Pogacha

 OK ya anduvo todo ...
Otra cosa que no sabia era lo de pantalla completa, D3DX gestiona automaticamente la pantalla completa, lo cual me deja en la incertidumbre nuevamente, que sera mejor?. No creo que tenga demasiada importancia de todos modos.

Como optimización, implemente un sistema donde solo cambio los estados que realmente son necesarios y hago solo los minimos cambios cada vez. El framerate subió con esto un 5% (ole)  ... ...  <_<   (nooo)  sigo teniendo problemas de performance, actualmente poco mas de la mitad de lo que saco con codigo mocho en OpenGL ....
En que me estoy equivocando tan mal?
Me olvide de poner SetRenderState( D3DST_ANDARBIEN, TRUE);?
Seguramente tendran menos idea que yo verdad  :P,

Mi pregunta es:
Cuales son las cosas que mas ralentizan una aplicación D3D? ( que no este en lista del SDK que ya lo lei entero dos veces )


Saludos.






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.