使用结构向量填充DirectX D3D10_SUBRESOURCE_DATA

时间:2012-04-02 13:16:23

标签: c++ directx

我有一个简单的结构,其中包含最终将在几何着色器中的顶点信息:

struct SpriteVertex
{
    float topLeft[2];
    float dimensions[2];
    float opacity;  
};

我使用Map类中的各种值填充std::vector<SpriteVertex> m_Sprites(硬编码的数字以简化示例):

// the container is defined in the renderer.h:
std::vector<SpriteVertex>* m_SpriteList;


// the rest is the body of renderer.cpp:
SpriteVertex v;

v.topLeft[0] = 0;
v.topLeft[1] = 0;
v.dimensions[0] = 0.08;
v.dimensions[1] = 0.106667;
v.opacity = 1;
m_Sprites.push_back(v);

v.topLeft[0] = 0.08;
v.topLeft[1] = 0;
v.dimensions[0] = 0.08;
v.dimensions[1] = 0.106667;
v.opacity = 1;
m_Sprites.push_back(v);

v.topLeft[0] = 0.16;
v.topLeft[1] = 0;
v.dimensions[0] = 0.08;
v.dimensions[1] = 0.106667;
v.opacity = 1;
m_Sprites.push_back(v);

然后,稍后在我的渲染器类中,我使用这些数据填充缓冲区:

D3D10_SUBRESOURCE_DATA initData;
initData.pSysMem = &(m_SpriteList[0]);

D3D10_BUFFER_DESC bd;
bd.Usage = D3D10_USAGE_DEFAULT;
bd.ByteWidth = sizeof(SpriteVertex)*(numSprites);
bd.BindFlags = D3D10_BIND_VERTEX_BUFFER;
bd.CPUAccessFlags = 0;
bd.MiscFlags = 0;

pD3DDevice->CreateBuffer(&bd, &initData, &pVertexBuffer));

// Set vertex buffer
UINT stride = sizeof(SpriteVertex);
UINT offset = 0;
pD3DDevice->IASetVertexBuffers(0, 1, &pVertexBuffer, &stride, &offset);

pColorMap->SetResource(pTexture1);
for(UINT p = 0; p < techDesc.Passes; p++)
{
    pTechnique->GetPassByIndex(p)->Apply(0);
    pD3DDevice->Draw(numSprites, 0);
}

我得到的只是一个空白屏幕。

如果我用一个简单的数组替换向量,那么精灵被绘制得很好:

SpriteVertex verts[3];
verts[0].topLeft[0] = 0.0f;
verts[0].topLeft[1] = 0.0f;
verts[0].dimensions[0] = 0.08f;
verts[0].dimensions[1] = 0.106667;
verts[0].opacity = 1;

verts[1].topLeft[0] = 0.08f;
verts[1].topLeft[1] = 0.0f;
verts[1].dimensions[0] = 0.08f;
verts[1].dimensions[1] = 0.106667;
verts[1].opacity = 1;

verts[2].topLeft[0] = 0.16f;
verts[2].topLeft[1] = 0.0f;
verts[2].dimensions[0] = 0.08f;
verts[2].dimensions[1] = 0.106667;
verts[2].opacity = 1;    

D3D10_SUBRESOURCE_DATA initData;
initData.pSysMem = &verts;

显然我可以创建一个临时数组并使用我的向量中的值填充它,或者只是首先使用数组,但我的印象是我可以在向量中访问'传统'数组这样。

我只是在某处滥用指针或引用?

1 个答案:

答案 0 :(得分:1)

如果你有一个指针std::vector<SpriteVertex>* m_SpriteList,那么在应用[]运算符之前,你需要首先取消引用指针,否则你只需得到指针的地址。在这种情况下,您需要&((*m_SpriteList)[0])

当您写入void *时,类型系统无法帮助您。一个好主意是首先写入一个本地指针const SpriteVertex * verts = &m_vector[0],然后用类型系统捕获错误。