2012-04-02 59 views
1

我有一個簡單的結構,它包含頂點信息,將在幾何着色器結束:使用結構的載體來填充的DirectX D3D10_SUBRESOURCE_DATA

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

我填充各種值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; 

很顯然,我可以只創建一個臨時數組,並從我的向量中的值來填充它,或者只是使用數組首先,但我的印象是,我可以通過這種方式訪問​​矢量中的「傳統」陣列。

我只是濫用指針或引用的地方?

+0

在這兩種情況下'numSprites'都被正確初始化了嗎? – 2012-04-02 13:23:04

+0

在兩種情況下,numSprites都是'3',使用我從'm_SpriteList-> size()'設置的向量,而對於數組,只需設置爲'3' – Cylindric 2012-04-02 13:24:42

+0

'&(m_SpriteList [0])'是一個'SpriteVertex *',而'&verts'是一個'SpriteVertex **'。 – Martin 2012-04-02 13:27:11

回答

1

如果你有一個指針std::vector<SpriteVertex>* m_SpriteList那麼你需要先取消引用指針,然後再應用[]運算符,否則你只需得到指針的地址。在這種情況下,您需要&((*m_SpriteList)[0])

當您寫入void *時,型號系統無法幫助您。一個好主意是先寫入一個本地指針const SpriteVertex * verts = &m_vector[0],然後用類型系統捕捉錯誤。

+0

非常感謝 - 這釘了它。爲了清晰起見,我在問題中添加了特定聲明 - 可能會節省一些時間。 與本地指針太好,再次感謝! – Cylindric 2012-04-02 14:52:36