Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Cambiar El Color De Un Vértice Sin Lockear El Vf

Iniciado por Loover, 11 de Diciembre de 2003, 02:03:42 AM

« anterior - próximo »

ProD

 Yo uso el texture factor y va genial... será que todavía no me he metido con vs y ps.. como berserker.. pero todo llega.

Un saludo

PD: si usas el stage 0 y 1... a la vez es multitextura como por ejemplo..

SetTextureStageState(0, COLOR_OP, Select_arg_1)
SetTextureStageState(0, COLOR_ARG1, D3DTA_TEXTURE)

SetTextureStageState(1, COLOR_OP, MODULATE)
SetTextureStageState(1, COLOR_ARG1, D3DTA_TEXTURE)
SetTextureStageState(1, COLOR_ARG2, D3DTA_CURRENT)

m_pDevice->SetTexture(0, pTexture1);
m_pDevice->SetTexture(1, pTexture2);

.....................






as ideas son capitales que sólo ganan intereses entre las manos del talento

Loover

 Ajá, gracias a todos.
¿Sabe alguien como averiguar cuantas "stages" simultaneas por superficie soporta una tarjeta dada?

PD
Mchiz no me he enterao de tu post  :blink: :

Citar
Me pareceria demasiado raro ( y bonito ;b ). Pensemoslo como si fuese un pixel shader:
...

Es que no sé nada de shaders... ¿cuál es la conclusión a la que llegas?
IndieLib Libreria 2.5d utilizando aceleración por hardware para la programación de juegos 2d.
Indie Rover The monkeys are reading!

BeRSeRKeR

 Lo que quiere decir es que sería genial que uno pudiera utilizar todos los stages que quisiera (digamos 16) y si la aceleradora sobre la que corre el programa tiene menos de 16 unidades de textura, el API se encargaría de separar los stages y dar tantas pasadas como fuese necesario. Evidentemente eso ahora mismo no es posible de forma que le toca a uno mismo dar tantas pasadas como sea necesario.

Me parece recordar que Carmack hablaba de que algún día eso será posible...

Y para saber cuántas texturas simultaneas puedes utilizar, creo recordar que te lo decía el flag MaxSimultaneousTextures de las Caps de Direct3D.

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

BeRSeRKeR

Cita de: "Loover"Es que no sé nada de shaders... ¿cuál es la conclusión a la que llegas?
Ah bueno, si te referías a qué intentaba explicar MChiz con el pixel shader que ha puesto...

Lo que estaba tratando de demostrar es que aunque hagamos la operación Texture * Diffuse * TextureFactor utilizando dos stages, si la fixed pipeline sigue el mismo criterio que el pixel shader, cuando estamos utilizando el stage en el que entra en juego el TextureFactor (en el ejemplo de MChiz, el stage 1), realmente no se está ocupando un registro de textura ya que en realidad TextureFactor sería una constante que se le pasa al pixel shader.

En definitiva, que si la fixed pipeline sigue la misma lógica que el pixel shader, aunque estés utilizando dos stages, en realidad no estás utilizando dos unidades de textura por lo que en teoría, con una aceleradora sin soporte para multitextura, debería funcionar.

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

MChiz

 Exacto. Lo que dice Berserker es lo que intentaba demostrar : )

Loover

 Ah, y por eso decía MChiz que parecía como que Direct3D se encargaba sola de dar las pasadas si era necesario... lo que en realidad ocurría es que no estaba utilizando más registros de textura de los necesarios, sino la cte esa.
Ok, gracias, ahora lo entiendo (más o menos, pq nunca me he metido con shaders).

PD:
Por cierto, los shaders me recuerda un montón a asm... registros, etc. No parecen tan difíciles como pensaba.
IndieLib Libreria 2.5d utilizando aceleración por hardware para la programación de juegos 2d.
Indie Rover The monkeys are reading!

BeRSeRKeR

Cita de: "Loover"Por cierto, los shaders me recuerda un montón a asm... registros, etc. No parecen tan difíciles como pensaba.
Cierto, pero si utilizas un lenguaje de alto nivel como HLSL (si usas Direct3D) o Cg, te resultará aún más sencillo.

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

Loover

 Bueno, he vuelto con esto. En su tiempo probé el entintado y funcionaba bien. Sinembargo tengo problemas con el alpha:

Por un lado tengo este formato de vértice:

// Formato del vértice
struct CUSTOMVERTEX2D
{
// Posición
float mX, mY, mZ;

// Coordenadas de textura
float mU, mV;
};
#define D3DFVF_CUSTOMVERTEX2D (D3DFVF_XYZ | D3DFVF_TEX1)


Y luego al dibujar:

mRender->GetDevice()->SetRenderState (D3DRS_ALPHABLENDENABLE, TRUE);

mRender->GetDevice()->SetRenderState (D3DRS_TEXTUREFACTOR, D3DCOLOR_COLORVALUE (1.0f, 1.0f, 1.0f, 0.5f));
mRender->GetDevice()->SetTextureStageState (0, D3DTSS_COLOROP, D3DTOP_MODULATE);
mRender->GetDevice()->SetTextureStageState (0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
mRender->GetDevice()->SetTextureStageState (0, D3DTSS_COLORARG2, D3DTA_TFACTOR);


Si en el color pongo un rojo por ejemplo, la imagen se tinta de ese color. Sinembargo, si intento que la imagen apareza "medio transparente" (con un valor alpha 0.5f) se lo pasa por el pito del sereno y la dibuja normal y corriente. La textura sinembargo está creada con RGBA (A8R8G8B8).
¿Seguro que se puede hacer lo de cambiar el alpha sin lockear el vertex buffer?
¿Qué estoy haciendo mal?

Un saludo
IndieLib Libreria 2.5d utilizando aceleración por hardware para la programación de juegos 2d.
Indie Rover The monkeys are reading!

MChiz

 No estoy muy seguro, pero no tienes que tocar algo del ALPHAOP? No he probado esto nunca, asi que si digo una chorrada, que salte el que quiera :b

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

Imagino que esto te multiplicara el alpha de la textura por el del TextureFactor. Si no quieres usar el alpha de la textura y asi tener la imagen en RGB8 para ocupar menos memoria, prueba con:

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

Ya me diras que tal ha ido : )

Loover

 Sip, tb había probado eso, lo había visto "rebuscando" por la ayuda. Pero nada.
Tengo fundadas sospechas de que no hay más remedio que lockear el buffer. Por lo menos en el Special  Effects lo hace así. Pero claro este libro esta basado en dx 8.1 y quería ver si había alguna otra forma...
Aunque en la ayuda, sección "Texture Alpha" sale un ejemplo de una esfera semitransparente y lo hacen sin lockear, de la manera que tu has dicho y estaba probando. No sé que estoy haciendo mal.
IndieLib Libreria 2.5d utilizando aceleración por hardware para la programación de juegos 2d.
Indie Rover The monkeys are reading!

Loover

 Hey sí! Claro que funciona, solo que se me había olvidado poner esto:

mRender->GetDevice()->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
mRender->GetDevice()->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA );

;)

Por cierto, haciendo pruebas he visto como hacer un fade to color. Utilizando D3DTOP_BLENDFACTORALPHA  (uoh)

Gracias!
IndieLib Libreria 2.5d utilizando aceleración por hardware para la programación de juegos 2d.
Indie Rover The monkeys are reading!

MChiz

 Ole! Me alegro que lo hayas conseguido! : )

A que te refieres con un 'fade to color'??

Loover

 Sip, ir cambiando progresivamente de la imagen a un color dado. Por ejemplo completamente rojo.
Lo normal son fades a negro o a blanco, y a pantalla completa. Pero bueno, ya que puedo dar la posibilidad por imagen tb bienvenida sea. Eso sí, con cuidado de solo activarla si el usuario le da valores R, G, B.

Un saludo!
IndieLib Libreria 2.5d utilizando aceleración por hardware para la programación de juegos 2d.
Indie Rover The monkeys are reading!






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.