Foros - Stratos

Programadores => Programación gráfica => Mensaje iniciado por: disruptorXL en 28 de Mayo de 2004, 12:02:21 PM

Título: Bump Mapping
Publicado por: disruptorXL en 28 de Mayo de 2004, 12:02:21 PM
 hola, me gustaria saber como puedo aplicar aparte del bump con el dot3 una textura para que se vea tb?

este es el codigo que hace el bump:

g_pDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
   g_pDevice->SetTextureStageState( 0, D3DTSS_COLOROP,   D3DTOP_DOTPRODUCT3 );
   g_pDevice->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_TFACTOR );

// Set the texture to be the normal map
   g_pDevice->SetTexture( 0, g_pNormalMapTexture );


el mapa de normales lo he generado con D3DXComputeNormalMap o algo asi... se que tengo que hacer algun texture stage en otro numero y algo mas pero no se... por cierto la otra textura la aplique antes sin hacer ningun texture stage.

otra cosa como puedo hacer para que el bump varie segun la posicion de la luz?

Muchas gracias de antemano.

Hasta otra.
   

Título: Bump Mapping
Publicado por: BeRSeRKeR en 28 de Mayo de 2004, 12:20:09 PM
 Sería algo así.

SetTextureStageState(0, D3DTSS_COLOROP,   D3DTOP_DOTPRODUCT3);
SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);      
SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_TFACTOR);

SetTextureStageState(1, D3DTSS_COLOROP,   D3DTOP_MODULATE);
SetTextureStageState(1, D3DTSS_COLORARG1, D3DTA_TEXTURE);
SetTextureStageState(1, D3DTSS_COLORARG2, D3DTA_CURRENT);

Evidentemente, en el texture stage 1 deberás tener la textura base activada.

De todas formas te recomiendo que empieces a utilizar pixel shaders. Verás que las cosas se hacen más sencillas y más rápidas.

Saludos.
Título: Bump Mapping
Publicado por: disruptorXL en 28 de Mayo de 2004, 02:15:52 PM
 no sale, ahora en vez del mapa de normales solo me sale la textura base :(
a ver si me puedes ayudar, por favor.

PD: como calculo las tangentes y las binormales?
Título: Bump Mapping
Publicado por: BeRSeRKeR en 28 de Mayo de 2004, 03:00:41 PM
 Pues yo lo he probado y funciona perfectamente. En todo caso, se me olvidó poner la línea

SetTextureStageState( 1, D3DTSS_TEXCOORDINDEX, 0 );

que le dice a Direct3D que utilice el set número 1 de coordenadas de textura. De todas formas eso es en el caso de que vayas a utilizar un sólo set de coordenadas de textura, tanto para el normal map como para el base map lo cual es lo normal.

En cualquier caso, si dices que puedes ver la textura base entonces no sería ese el problema.

Y para calcular el tangent-space, a ver si esta página te sirve.

Saludos.
Título: Bump Mapping
Publicado por: disruptorXL en 28 de Mayo de 2004, 03:11:17 PM
 muchas gracias tio.

Una cosa, en direct3d no existe una funcion para calcular las tangentes? algo asi como D3DXComputeTangent, pero me pide parametros como las binormales que no se como calcularlas. Me podrias ayudar?

Gracias de antemano.

pd: se bueno conmigo que llevo mu poco tiempo con prog. grafica y direct3d, vale?
Título: Bump Mapping
Publicado por: BeRSeRKeR en 28 de Mayo de 2004, 06:36:35 PM
 Yo nunca he utilizado esa función pero en este artículo (Dot3 Bump Mapping) explica cómo utilizar esa función. Aunque ahí utiliza vertex shaders para transformar el vector de la luz a tangent-space y la fixed pipeline para hacer el DOT3 bumpmapping.

Al primer parámetro le tienes que pasar el D3DXMesh que contiene los datos del mesh, es decir, las coordenadas de vértices, las coordenadas de textura, la normal, la binormal, la tangente. Evidentemente la tangente y la binormal las puedes dejar en blanco ya que las vas a calcular con esta función.

Ahora imagina que tienes esta declaración de vértice:

FVF = (xyz, normal, tex1, tangent, binormal)

donde tex1, tangent y binormal son sets de coordenadas de textura.

Pues bien, en el segundo parámetro tienes que poner el índice que ocupa el set de coordenadas de textura que se utilizará para el normal map. En este caso es el 0 porque es el primer set de coordenadas de textura.

En el tercer parámetro tienes que poner el índice a la tangente. En el caso anterior sería 1.

El cuarto parámetro es el índice a la binormal y en este caso sería 2.

En el quinto parámetro pones TRUE o FALSE dependiendo si quieres que haya wrapping o no.

Finalmente, en el sexto parámetro pones NULL.

Y ya está, con eso, la función te rellenará automáticamente los campos tangent y binormal de tu D3DXMesh.

Saludos.
Título: Bump Mapping
Publicado por: disruptorXL en 29 de Mayo de 2004, 10:04:27 AM
 asias!