Problème avec les matériaux [D3D] - Programmation
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 ?
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.
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...
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, ...
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();
}
Marsh Posté le 24-11-2001 à 16:36:49
edit : je n'ai rien dit ...
[edtdd]--Message édité par youdontcare--[/edtdd]
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);
}
}