Использование вектора структур для заполнения DirectX D3D10_SUBRESOURCE_DATA - PullRequest
1 голос
/ 02 апреля 2012

У меня есть простая структура, которая содержит информацию о вершинах, которая в итоге окажется в геометрическом шейдере:

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

Я заполняю std::vector<SpriteVertex> m_Sprites различными значениями в классе Map (числа, жестко запрограммированные для упрощения примера):

// 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 Ответ

1 голос
/ 02 апреля 2012

Если у вас есть указатель std::vector<SpriteVertex>* m_SpriteList, вам нужно сначала разыменовать указатель, прежде чем применять оператор [], в противном случае вы просто получите адрес указателя.В этом случае вам понадобится &((*m_SpriteList)[0]).

Система типов здесь вам не поможет, когда вы пишете в void *.Хорошая идея - сначала написать в локальный указатель const SpriteVertex * verts = &m_vector[0], который затем фиксирует ошибку с помощью системы типов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...