[D3D] Problème avec les matériaux

Problème avec les matériaux [D3D] - Programmation

Marsh Posté le 24-11-2001 à 09:28:37    

J'ai une class dans laquelle se trouve les matériaux de la scène et une fonction pour afficher la scène, le problème c'est quand je passe les matériaux les objects restent blancs alors qu'en faisant des tests sur les données des matériaux, celles-ci sont bonnes.
 
Voilà le bout de code:
 
dans la class:
D3DMATERIAL8* pD3DMaterials;
 
 
 
la fonction de la class:
void CScene::RenderScene()
{
 for (unsigned short i = 0; i < nObjects; i++)
 {
  g_lpD3DDevice->SetStreamSource(0, pVBuffer[i], sizeof(SVertex));
 
  g_lpD3DDevice->SetMaterial(&pD3DMaterials[pObjects[i].nMatRef]);
 
  g_lpD3DDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, pObjects[i].nFaces);
 }
}

Reply

Marsh Posté le 24-11-2001 à 09:28:37   

Reply

Marsh Posté le 24-11-2001 à 09:29:13    

D'où vient l'erreur d'après vous?

Reply

Marsh Posté le 24-11-2001 à 10:19:06    

le lighting est on ?
 
tes objets ont-ils bien des normales ?
 
spécifies-tu le bon vertex format ?  
 
tu mets quoi dans ta structure de matériau ?

Reply

Marsh Posté le 24-11-2001 à 11:07:52    

Mon FVF: D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_DIFFUSE | D3DFVF_SPECULAR
 
Et pour mes matériaux, j'ai un tableau de D3DMATERIAL8 dans lequelle je met les couleurs ambientes, diffuses et speculaires.

Reply

Marsh Posté le 24-11-2001 à 11:21:35    

... as-tu créé une lumière ? :D

Reply

Marsh Posté le 24-11-2001 à 11:44:32    

Ben oui quand même.
:)
 
Nan en fait, si je crée un matériaux à la main dans ma fonction de rendu ça marche. Mais si je met le matériaux qui est dans ma class alors les objets restent blanc...
 
Je comprend pas trop...
:(

Reply

Marsh Posté le 24-11-2001 à 12:08:07    

Alload a écrit a écrit :

g_lpD3DDevice->SetMaterial(&pD3DMaterials[pObjects[i].nMatRef]);


tu n'as pas mis un pointeur de pointeur ?
 
reregarde le code de création des matériaux, mets-le ici, ...

Reply

Marsh Posté le 24-11-2001 à 16:30:52    

void CScene::LoadMaterials()
{
 ifstream file(szFilePath);
 
 bool finished = false;
 string buffer;
 unsigned short nCurrent;
 
 while (!finished)
 {
  file >> buffer;
 
  if (buffer == "*MATERIAL_COUNT" )
  {
   file >> nMaterials;
   pMaterials = new SMaterial[nMaterials];
   pD3DMaterials = new D3DMATERIAL8[nMaterials];
  }
 
  if (buffer == "*MATERIAL" )
  {
   file >> nCurrent;
   pMaterials[nCurrent].istextured = false;
   ZeroMemory(&pD3DMaterials[nCurrent], sizeof(D3DMATERIAL8));
  }
 
  if (buffer == "*MATERIAL_AMBIENT" )
  {
   file >> pD3DMaterials[nCurrent].Ambient.r;
   file >> pD3DMaterials[nCurrent].Ambient.g;
   file >> pD3DMaterials[nCurrent].Ambient.b;
   pD3DMaterials[nCurrent].Ambient.a = 1;
  }
 
  if (buffer == "*MATERIAL_DIFFUSE" )
  {
   float r, g, b;
   file >> r;
   file >> g;
   file >> b;
   pMaterials[nCurrent].diffuse[0] = (unsigned short)(r * 255);
   pMaterials[nCurrent].diffuse[1] = (unsigned short)(g * 255);
   pMaterials[nCurrent].diffuse[2] = (unsigned short)(b * 255);
 
   pD3DMaterials[nCurrent].Diffuse.r = r;
   pD3DMaterials[nCurrent].Diffuse.g = g;
   pD3DMaterials[nCurrent].Diffuse.b = b;
   pD3DMaterials[nCurrent].Diffuse.a = 1;
  }
 
  if (buffer == "*MATERIAL_SPECULAR" )
  {
   float r, g, b;
   file >> r;
   file >> g;
   file >> b;
   pMaterials[nCurrent].specular[0] = (unsigned short)(r * 255);
   pMaterials[nCurrent].specular[1] = (unsigned short)(g * 255);
   pMaterials[nCurrent].specular[2] = (unsigned short)(b * 255);
 
   pD3DMaterials[nCurrent].Specular.r = r;
   pD3DMaterials[nCurrent].Specular.g = g;
   pD3DMaterials[nCurrent].Specular.b = b;
   pD3DMaterials[nCurrent].Specular.a = 1;
  }
 
  if (buffer == "*GEOMOBJECT" )
  {
   finished = true;
  }
 }
 
 file.close();
}

Reply

Marsh Posté le 24-11-2001 à 16:36:49    

edit : je n'ai rien dit ...

 

[edtdd]--Message édité par youdontcare--[/edtdd]

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed