[C++]Direct3d lighting probleem *

Pagina: 1
Acties:

  • Vambier
  • Registratie: Augustus 2004
  • Laatst online: 13-01 17:07
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 :

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!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 13-02 18:54

.oisyn

Moderator Devschuur®

Demotivational Speaker

Het is lighting, niet lightning. Tenzij je bliksem bedoelt natuurlijk ;)
Overigens wel vaag dat een x file geen normals zou hebben, volgens mij kan dat gewoon hoor :?. Waar haal je die x files vandaan? En dat je texture "verdwenen" is komt omdat je de texture coordinates niet meekopieert, je geeft alleen XYZ en NORMAL op bij de CloneMeshFVF aanroep. Geef ook een D3DFVF_TEX1 mee.

[ Voor 4% gewijzigd door .oisyn op 06-09-2006 16:44 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Vambier
  • Registratie: Augustus 2004
  • Laatst online: 13-01 17:07
Ik dacht zelf ook dat er in een .x file wel normals stonden, maar aangezien hij zonder het clonen en het toevoegen van normals met D3DXComputeNormals helemaal zwart weergegeven wordt neem ik aan dat er geen normals in deze mesh zitten. Het is overgens de standaard tiger.x mesh die bij de sdk geleverd wordt.
Het was inderdaad het probleem dat ik niet de textures gekopieerd had. Nu doet hij het! Hardstikke bedankt!