2012-04-02 6 views
1

のDirectX D3D10_SUBRESOURCE_DATAを移入するために構造体のベクトルを使用して後で私はジオメトリシェーダになってしまいます頂点情報を含む単純な構造体を持っている

// 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」はどちらの場合も正しく初期化されていますか? –

+0

numSpritesはどちらの場合でも 'm_SpriteList-> size()'から設定しているベクトルを使用し、 '3 'に設定するだけです。 – Cylindric

+0

'&(m_SpriteList [0]) 'is 'SpriteVertex *'である '&verts'と比較して' SpriteVertex * 'を返します。 – Martin

答えて

1

ポインタがstd::vector<SpriteVertex>* m_SpriteListの場合は、[]演算子を適用する前にポインタを逆参照する必要があります。それ以外の場合は、ポインタのアドレスを取得します。この場合、&((*m_SpriteList)[0])が必要です。

タイプシステムは、void *に書いているときにここでお手伝いできません。良い考え方は、ローカルポインタconst SpriteVertex * verts = &m_vector[0]に最初に書き込んだ後、型システムで間違いをキャッチすることです。

+0

ありがとうございます - これはそれを釘付けにしました。明確にするために、特定の宣言を質問に追加しました。時間を節約できました。 ローカルポインタの良いヒントもありがとう、もう一度ありがとう! – Cylindric

関連する問題