Bonjour,

Je developpe un petit moteur multi API OGL/DX. J'affiche donc des objets au format obj/mtl dans mon application.
Dans le mode GL la lumière spéculaire se reflette bien lorsque je bouge la camera. Mais en Direct3D la surface reste noire.

voici mon initialisation de Direct3D:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
 
   m_DirectX = Direct3DCreate9(D3D_SDK_VERSION);
   if(m_DirectX == NULL) return false;
 
   D3DPRESENT_PARAMETERS d3dpp;
   ZeroMemory( &d3dpp, sizeof(d3dpp) );
   d3dpp.Windowed = TRUE;
   d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
   d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;
       d3dpp.AutoDepthStencilFormat     = D3DFMT_D16;
    d3dpp.EnableAutoDepthStencil     = true;
 
   HRESULT res = m_DirectX->CreateDevice(D3DADAPTER_DEFAULT,
                        D3DDEVTYPE_HAL, window.winId(), D3DCREATE_HARDWARE_VERTEXPROCESSING,
                        &d3dpp, &m_Device);
       // States par défaut
    m_Device->SetRenderState(D3DRS_DITHERENABLE,     true);
    m_Device->SetRenderState(D3DRS_LIGHTING,         true);
    m_Device->SetRenderState(D3DRS_ZENABLE,          D3DZB_TRUE);
    m_Device->SetRenderState(D3DRS_FOGENABLE,        false);
    m_Device->SetRenderState(D3DRS_ALPHATESTENABLE,  false);
    m_Device->SetRenderState(D3DRS_ALPHABLENDENABLE, false);
 
	m_Device->SetRenderState( D3DRS_DIFFUSEMATERIALSOURCE, D3DMCS_MATERIAL );
	m_Device->SetRenderState( D3DRS_SPECULARMATERIALSOURCE, D3DMCS_MATERIAL );
	m_Device->SetRenderState( D3DRS_AMBIENTMATERIALSOURCE, D3DMCS_MATERIAL );
	m_Device->SetRenderState( D3DRS_SPECULARENABLE, true );
	m_Device->SetRenderState( D3DRS_LOCALVIEWER, true );
 
    m_Device->SetRenderState(D3DRS_CULLMODE,         D3DCULL_CCW);
 
 
    m_Device->SetSamplerState(0, D3DSAMP_ADDRESSU,  D3DTADDRESS_CLAMP);
    m_Device->SetSamplerState(0, D3DSAMP_ADDRESSV,  D3DTADDRESS_CLAMP);
    m_Device->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
    m_Device->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
    m_Device->SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_NONE);
Ma création de la lumière :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 
	ZeroMemory( &m_light, sizeof(D3DLIGHT9) );
 
	D3DXVECTOR3  pos( m_position.m_x, m_position.m_y, m_position.m_z);
	D3DCOLORVALUE dif=  { m_diffus.m_x, m_diffus.m_y, m_diffus.m_z, m_diffus.m_w };
	D3DCOLORVALUE specul= { m_specular.m_x, m_specular.m_y, m_specular.m_z, m_specular.m_w };
	D3DCOLORVALUE ambient= {m_ambient.m_x, m_ambient.m_y, m_ambient.m_z, m_ambient.m_w };
 
	m_light.Type = D3DLIGHT_POINT;
	m_light.Position = pos;
	m_light.Diffuse =  dif;
	m_light.Specular = specul;
	m_light.Ambient=  ambient;
	m_light.Range = 10000000.0f;
	m_light.Falloff = 0;
	m_light.Attenuation0 = 1.0f;
 
 
 
	m_pDevice->SetLight( m_idLight,&m_light);;
	m_pDevice->LightEnable(m_idLight,TRUE);
les matériaux :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
 
	ZeroMemory(& m_mat, sizeof( D3DMATERIAL9) );
 
 
 
	D3DCOLORVALUE  dif = {  m_DiffuseColor.m_x,  m_DiffuseColor.m_y,  m_DiffuseColor.m_z,  m_transparency  };
	D3DCOLORVALUE  ambient = {  m_ambientColor.m_x,  m_ambientColor.m_y,  m_ambientColor.m_z,  m_transparency  };
	D3DCOLORVALUE  specul = {  m_SpecularColor.m_x,  m_SpecularColor.m_y,  m_SpecularColor.m_z,  m_transparency  };
 
 
	m_mat.Diffuse =  dif  ;
	m_mat.Ambient = ambient ;
 
 
 
 
	//if ( m_illumationModel == 2 )
	//{
		m_mat.Specular =  specul ;
		m_mat.Power = 50;
 
	//}
 
 
	HRESULT hr = m_pDevice->SetMaterial( &m_mat);
J'utilise des vertex buffer dont le format est le suivant:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
 
struct VERTEX {
	float x, y, z;
	float nx, ny, nz;
	//unsigned long color;
};
Voici mon début de scène et la fin de la scène et la fonction d'affichage des triangle:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 
//Begin
   m_Device->Clear( 0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(255,255,255), 1.0f, 0 );
   m_Device->BeginScene();
 
//Draw
	if(m_CurrentVertexShader != NULL)
	{
		cgD3D9BindProgram(static_cast<ShaderDX*>(m_CurrentVertexShader)->getCGProgram());
		checkCgError();
	}
	if(m_CurrentPixelShader != NULL)
	{
		  cgD3D9BindProgram(static_cast<ShaderDX*>(m_CurrentPixelShader)->getCGProgram());
		  checkCgError();
	}
	HRESULT hr = m_Device->DrawIndexedPrimitive(DXEnum::Get(type), 0, 0, m_VertexCount, 0, Count);
	m_Device->SetVertexShader(NULL);
	m_Device->SetPixelShader(NULL);
 
//end
   m_Device->EndScene();
   m_Device->Present( NULL, NULL, NULL, NULL );
Mes coefficients de lumière:
Position :0.0f,1000.0f, 0.0f
Ambient : 1.0f, 1.0f, 1.0f
Diffuse: 1.0f, 1.0f, 1.0f
Specular : 1.0f, 1.0f, 1.0f


Voila

Pouvez vous m'aider?

Merci d'avance,

Syphius.