在DX9上为顶点缓冲区创建结构

时间:2013-12-04 18:07:25

标签: c++ directx directx-9 vertex vertex-buffer

我的DirectX项目存在很大问题。 我需要为vertexbuffer创建struct ..

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), },
};

但是我该怎么做呢? 我需要制作巨大的三角形场(三维地形)。所以, 我试过这样的事情:

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),}};


    }
}
}

但这不适合我。 :(我无法弄明白该怎么做。请帮助。谢谢。

2 个答案:

答案 0 :(得分:2)

您发布的代码存在许多问题。

首先,这不起作用:

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);

因此,您将每个值分配给结构的成员,而不是像在第一个示例中那样尝试在一次命中中分配整个结构。

答案 1 :(得分:1)

您可以通过设置每个组件的组件来设置结构的值,如下所示。

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";