Hoi,
Ik ben al een tijdje bezig met een basic 3d engine te schrijven in c++ in combinatie met direct3d.
Ik ben nu zover dat ik het voor elkaar heb om een mesh(.x) in te laden en te renderen.
Als ik deze mesh render wordt hij correct weergegeven met ambient lightning. Maar ambient lightning alleen is niet echt mooi, dus heb ik er om te beginnen 1 light bij geplaatst, een directional light.
Dit lampje werkt op zich wel goed als ik een standaard teapot inlaad van direct3d, je kunt hierbij dan ook echt de schaduwen zien.
Nu wilde dit bij mijn eigen mesh niet lukken. Ik ben er toen achter gekomen dat ik hiervoor normals in mijn mesh moet hebben. Aangezien deze er niet in zitten als het object van een .x file geladen wordt moeten deze dus berekend worden. Ik heb hierbij een clone van mijn mesh gemaakt en er voor gezorgd dat hier ruimte is voor normals. Daarna heb ik de normals berekend.
Het resultaat hiervan is dat mijn mesh goed wordt ingeladen en de belichting op mijn mesh ook goed is, maar dat de textures ineens compleet verdwenen zijn, terwijl ik deze nog steeds op dezelfde manier inlaad/weergeef.
Heeft iemand mischien een idee waardoor mijn textures ineens 'verdwenen' zijn?
Hieronder even de relevante code :
(ik heb twee meshes : MeshObject en TempMesh)
Voor het laden van de mesh :
Alvast bij voorbaat dank!
Ik ben al een tijdje bezig met een basic 3d engine te schrijven in c++ in combinatie met direct3d.
Ik ben nu zover dat ik het voor elkaar heb om een mesh(.x) in te laden en te renderen.
Als ik deze mesh render wordt hij correct weergegeven met ambient lightning. Maar ambient lightning alleen is niet echt mooi, dus heb ik er om te beginnen 1 light bij geplaatst, een directional light.
Dit lampje werkt op zich wel goed als ik een standaard teapot inlaad van direct3d, je kunt hierbij dan ook echt de schaduwen zien.
Nu wilde dit bij mijn eigen mesh niet lukken. Ik ben er toen achter gekomen dat ik hiervoor normals in mijn mesh moet hebben. Aangezien deze er niet in zitten als het object van een .x file geladen wordt moeten deze dus berekend worden. Ik heb hierbij een clone van mijn mesh gemaakt en er voor gezorgd dat hier ruimte is voor normals. Daarna heb ik de normals berekend.
Het resultaat hiervan is dat mijn mesh goed wordt ingeladen en de belichting op mijn mesh ook goed is, maar dat de textures ineens compleet verdwenen zijn, terwijl ik deze nog steeds op dezelfde manier inlaad/weergeef.
Heeft iemand mischien een idee waardoor mijn textures ineens 'verdwenen' zijn?
Hieronder even de relevante code :
(ik heb twee meshes : MeshObject en TempMesh)
Voor het laden van de mesh :
C++:
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
38
| VOID Mesh::LoadMesh(LPCTSTR FileName, LPDIRECT3DDEVICE9 RenderObject) { LPD3DXBUFFER MaterialBuffer; D3DXLoadMeshFromX(FileName, D3DXMESH_SYSTEMMEM, RenderObject, NULL, &MaterialBuffer, NULL, &NumMaterials, &MeshObject); D3DXMATERIAL* Materials = (D3DXMATERIAL*)MaterialBuffer->GetBufferPointer(); MeshMaterials = new D3DMATERIAL9[NumMaterials]; MeshTextures = new LPDIRECT3DTEXTURE9[NumMaterials]; for(DWORD i = 0; i < NumMaterials; i++) { MeshMaterials[i] = Materials[i].MatD3D; MeshMaterials[i].Ambient = MeshMaterials[i].Diffuse; MeshTextures[i] = NULL; if(Materials[i].pTextureFilename != NULL) { D3DXCreateTextureFromFileA(RenderObject, Materials[i].pTextureFilename, &MeshTextures[i]); } } MaterialBuffer->Release(); MeshObject->CloneMeshFVF(MeshObject->GetOptions(), D3DFVF_XYZ | D3DFVF_NORMAL, RenderObject, &TempMesh); D3DXComputeNormals(TempMesh, 0); } en deze voor het renderen : //Draw the mesh for(DWORD i = 0; i < NumMaterials; i++) { RenderObject->SetMaterial(&MeshMaterials[i]); RenderObject->SetTexture(0, MeshTextures[i]); TempMesh->DrawSubset(i); } |
Alvast bij voorbaat dank!