Создать структуру для буфера вершин на DX9

У меня огромная проблема в моем проекте DirectX.
Мне нужно сделать структуру для вершинного буфера ..

CUSTOMVERTEX vertices[] =
{
{ 2.5f, -3.0f, 0.0f, D3DCOLOR_XRGB(0, 0, 255), },
{ 0.0f, 3.0f, 0.0f, D3DCOLOR_XRGB(0, 255, 0), },
{ -2.5f, -3.0f, 0.0f, D3DCOLOR_XRGB(255, 0, 0), },
};

Но как мне сделать это в цикле?
Мне нужно сделать огромное поле из треугольников (3d рельеф). Так,
Я попробовал что-то вроде этого:

void Field_Generation::Field_Generate(int X, int Y, int Z)
{
int zeme[X][Y];
int n=0;

for (int i=0;i < X;i++)
{
for (int j=0;i < Y;j++)
{
zeme[i][j] = rand() % Z;
}
}

for (int i=0;i < X;i++)
{
for (int j=0;i < Y;j++)
{
int color1= rand() % 255;
int color2= rand() % 255;
int color3= rand() % 255;

n++;
CUSTOMVERTEX verticles[n] = {{i,j,zeme[i][j],D3DCOLOR_XRGB(color1,color2,color3),}};}
}
}

Но это не работает для меня. 🙁 Я не могу понять, как это сделать. Помогите, пожалуйста. Спасибо.

1

Решение

Есть много проблем с кодом, который вы разместили.

Прежде всего, это не сработает:

int zeme[X][Y];

Вы не можете создать динамический массив таким образом. Хотя есть разные способы сделать это, я бы порекомендовал использовать std::vector поэтому в верхней части вашего источника убедитесь, что вы включили правильный заголовок:

#include <vector>
using namespace std;

Тогда вы можете определить свой zeme как это:

vector<vector<int> > zeme(X, vector<int>(Y, 0));

Теперь вы можете получить доступ к своим элементам, используя zeme[x][y] как ты уже.

Затем вам нужно создать массив для хранения ваших пользовательских данных вершин, и снова вы можете использовать std::vector, Это должно быть определено как член класса или глобальная переменная, а не определено внутри вашей функции. Что-то вроде:

std::vector<CUSTOMVERTEX> m_pVertices;

Затем внутри вашего цикла инициализируйте каждую запись следующим образом:

CUSTOMVERTEX pVertex = {i, j, zeme[i][j], D3DCOLOR_XRGB(color1,color2,color3) };
m_pVertices.push_back(pVertex);

Позже, когда вам понадобится передать указатель на ваш массив вершин в DirectX для рисования, используйте этот синтаксис, чтобы получить указатель на начало данных:

CUSTOMVERTEX *pData = &m_pVertices[0];

(Обратите внимание, что в C ++ 11 есть альтернативные способы обработки всего вышеперечисленного)

Другой вариант, если у вас уже есть массив CUSTOMVERTEX это инициализировать каждый компонент внутри цикла. Итак, при условии вашего CUSTOMVERTEX имеет такую ​​структуру (наверное, вы ее не показываете):

struct CUSTOMVERTEX
{
float x, y, z;
D3DCOLOR nCol;
};

Затем, внутри вашего цикла, вы можете инициализировать каждую запись следующим образом (вам нужно использовать любые имена, определенные в вашей структуре):

verticles[n].x = i;
verticles[n].y = j;
verticles[n].z = zeme[i][j];
verticles[n].nCol = D3DCOLOR_XRGB(color1,color2,color3);

Таким образом, вы присваиваете каждое значение члену структуры, а не пытаетесь назначить всю структуру одним ударом, как я делал в первом примере.

2

Другие решения

Вы можете установить значение структуры, установив каждый ее компонент, например так.

struct Person
{
int age;
string name;
};

Person person[2];

person[0].age = 20;
person[0].name = "zdd";

person[1].age = 30;
person[1].name = "ddz";
1

По вопросам рекламы [email protected]