2012-06-16 50 views
0

今天我開始使用DirectX(D3D9),一切都很順利,直到我創建了Static-mesh類。該類包含用於生成緩衝區,繪製和釋放緩衝區的方法。DirectX - 創建帶頂點數組作爲參數的緩衝區

問題在於緩衝區生成功能。如果我想將頂點數組作爲參數傳遞給函數,則在繪製時不繪製三角形(用三角形測試),但是,如果頂點在函數中聲明(與通過函數時相同的方式參數),三角形不繪製。

頂點類:

#define CUSTOMFVF (D3DFVF_XYZRHW | D3DFVF_DIFFUSE) 
class CUSTOMVERTEX 
{ 
public: 
    float X, Y, Z, RHW; 
    DWORD Color; 
}; 

頂點緩衝器生成函數(即不工作):

void StaticMesh::CreateBuffer(CUSTOMVERTEX Vertices[], LPDIRECT3DDEVICE9 d3ddev) 
{ 
    // USING FIXED SIZE WHILE TESTING WITH A SINGLE TRIANGLE. 
    d3ddev->CreateVertexBuffer(3*sizeof(CUSTOMVERTEX), 0, CUSTOMFVF, D3DPOOL_MANAGED, &Buffer, NULL); 

    VOID* p; 

    Buffer->Lock(0, 0, (void**)&p, 0); 
    memcpy(p, Vertices, sizeof(Vertices)); 
    Buffer->Unlock(); 
} 

頂點緩衝器生成功能(即不工作):

void StaticMesh::CreateBuffer(LPDIRECT3DDEVICE9 d3ddev) 
{ 
    CUSTOMVERTEX vertices[3] = 
    { 
     { 400.0f, 62.5f, 0.5f, 1.0f, D3DCOLOR_XRGB(0, 0, 255), }, 
     { 650.0f, 500.0f, 0.5f, 1.0f, D3DCOLOR_XRGB(0, 255, 0), }, 
     { 150.0f, 500.0f, 0.5f, 1.0f, D3DCOLOR_XRGB(255, 0, 0), }, 
    }; 

    // USING FIXED SIZE WHILE TESTING WITH A SINGLE TRIANGLE. 
    d3ddev->CreateVertexBuffer(3*sizeof(CUSTOMVERTEX), 0, CUSTOMFVF, D3DPOOL_MANAGED, &Buffer, NULL); 

    VOID* p; 

    Buffer->Lock(0, 0, (void**)&p, 0); 
    memcpy(p, Vertices, sizeof(Vertices)); 
    Buffer->Unlock(); 
} 

我沒有看到問題是什麼。感謝您的幫助,如果需要更多信息,請告訴我。

回答

1

你的函數

void StaticMesh::CreateBuffer(CUSTOMVERTEX Vertices[], LPDIRECT3DDEVICE9 d3ddev) 

的參數頂點是一個類型的指針。因此,函數內的sizeof(Vertices)只返回指針的大小,而不是像您期望的那樣返回整個數組的大小。

請將頂點數作爲另一個參數傳遞給函數,並像這樣修改函數。

void StaticMesh::CreateBuffer(CUSTOMVERTEX Vertices[], int aNumVertices, LPDIRECT3DDEVICE9 d3ddev) 
{ 
    // USING FIXED SIZE WHILE TESTING WITH A SINGLE TRIANGLE. 
    d3ddev->CreateVertexBuffer(aNumVertices*sizeof(CUSTOMVERTEX), 0, CUSTOMFVF, D3DPOOL_MANAGED, &Buffer, NULL); 

    VOID* p; 

    Buffer->Lock(0, 0, (void**)&p, 0); 
    memcpy(p, Vertices, aNumVertices * sizeof(CUSTOMVERTEX)); 
    Buffer->Unlock(); 
} 
+0

謝謝,我怎麼沒有記住這一點。 – zeluisping

相關問題