Несколько буферов вершин Direct3D, элементы без чередования

Я пытаюсь создать 2 буфера вершин, один из которых хранит только позиции, а другой хранит только цвета. Это всего лишь упражнение из книги Фрэнка Луны, чтобы ознакомиться с описанием вершин, расположением и параметрами буфера. Проблема в том, что я чувствую, что сделал все необходимые изменения, и хотя я получаю отображение геометрии, цветовой буфер не работает. Чтобы завершить упражнение, вместо использования Vertex vertices[]={{...},{...},...} из примера кода, где каждая вершина хранит положение и цвет, я использую XMFLOAT3. pos[]={x,y,z...} для позиций и цветов XMFLOAT4[]={a,b,c,...}. Я изменил описание вершины, чтобы каждый элемент ссылался на правильное место ввода:

D3D11_INPUT_ELEMENT_DESC vertexDesc[] =
    {
        {"POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0},
        {"COLOR",    0, DXGI_FORMAT_R32G32B32A32_FLOAT, 1, 0, D3D11_INPUT_PER_VERTEX_DATA, 0}
    };

Я также изменил буфер вершин на устройстве, чтобы ожидать два буфера вершин вместо одного mBoxVB, который ранее был ресурсом, основанным на вершинах вершин []:

ID3D11Buffer* mBoxVB;
ID3D11Buffer* mBoxVBCol;
ID3D11Buffer* combined[2];
...
combined[0]=mBoxVB;
combined[1]=mBoxVBCol;
...
UINT stride[] = {sizeof(XMFLOAT3), sizeof(XMFLOAT4)};
UINT offset = 0;
md3dImmediateContext->IASetVertexBuffers(0, 2, combined, stride, &offset);

Если вам поможет, это код создания буфера:

    D3D11_BUFFER_DESC vbd;
    vbd.Usage = D3D11_USAGE_IMMUTABLE;
    vbd.ByteWidth = sizeof(XMFLOAT3)*8;
    vbd.BindFlags = D3D11_BIND_VERTEX_BUFFER;
    vbd.CPUAccessFlags = 0;
    vbd.MiscFlags = 0;
    vbd.StructureByteStride = 0;

    D3D11_SUBRESOURCE_DATA vinitData;
    vinitData.pSysMem = Shapes::boxEx1Pos;
    HR(md3dDevice->CreateBuffer(&vbd, &vinitData, &mBoxVB));

    D3D11_BUFFER_DESC cbd;
    vbd.Usage = D3D11_USAGE_IMMUTABLE;
    vbd.ByteWidth = sizeof(XMFLOAT4)*8;
    vbd.BindFlags = D3D11_BIND_VERTEX_BUFFER;
    vbd.CPUAccessFlags = 0;
    vbd.MiscFlags = 0;
    vbd.StructureByteStride = 0;

    D3D11_SUBRESOURCE_DATA cinitData;
    cinitData.pSysMem = Shapes::boxEx1Col;
    HR(md3dDevice->CreateBuffer(&vbd, &cinitData, &mBoxVBCol));

Если я использую комбинированный[0]=mBoxVBCol вместо комбинированного[0]=mBoxVB, я получаю другую форму, поэтому я знаю, что там есть некоторые данные, но я не уверен, почему элемент Color не передается в вершинный шейдер. , мне кажется, второй слот игнорируется в операции.


person Piacenti    schedule 31.01.2015    source источник
comment
Можете ли вы также опубликовать исходный код шейдера?   -  person PDizzle745    schedule 31.01.2015
comment
Извините за задержку, но шейдер работал нормально, когда я использовал один буфер вершин. Я нашел проблему и разместил ее.   -  person Piacenti    schedule 01.02.2015


Ответы (1)


Я нашел ответ на проблему. Просто, хотя я указывал массив шагов для обоих буферов, я задавал только одно смещение, поэтому, как только я изменил UINT offset=0; к смещению UINT[]={0,0}; это сработало.

person Piacenti    schedule 01.02.2015