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:
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
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);
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 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);
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
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);
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 struct VERTEX { float x, y, z; float nx, ny, nz; //unsigned long color; };
Mes coefficients de 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
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 );
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.
Partager