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

Create struct for vertex buffer on DX9

本文关键字:缓冲区 创建 结构 顶点 DX9      更新时间:2023-10-16

我在DirectX项目中遇到了一个巨大的问题。我需要为vertexbuffer制作结构。。

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

    }
}
}

但这对我不起作用。:(我不知道怎么做。请帮忙。谢谢。

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

首先,这是行不通的:

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

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

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

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