Доброго времени суток! Начал изучение Direct3D, дошел до материалов и текстур и застопорился. Мало того, что код из книги не работает и не накладывает текстуры на mesh-объект, загруженный из .x - файла, еще и в сети ничего не нахожу. В общем вот код:
| Код | DWORD LoadMesh (char *filename, IDirect3DDevice9 *ppiD3DDevice9, ID3DXMesh **ppMesh, LPDIRECT3DTEXTURE9 **pMeshTextures, char *texturefilename, D3DMATERIAL9 **pMeshMaterials ) { LPD3DXBUFFER pD3DXMtrlBuffer; DWORD dwNumMaterials;
D3DXLoadMeshFromX(filename, D3DXMESH_SYSTEMMEM, ppiD3DDevice9, NULL, &pD3DXMtrlBuffer, NULL, &dwNumMaterials, ppMesh);
D3DXMATERIAL* d3dxMaterials = (D3DXMATERIAL*)pD3DXMtrlBuffer->GetBufferPointer();
(*pMeshTextures) = new LPDIRECT3DTEXTURE9[dwNumMaterials]; (*pMeshMaterials) = new D3DMATERIAL9[dwNumMaterials];
for( DWORD i=0; i<dwNumMaterials; i++ ) { // Копируем материал (*pMeshMaterials)[i] = d3dxMaterials[i].MatD3D; //(*pMeshMaterials)[i] = d3dm;
// Создаем текстуру if( FAILED(D3DXCreateTextureFromFile(ppiD3DDevice9, d3dxMaterials[i].pTextureFilename, &(*pMeshTextures)[i]))) if( FAILED(D3DXCreateTextureFromFile(ppiD3DDevice9, texturefilename, &(*pMeshTextures)[i]))) (*pMeshTextures)[i] = NULL; } return dwNumMaterials; }
|
| Код | void DrawScene() { ViewAngle+=0.01f; float b = ViewAngle; D3DMATRIX World = { cos(b)*cos(b), cos(b)*sin(b), sin(b), 0, -sin(b), cos(b), 0, 0, -sin(b)*cos(b), -sin(b)*sin(b), cos(b), 0, 0, 0, 0, 1, };
pD3DDevice->SetTransform(D3DTS_WORLD, &World); //pD3DDevice->SetRenderState(D3DRS_FILLMODE, D3DFILL_WIREFRAME);
pD3DDevice->SetRenderState(D3DRS_LIGHTING, TRUE); for (DWORD i=0; i<dwNumMaterials; i++) { pD3DDevice->SetMaterial(&pMeshMaterials[i]);
if (pMeshTextures[i]) pD3DDevice->SetTexture(0, pMeshTextures[i]);
pMesh->DrawSubset(i); } }
|
В общем, как я уже сказал, текстура не накладывается. Точнее она накладывается, но отображается однотонный объект коричневого цвета, хотя текстура была в виде рисунка дерева. (Размер текстуры 128x128, jpg, если это важно). |