C++ - буфер, объединяющий добавление дополнительных пустых значений

Я пытаюсь заполнить два буфера, объект буфера индекса и объект буфера вершин в С++.

// Create the IBO and VBO data
GLushort* iboData = new GLushort[polyProcessed * 3];
Vertex* vboData = new Vertex[vertProcessed];

int iboPos = 0;
int vboPos = 0;

// Create the VBO and IBO
for(int i = 0; i < fragMap[0x36]; i++)
{
    // Copy the data to the IBO
    memcpy(iboData + iboPos, zmeshes[i].indices, zmeshes[i].numPoly * 3 * sizeof(GLushort));//sizeof(*zmeshes[i].indices));

    // Advance the position
    iboPos += zmeshes[i].numPoly * 3 * sizeof(GLshort);

    // Copy the data to the VBO
    memcpy(vboData + vboPos, zmeshes[i].vertices, zmeshes[i].numVert * sizeof(Vertex));//sizeof(*zmeshes[i].vertices));

    // Advance the position
    vboPos += zmeshes[i].numVert * sizeof(Vertex);

    errorLog.writeSuccess("Build log: VBO size %i VBO pos %i IBO size %i IBO pos %i", zmeshes[i].numVert * sizeof(Vertex), 
                          vboPos, zmeshes[i].numPoly * 3 * sizeof(GLshort), iboPos);
}

Это просто получение размера копируемых данных, их копирование, а затем продвижение позиции (куда поместить следующие данные в буфер).

Я получаю такой вывод:

<---> Index dump: 0
<---> Index dump: 1
<---> Index dump: 2
<---> Index dump: 2
<---> Index dump: 3
<---> Index dump: 0
<---> Index dump: 4
<---> Index dump: 5
<---> Index dump: 23
<---> Index dump: 23
<---> Index dump: 22
<---> Index dump: 4
<---> Index dump: 26
<---> Index dump: 6
<---> Index dump: 7
<---> Index dump: 7
<---> Index dump: 8
<---> Index dump: 26
<---> Index dump: 9
<---> Index dump: 34
<---> Index dump: 10
<---> Index dump: 10
<---> Index dump: 11
<---> Index dump: 9
<---> Index dump: 12
<---> Index dump: 25
<---> Index dump: 13
<---> Index dump: 13
<---> Index dump: 14
<---> Index dump: 12
<---> Index dump: 13
<---> Index dump: 25
<---> Index dump: 31
<---> Index dump: 31
<---> Index dump: 15
<---> Index dump: 13
<---> Index dump: 28
<---> Index dump: 33
<---> Index dump: 16
<---> Index dump: 36
<---> Index dump: 33
<---> Index dump: 35
<---> Index dump: 31
<---> Index dump: 24
<---> Index dump: 15
<---> Index dump: 17
<---> Index dump: 25
<---> Index dump: 18
<---> Index dump: 18
<---> Index dump: 25
<---> Index dump: 12
<---> Index dump: 27
<---> Index dump: 34
<---> Index dump: 9
<---> Index dump: 2
<---> Index dump: 1
<---> Index dump: 19
<---> Index dump: 30
<---> Index dump: 32
<---> Index dump: 20
<---> Index dump: 29
<---> Index dump: 25
<---> Index dump: 17
<---> Index dump: 17
<---> Index dump: 21
<---> Index dump: 29
<---> Index dump: 32
<---> Index dump: 26
<---> Index dump: 8
<---> Index dump: 8
<---> Index dump: 20
<---> Index dump: 32
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0
<---> Index dump: 0

Это можно увидеть как скопированные правильные 72 значения и 72 0, скопированные позади них. Я сделал что-то не так при копировании моего буфера или это указывает на проблему в другом месте?

Дальнейшее объяснение:

Сетка 1 - 72 индекса Сетка 2 - 300 индексов Сетка 3 - 45 индексов.

Используя приведенную выше функцию, он создает буфер, который делает следующее:

[0]-[71] - все вершины сетки 1 правильные [72]-[142] - пусто [142]-[EndofBuffer] - сетка 2

Он создает повторяющиеся размеры, заполненные нулями.


person Satchmo Brown    schedule 27.07.2012    source источник
comment
Вы говорите, что должно быть только 72 значения. Вы уверены, что fragMap[0x36] равно 72 во время этого цикла? Если бы оно было больше, чем количество элементов в zmeshes, он читал бы дальше конца zmeshes и записывал ненужные значения в iboData и vboData. С другой стороны, код, сгенерировавший этот дамп индекса, может слишком много раз зацикливаться. Я бы проверил значение условия цикла как в цикле выше, так и в цикле, который генерирует дамп индекса, и подтвердил, что они оба соответствуют количеству элементов, которые вы пытаетесь скопировать из zmeshes.   -  person Josh Townzen    schedule 27.07.2012
comment
@JoshTownzen fragMap — это карта, в которой хранится количество фрагментов. Я искал фрагменты 0x36. Проблема заключается в том, что каждый раз, когда я копирую в буфер, он копирует его в 'x' местах, где он должен быть, где x - размер предыдущего буфера. Я обновил свой пост, чтобы быть более понятным.   -  person Satchmo Brown    schedule 27.07.2012
comment
Просто чтобы подтвердить, когда вы говорите, что я искал фрагменты 0x36, вы имеете в виду, что вы ищете столько фрагментов, сколько указано в элементе 0x36 fragMap? Если это так, я бы все же предложил отладить значение fragMap[0x36], чтобы убедиться, что оно содержит число, которое вы ищете. Если вместо этого вы имели в виду, что ищете буквальные фрагменты 0x36 (54 в десятичном формате), то это не то, что будет делать цикл выше.   -  person Josh Townzen    schedule 27.07.2012
comment
@JoshTownzen Это правильно. Он возвращает количество фрагментов 0x36. 0x36 в данном случае — это тип, который в моей карте возвращает количество фрагментов типа 0x36. Я исправил проблему. Решение ниже   -  person Satchmo Brown    schedule 27.07.2012


Ответы (2)


Поскольку iboData является GLushort*, то iboData+iboPos фактически указывает на ячейку памяти (int)iboData + iboPos * sizeof(GLushort). Вы путаете смещения байтов со смещениями массива. В ваших двух операторах += не умножайте на sizeof, которое вы использовали в memcpy, поскольку iboPos записывает смещение GLushort, а не смещение в байтах.

person Keith Randall    schedule 27.07.2012

Кит Рэндалл нашел правильное решение. Я путал два. Вот что я в итоге сделал:

// Create the VBO and IBO
    for(int i = 0; i < fragMap[0x36]; i++)
    {
        // Copy the data to the IBO
        memcpy(&iboData[iboPos], zmeshes[i].indices, zmeshes[i].numPoly * 3 * sizeof(GLushort));//sizeof(*zmeshes[i].indices));

        // Advance the position
        iboPos += zmeshes[i].numPoly * 3;

        // Copy the data to the VBO
        memcpy(&vboData[vboPos], zmeshes[i].vertices, zmeshes[i].numVert * sizeof(Vertex));//sizeof(*zmeshes[i].vertices));

        // Advance the position
        vboPos += zmeshes[i].numVert;

        errorLog.writeSuccess("Build log: VBO size %i VBO pos %i IBO size %i IBO pos %i", zmeshes[i].numVert * sizeof(Vertex), 
                              vboPos, zmeshes[i].numPoly * 3 * sizeof(GLshort), iboPos);
    }

Я хотел смещение в массив. Не смещение в буфер.

person Satchmo Brown    schedule 27.07.2012