Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Colores al renderizar

Iniciado por Drácula, 01 de Enero de 1970, 01:00:00 AM

« anterior - próximo »

Drácula

                                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?

                               
ltimas mejoras en Merlín: Multitextura.Control y generación automática de LOD.Importa ASE y X. Frustum Clipping por BB.Render añadido de wireframe y del BB.Animaciones por interpolación.Animaciones de textura...
Actualmente:Octree y jerarquías

_Grey

                                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.                                

_Grey

                                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.
                               

Drácula

                                Ya hago los resnderstate indicando que coja el material pero..¡ni caso!
                               
ltimas mejoras en Merlín: Multitextura.Control y generación automática de LOD.Importa ASE y X. Frustum Clipping por BB.Render añadido de wireframe y del BB.Animaciones por interpolación.Animaciones de textura...
Actualmente:Octree y jerarquías

mallrat

                                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...
                               

Drácula

                                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...!
                               
ltimas mejoras en Merlín: Multitextura.Control y generación automática de LOD.Importa ASE y X. Frustum Clipping por BB.Render añadido de wireframe y del BB.Animaciones por interpolación.Animaciones de textura...
Actualmente:Octree y jerarquías

Lord Trancos

                                Si no usas luces de poco te sirve que el material tenga diffuse. Prueba con emissive.                                
i>SaludoteZ de Lord Trancos!
http://www.dxlab.tk - http://dxlab.host.sk - programación de DirectX con Delphi.

Drácula

                                También he probado con Emissive y nada!                                
ltimas mejoras en Merlín: Multitextura.Control y generación automática de LOD.Importa ASE y X. Frustum Clipping por BB.Render añadido de wireframe y del BB.Animaciones por interpolación.Animaciones de textura...
Actualmente:Octree y jerarquías

Hari

                                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.                                

Drácula

                                ¿Puedes publicar aquí el código de tu ejemplo o enviarlo por correo a dracular3d@terra.es por favor?

                               
ltimas mejoras en Merlín: Multitextura.Control y generación automática de LOD.Importa ASE y X. Frustum Clipping por BB.Render añadido de wireframe y del BB.Animaciones por interpolación.Animaciones de textura...
Actualmente:Octree y jerarquías

Hari

                                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.

                               

Hari

                                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                                

Drácula

                                ¡Ya me funciona! muchas gracias Hari por el mail.

Gracias a todos por vuestra ayuda.
                               
ltimas mejoras en Merlín: Multitextura.Control y generación automática de LOD.Importa ASE y X. Frustum Clipping por BB.Render añadido de wireframe y del BB.Animaciones por interpolación.Animaciones de textura...
Actualmente:Octree y jerarquías

mallrat

                                Que faltaba?                                

Drácula

                                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!!)

                               
ltimas mejoras en Merlín: Multitextura.Control y generación automática de LOD.Importa ASE y X. Frustum Clipping por BB.Render añadido de wireframe y del BB.Animaciones por interpolación.Animaciones de textura...
Actualmente:Octree y jerarquías






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.