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?
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.
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.
Ya hago los resnderstate indicando que coja el material pero..¡ni caso!
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...
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...!
Si no usas luces de poco te sirve que el material tenga diffuse. Prueba con emissive.
También he probado con Emissive y nada!
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.
¿Puedes publicar aquí el código de tu ejemplo o enviarlo por correo a dracular3d@terra.es por favor?
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.
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
¡Ya me funciona! muchas gracias Hari por el mail.
Gracias a todos por vuestra ayuda.
Que faltaba?
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!!)