Foros - Stratos

Programadores => General Programadores => Mensaje iniciado por: Drácula en 01 de Enero de 1970, 01:00:00 AM

Título: Colores al renderizar
Publicado por: Drácula en 01 de Enero de 1970, 01:00:00 AM
                                Vereis, quiero renderizar un objeto, y que si está la opción seleccionada, tmbién mostrar el mismo objeto pero en WireFrame. Lo malo es que no utilizo las luces de DX y el objeto no tiene diffuse, es decir que su FVF=XYZ

Pues me sale el objeto en blanco y también el wireframe en blanco. Yo lo que quiero es poder especificar un color para el wireframe. Creo que si activo el Lightning, se ejecutan los cálculos y puedo entonces utilizar la propiedad emissive de un material para que lo trate como el color a aplicar, pero...¡no me sale!

Esta es la técnica

RenderObject();
      Video.EstablecerRenderState(D3DRS_FILLMODE,D3DFILL_WIREFRAME);
      Video.m_MaterialPorDefecto->Emissive.r=1;
      Video.m_MaterialPorDefecto->Emissive.g=0;
      Video.m_MaterialPorDefecto->Emissive.b=0;
      Video.m_MaterialPorDefecto->Emissive.a=0;
      Video.m_MaterialPorDefecto->Diffuse.r=1;
      Video.m_MaterialPorDefecto->Diffuse.g=0;
      Video.m_MaterialPorDefecto->Diffuse.b=0;
      Video.m_MaterialPorDefecto->Diffuse.a=1;
      Video.EstablecerRenderState(D3DRS_LIGHTING,TRUE);

      Video.Device()->SetMaterial(Video.m_MaterialPorDefecto);

      RenderObject();

¿Alguna idea por favor?

                               
Título: Colores al renderizar
Publicado por: _Grey en 01 de Enero de 1970, 01:00:00 AM
                                Si el FVF no tiene la imformacion de color, deberas indicar sus propiedades " colorificas ;D ",jeje, atraves de los materiales.....
...
...
....
..
..
.
....
..
Es eso lo que dices no??(por que no se entiende muy bien..)
Y creo, por lo leido que no te funciona...
Eso es por que atraves del SetRenderState() y de sus propiedades.:

D3DRS_DIFFUSEMATERIALSOURCE
D3DRS_SPECULARMATERIALSOURCE
D3DRS_AMBIENTMATERIALSOURCE
D3DRS_EMISSIVEMATERIALSOURCE

Le indicas de donde sale el color, con:
D3DMCS_MATERIAL
D3DMCS_COLOR1
D3DMCS_COLOR2

Es decir para indicar a Direct3d que el color de DIFFUSE es el primer color del FVF, haces esto:
SetRenderState(D3DRS_DIFFUSEMATERIALSOURCE,D3DMCS_COLOR1)

Para indicarle que es el segundo color del FVF haces esto:
SetRenderState(D3DRS_DIFFUSEMATERIALSOURCE,D3DMCS_COLOR2)


Y para indicarle que lo coja del material(creo que es esto lo que te interesa) haces:
SetRenderState(D3DRS_DIFFUSEMATERIALSOURCE,D3DMCS_MATERIAL)

En la info del SDK encontraras los valores por defecto, y cosas como que si quieres el specular lo tienes que activar con p_d3d_Device->SetRenderState( D3DRS_SPECULARENABLE, TRUE);

En fin espero haberte solucionado la duda.

Y si no !! lo dices!!

Saludotes.                                
Título: Colores al renderizar
Publicado por: _Grey en 01 de Enero de 1970, 01:00:00 AM
                                He releido tu post y creo combeniente hacer unos añadidos...

· No hace falta activar la luz para usar el MATERIAL
· Para usar el material se indica con un SetRenderState() que se usa el material en lugar del color del FVF

Otros saludotes.
                               
Título: Colores al renderizar
Publicado por: Drácula en 01 de Enero de 1970, 01:00:00 AM
                                Ya hago los resnderstate indicando que coja el material pero..¡ni caso!
                               
Título: Colores al renderizar
Publicado por: mallrat en 01 de Enero de 1970, 01:00:00 AM
                                Buenas Dracula, unas preguntas:

cuales son los demas valores del MaterialPorDefecto?

Video.m_MaterialPorDefecto -> que vale el ambient?

tienes el D3DRS_SPECULARENABLE en FALSE ?

usas:
TextureStageState( 0, D3DTA_TEXTURE, D3DTOP_MODULATE, D3DTA_DIFFUSE );
o si no hay textura:
TextureStageState( 0, D3DTA_TEXTURE, D3DTOP_SELECTARG2, D3DTA_DIFFUSE );

