DirectX:将数组指针传递给顶点结构

时间:2014-01-09 01:29:14

标签: c++ arrays pointers data-structures directx

在将VERTEX结构传递给缓冲区时,我注意到了一些奇怪之处。起初我认为这是一个错误的自定义函数,用于读取.obj文件,但调试进一步缩小了问题。举个例子:

struct VERTEX{ 
    XMFLOAT3 Translation; 
    D3DXCOLOR Color;
};

它的实例:

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)},
     };

传递到顶点缓冲区时工作正常。 动态创建结构的数组实例会产生奇怪的结果。我会看到一个顶点出现,或者没有。这是一个例子,假设foo是一个返回[working] 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和bar混合了。这篇文章现在显示了正确的例子。

1 个答案:

答案 0 :(得分:1)

问题在于这一行

  

巴= FOO;

     

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

bar是VERTEX的指针,而不是x86机器上的VERTEX数组,sizeof(bar)== 4,因此您不会复制所有元素。

你可以先计算你需要多少个Vertex元素,然后在使用memcpy时,使用sizeof(VERTEX)* vertex_count。