Немного фона для тех, кто не знает DirectX. Вершина - это не просто позиция XYZ, она может содержать и другие данные. DirectX использует систему, известную как Flexible Vertex Format, FVF, чтобы позволить вам определить, в каком формате вы хотите, чтобы ваши вершины были. Вы определяете их, передавая DirectX число, которое использует побитовое или для его построения, например, (D3DFVF_XYZ | D3DFVF_DIFFUSE)
означает, что вы собираемся начать использовать (начиная с DirectX) вершины, имеющие компоненты XYZ (три числа с плавающей запятой) и RGB (DWORD / unsigned long).
Чтобы передать свои вершины на видеокарту, вы в основном блокируете память в графической карте, где находится ваш буфер, и используете memcpy для переноса массива.
Ваш массив - это массив структур, которые вы определяете сами, поэтому в этом случае вы бы создали структуру, подобную ...
struct CUSTOMVERTEX {
FLOAT X, Y, Z;
DWORD COLOR;
};
Затем вы создаете массив типа CUSTOMVERTEX и заполняете поля данных.
Я думаю, что моя лучшая оценка - позволить моему классу создать массив каждого типа компонента, поэтому массив struct pos{ flaot x,y,z;};
массив struct colour{ DWROD colour;};
и т. Д.
Но тогда мне нужно будет объединить их вместе, чтобы у меня был массив структур, подобных CUSTOMVERTEX.
Теперь, я думаю, что я создал функцию, которая будет объединяться в массивы, но я не уверен, что она будет работать так, как задумано, вот она (в настоящее время отсутствует способность действительно возвращать этот «чересстрочный» массив)
void Utils::MergeArrays(char *ArrayA, char *ArrayB, int elementSizeA, int elementSizeB, int numElements)
{
char *packedElements = (char*)malloc(numElements* (elementSizeA, elementSizeB));
char *nextElement = packedElements;
for(int i = 0; i < numElements; ++i)
{
memcpy(nextElement, (void*)ArrayA[i], elementSizeA);
nextElement += elementSizeA;
memcpy(nextElement, (void*)ArrayB[i], elementSizeB);
nextElement += elementSizeB;
}
}
при вызове этой функции вы передадите два массива, которые вы хотите объединить, а также размер элементов в каждом массиве и количество элементов в вашем массиве.
Я спрашивал об этом в чате некоторое время, пока SO не работал. Несколько вещей, чтобы сказать.
Я имею дело с довольно маленькими наборами данных, такими как 100 вершин, и это (теоретически) является скорее задачей инициализации, поэтому должен выполняться только один раз, поэтому я потрачу немного времени.
Мой последний массив, для которого я хочу использовать memcpy для передачи на видеокарту, не должен содержать отступов, это должны быть смежные данные.
РЕДАКТИРОВАТЬ Объединенный массив данных вершин будет передан в GPU, это сначала делается с помощью запроса GPU установить void * в начало памяти, к которой у меня есть доступ, и запроса пространства размер моего customVertex * NumOfVertex. Так что, если моя функция mergeArray теряет типы внутри нее, это нормально, только если я получу свой единственный объединенный массив для передачи в одном блоке / EDIT
Наконец, это хорошая возможность для плотины. Я лаю не то дерево с этим, так что, может быть, это гораздо более простой способ просто не иметь этой проблемы, но часть меня вырыла мои исцеления и хочет, чтобы эта система работала, поэтому я был бы признателен, зная, как заставить такую систему работать (вещь с чередующимися массивами)
Большое вам спасибо ... Мне нужно успокоить голову, так что я с нетерпением жду каких-либо идей по этой проблеме.