a ver si hay suerte y es algo de eso...
                               
Título: Colores al renderizar
Publicado por: Drácula en 01 de Enero de 1970, 01:00:00 AM
                                Todos los valores del material están a 0 menos el alpha y el rojo del diffuse que están a 1.

La textura modula con el diffuse.
El ambiente del D3DRS_AMBIENT es 0
LightEnable está a false.

..¡Pero algo se escapa...!
                               
Título: Colores al renderizar
Publicado por: Lord Trancos en 01 de Enero de 1970, 01:00:00 AM
                                Si no usas luces de poco te sirve que el material tenga diffuse. Prueba con emissive.                                
Título: Colores al renderizar
Publicado por: Drácula en 01 de Enero de 1970, 01:00:00 AM
                                También he probado con Emissive y nada!                                
Título: Colores al renderizar
Publicado por: Hari en 01 de Enero de 1970, 01:00:00 AM
                                Es mas sencillo de lo que estais comentando, si teneis un objeto con material (diffuse, ambient y specular) y no hay luces, se ve negro. Los render states D3DRS_DIFFUSEMATERIALSOURCE y similares, solo sirven cuando usamos color_vertex, que creo que no es el caso.

Ahora bien, si modificamos la propiedad Emissive del material, entonces emitirá el color que definamos, sin necesidad de activar las luces. Acabo de hacer un ejemplo sencillo y funciona.                                
Título: Colores al renderizar
Publicado por: Drácula en 01 de Enero de 1970, 01:00:00 AM
                                ¿Puedes publicar aquí el código de tu ejemplo o enviarlo por correo a dracular3d@terra.es por favor?

                               
Título: Colores al renderizar
Publicado por: Hari en 01 de Enero de 1970, 01:00:00 AM
                                Pegaré extractos del código, ya que lo he modificado dentro de lo que estoy haciendo y esto algo desperdigado en clases, espero que se entienda.

Nada mas sencillo:

1) Inicializo el material

// Material: Rojo
ZeroMemory( &mtrlRojo, sizeof(SO_MATERIAL) );
mtrlRojo.Ambient.r = mtrlRojo.Diffuse.r = mtrlRojo.Emissive.r = 1.0f;
mtrlRojo.Ambient.g = mtrlRojo.Diffuse.g = mtrlRojo.Emissive.g = 0.0f;
mtrlRojo.Ambient.b = mtrlRojo.Diffuse.b = mtrlRojo.Emissive.b = 0.0f;
mtrlRojo.Ambient.a = mtrlRojo.Diffuse.a = mtrlRojo.Emissive.a = 1.0f;

2) Proceso de render normal

// Establecemos material
cD3D->SetMaterial( &mtrlRojo );

// Index buffer
cD3D->SetIndices( cGeomTemp->g_IB , 0 );

// dibujamos
cD3D->DrawIndexedPrimitive( SO_PT_TRIANGLELIST, 0,
   cObjTemp->m_dwNumVertex , 0, cGeomTemp->m_dwNumFaces );

PD:

// Format FVF
#define D3DFVF_MIVERTICE (D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_TEX1 )

Los objetos en la prueba no tienen textura.
Ningun RenderState, excepto Zbuffer y Dither. Luz desactivada.

                               
Título: Colores al renderizar
Publicado por: Hari en 01 de Enero de 1970, 01:00:00 AM
                                Antes del SetIndices:

// establecemos el formato de los vertices
cD3D->SetVertexShader( D3DFVF_MIVERTICE );

// establecemos el vertex buffer
cD3D->SetStreamSource( 0, cObjTemp->g_pVB,
 sizeof(CObjeto::MIVERTICE) );

Obvio el BEGIN/END SCENE                                
Título: Colores al renderizar
Publicado por: Drácula en 01 de Enero de 1970, 01:00:00 AM
                                ¡Ya me funciona! muchas gracias Hari por el mail.

Gracias a todos por vuestra ayuda.
                               
Título: Colores al renderizar
Publicado por: mallrat en 01 de Enero de 1970, 01:00:00 AM
                                Que faltaba?                                
Título: Colores al renderizar
Publicado por: Drácula en 01 de Enero de 1970, 01:00:00 AM
                                No igualaba el diffuse Y el emissive al mismo tiempo. O ponía uno o ponía otro. Se ve que en los cálculos de luz que hace son necesarios los dos, para el caso en el que no hay luces(un caso que no suele darse!!)