在DirectX9 [C ++]中渲染3D对象的最有效方法是什么?

时间:2019-04-15 06:40:44

标签: c++ directx

抱歉,如果我不够具体,我是DirectX编程和Stack Overflow的新手。

问题在于,当我在DirectX9中渲染3D对象时,我必须手动添加“顶点缓冲区”和“索引缓冲区”(用手绘制立方体)。我正在尝试重建一个像《我的世界》这样的世界,但不知道我会怎么做。

我已经尝试过使用“ for循环”,但这只会使整个屏幕出现故障。我也尝试过使用向量,但是我只是感到困惑而没有得到任何结果。

这是我的代码。如您所见,这就是我绘制2个多维数据集的方式。我想知道是否还有另一种更有效的方法,因为我想一次绘制数百个立方体。

void DirectXClass::init_graphics(void)
{
    // create the vertices using the CUSTOMVERTEX struct
    CUSTOMVERTEX vertices[] =
    {
        // Square 1
        { 3.0f, 3.0f, -3.0f, D3DCOLOR_XRGB(0, 0, 255), },
        { -3.0f, 3.0f, -3.0f, D3DCOLOR_XRGB(0, 255, 0), },
        { 3.0f, -3.0f, -3.0f, D3DCOLOR_XRGB(255, 0, 0), },
        { -3.0f, -3.0f, -3.0f, D3DCOLOR_XRGB(0, 255, 255), },
        { 3.0f, 3.0f, 3.0f, D3DCOLOR_XRGB(0, 0, 255), },
        { -3.0f, 3.0f, 3.0f, D3DCOLOR_XRGB(255, 0, 0), },
        { 3.0f, -3.0f, 3.0f, D3DCOLOR_XRGB(0, 255, 0), },
        { -3.0f, -3.0f, 3.0f, D3DCOLOR_XRGB(0, 255, 255), },

        { -3.0f, 3.0f, 3.0f, D3DCOLOR_XRGB(0, 0, 255), },
        { 3.0f, 3.0f, 3.0f, D3DCOLOR_XRGB(0, 255, 0), },
        { -3.0f, -3.0f, 3.0f, D3DCOLOR_XRGB(255, 0, 0), },
        { 3.0f, -3.0f, 3.0f, D3DCOLOR_XRGB(0, 255, 255), },
        { -3.0f, 3.0f, 9.0f, D3DCOLOR_XRGB(0, 0, 255), },
        { 3.0f, 3.0f, 9.0f, D3DCOLOR_XRGB(255, 0, 0), },
        { -3.0f, -3.0f, 9.0f, D3DCOLOR_XRGB(0, 255, 0), },
        { 3.0f, -3.0f, 9.0f, D3DCOLOR_XRGB(0, 255, 255), },

        };

    // create a vertex buffer interface called v_buffer
    //  d3ddev->CreateVertexBuffer(sizeof(vertices) / sizeof(vertices[0]) * sizeof(CUSTOMVERTEX),
    d3ddev->CreateVertexBuffer(sizeof(vertices) / sizeof(vertices[0]) * sizeof(CUSTOMVERTEX),
        0,
        CUSTOMFVF,
        D3DPOOL_MANAGED,
        &v_buffer,
        NULL);

    VOID** pVoid;

    // lock v_buffer and load the vertices into it
    v_buffer->Lock(0, 0, (void**)& pVoid, 0);
    memcpy(pVoid, vertices, sizeof(vertices));
    v_buffer->Unlock();

    short indices[] =
    {
        0, 1, 2,    // side 1
        2, 1, 3,
        4, 0, 6,    // side 2
        6, 0, 2,
        7, 5, 6,    // side 3
        6, 5, 4,
        3, 1, 7,    // side 4
        7, 1, 5,
        4, 5, 0,    // side 5
        0, 5, 1,
        3, 7, 2,    // side 6
        2, 7, 6,

            8, 9, 10,    // side 9
            10, 9, 11,
            12, 8, 14,    // side 10
            14, 8, 10,
            15, 13, 14,    // side 11
            14, 13, 12,
            11, 9, 15,    // side 12
            15, 9, 13,
            12, 13, 8,    // side 13
            8, 13, 9,
            11, 15, 10,    // side 14
            10, 15, 14,
    };

    // create a vertex buffer interface called v_buffer
    //  d3ddev->CreateIndexBuffer(sizeof(indices) / sizeof(indices[0]) * sizeof(short),
    d3ddev->CreateIndexBuffer(sizeof(indices) / sizeof(indices[0]) * sizeof(short),
        0,
        D3DFMT_INDEX16,
        D3DPOOL_MANAGED,
        &i_buffer,
        NULL);

    // lock v_buffer and load the vertices into it
    i_buffer->Lock(0, 0, (void**)& pVoid, 0);
    memcpy(pVoid, indices, sizeof(indices));
    i_buffer->Unlock();
}

0 个答案:

没有答案