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.
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.
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 :(
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
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. :)
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);
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.
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.
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.
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.
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.
Muchisimas gracias!!! :lol:
Saludos.
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:.
Lo tendre en cuenta, gracias!
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.
Cita de: "Pogacha"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 )
Hay documentos de ATI y nVidia sobre ese tema. Mira a ver en la página de desarrolladores de ambas. Si lo encuentro pongo el enlace.
Saludos.
Lo peor que maneja d3d frente a ogl son los cambios de estado contra el device y modificar valores desde la aplicación contra un shader, este ultimo se nota muchísimo, por lo menos manejando effects.
No se en OpenGL pero las funciones de dibujo de texto con fuentes TrueType de D3D, en la version 8 al menos, son hororrosamente lentas, bajan exageradamente el rendimiento del programa.
Salu2...
Las fuentes en DirectX son una extensión con lo que realmente no pertenecen a Direct3d si no a Direct3dx, no obstante puedes notar mejoría si al renderizar un texto le pasas a la función un interface Id3dxsprite, la forma de trabajar ogl y d3dx las fuentes es diferente ya que mientras ogl crea objetos 3d, d3dx usa el dispositivo de contexto para renderizarlas.
Bueno ... al fin anduvo todo aceptablemente bien. (ole)
Tenia dos o tres problemas graves:
1 - Formato interno de las texturas (nooo)
2 - Atributos de la ventana en pantalla completa. ( No puedo creer que esto cambie el rendimiento )
3 - Todavia no lo encuentro por que tengo un 10% menos de rendimiento, ... pero almenos ahora es aceptable :lol:
Gracias de nuevo.