2014-01-09 81 views
0

當將VERTEX結構傳遞給緩衝區時,我注意到了一些奇怪現象。起初,我認爲這是一個錯誤的自定義函數讀取.obj文件,但調試進一步縮小了問題。當傳遞到頂點緩衝區DirectX:將數組指針傳遞給頂點結構

VERTEX foo[] = { 
     {XMFLOAT3(-0.5f, 0.0f, 0.0f), D3DXCOLOR(1.0f,1.0f,1.0f,1.0f)}, 
     {XMFLOAT3(-0.5f, 0.5f, 0.0f), D3DXCOLOR(1.0f,1.0f,1.0f,1.0f)}, 
     {XMFLOAT3(0.0f, 0.0f, 0.0f), D3DXCOLOR(1.0f,1.0f,1.0f,1.0f)}, 
     {XMFLOAT3(0.0f, 0.5f, 0.0f), D3DXCOLOR(1.0f,1.0f,1.0f,1.0f)}, 
     {XMFLOAT3(0.9f, 0.0f, 0.0f), D3DXCOLOR(0.0f,1.0f,1.0f,1.0f)}, 
     {XMFLOAT3(2.0f, 0.9f, 0.0f), D3DXCOLOR(0.0f,1.0f,0.0f,1.0f)}, 
    }; 

工作完美:就拿:

struct VERTEX{ 
    XMFLOAT3 Translation; 
    D3DXCOLOR Color; 
}; 

和它的實例。動態創建結構的數組實例會產生奇怪的結果。我會看到一個頂點出現,或沒有。這裏有一個例子,假設foo爲返回[工作] VERTEX*陣列頂點的功能:

VERTEX *bar= new VERTEX[barsize]; 
VERTEX foo[] = { 
     {XMFLOAT3(-0.5f, 0.0f, 0.0f), D3DXCOLOR(1.0f,1.0f,1.0f,1.0f)}, 
     {XMFLOAT3(-0.5f, 0.5f, 0.0f), D3DXCOLOR(1.0f,1.0f,1.0f,1.0f)}, 
     {XMFLOAT3(0.0f, 0.0f, 0.0f), D3DXCOLOR(1.0f,1.0f,1.0f,1.0f)}, 
     {XMFLOAT3(0.0f, 0.5f, 0.0f), D3DXCOLOR(1.0f,1.0f,1.0f,1.0f)}, 
     {XMFLOAT3(0.9f, 0.0f, 0.0f), D3DXCOLOR(0.0f,1.0f,1.0f,1.0f)}, 
     {XMFLOAT3(2.0f, 0.9f, 0.0f), D3DXCOLOR(0.0f,1.0f,0.0f,1.0f)}, 
    }; 
bar=foo; 

後來就......

memcpy(MappedResource.pData, &bar, sizeof(bar)); 

我在做一些有趣的嘗試訪問數據那foo指向,只有第一組座標傳入?

*編輯:當寫這篇文章,foo和酒吧混合。這篇文章現在顯示了正確的例子。

+1

你的代碼很混亂,foo有什麼用?你說這是一個函數,但它是你的代碼中的數組,並且foo = bar會得到未初始化的值。 – zdd

+0

我剛編輯帖子,對不起。我淡化了這個問題。原始代碼具有解析頂點的obj文件的功能。它返回一個'VEXTEX *'數組(表示爲'VERTEX foo []'),它被複制到bar。我注意到'VERTEX'數組工作正常,但是當我使用'new'分配時,我可以訪問新數組中的元素,但D3D不能 - 它似乎只畫一個點。我相信這是一個指針問題。 –

+0

請參閱下面的答案。 – zdd

回答

1

問題是這樣的線

條= FOO;

memcpy(MappedResource.pData,& bar,sizeof(bar));

bar是VERTEX的指針,而不是x86機器上VERTEX,sizeof(bar)== 4的數組,因此您不會獲取所有複製的元素。

您可以先計算您需要多少個頂點元素,然後在使用memcpy時使用sizeof(VERTEX)* vertex_count。

+0

如何引用指向的數組'sizeof()': 'memcpy(MappedResource.pData,&bar,sizeof(&* bar));'? –

+0

不確定你的意思。 – zdd

+0

如何通過指針'VERTEX *' –