gpt4 book ai didi

c++ - DirectX:在 vector 缓冲区中存储多个顶点

转载 作者:行者123 更新时间:2023-11-28 04:50:15 24 4
gpt4 key购买 nike

我刚刚开始将 DirectX 与 C++ 结合使用。我一直在关注 DirectX 教程。我必须在屏幕上绘制多个矩形。我创建了一个数组来存储矩形的 4 个顶点。这个由 4 个顶点组成的数组被放置在另一个新创建的数组的每个索引中。该数组被传递给 VectorBuffer。 VectorBuffer 无法计算传递给它的数组的正确大小。因此,当调用渲染帧时,屏幕上看不到任何内容。如何在单个 vector 缓冲区中存储多个对象。

我的代码是:

CUSTOMVERTEX** Array = new CUSTOMVERTEX*[2];
CUSTOMVERTEX OurVertices1[] = {
{ 0, 0, 0.0f, 0.0f, D3DCOLOR_XRGB(255, 255, 0), }, //meaning x,y,z,RHW,Dword

{ 100, 0, 0.0f, 0.0f, D3DCOLOR_XRGB(255, 255, 0), },

{ 0, 100, 0.0f, 1.0f, D3DCOLOR_XRGB(255, 255, 0), },


{ 100, 100, 0.0f, 0.0f, D3DCOLOR_XRGB(255, 255, 0), },

};

CUSTOMVERTEX OurVertices2[] = {
{ 200, 200, 0.0f, 0.0f, D3DCOLOR_XRGB(255, 255, 255), },

{ 400, 200, 0.0f, 0.0f, D3DCOLOR_XRGB(255, 255, 255), },

{ 200, 400, 0.0f, 1.0f, D3DCOLOR_XRGB(255, 255, 255), },


{ 400, 400, 0.0f, 0.0f, D3DCOLOR_XRGB(255, 255, 255), },

};

Array[0] = OurVertices1;// placing vertices in array 0 index
Array[1] = OurVertices2; // placing vertices in array 1 index


d3ddev->CreateVertexBuffer(8* sizeof(CUSTOMVERTEX),
0,
CUSTOMFVF,
D3DPOOL_MANAGED,
&v_buffer,
NULL);
VOID* pVoid; // the void* we were talking about

v_buffer->Lock(0, 0, (void**)&pVoid, 0); // locks v_buffer, the buffer we made earlier
memcpy(pVoid, Array,sizeof(Array)); // passing array to vbuffer
v_buffer->Unlock(); // unlock v_buffer

d3ddev->SetFVF(CUSTOMFVF);
d3ddev->SetStreamSource(0, v_buffer, 0, sizeof(CUSTOMVERTEX));

//渲染帧

void render_frame(LPDIRECT3DDEVICE9 d3ddev, LPDIRECT3DVERTEXBUFFER9 v_buffer)
{
d3ddev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);

d3ddev->BeginScene();

// select which vertex format we are using



// select the vertex buffer to display
d3ddev->SetStreamSource(0, v_buffer, 0, sizeof(CUSTOMVERTEX));
d3ddev->SetFVF(CUSTOMFVF);
// copy the vertex buffer to the back buffer
d3ddev->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2);
d3ddev->DrawPrimitive(D3DPT_TRIANGLESTRIP, 4, 2);

// copy the vertex buffer to the back buffer
//d3ddev->DrawPrimitive(D3DPT_TRIANGLESTRIP, 4, 2);

d3ddev->EndScene();

d3ddev->Present(NULL, NULL, NULL, NULL);
}

但无法在屏幕上显示两个对象。有没有其他方法可以将多个对象放入 vector 缓冲区?

最佳答案

您正在创建缓冲区以容纳 8 个顶点结构,但随后通过调用 memcpy(pVoid, Array, sizeof(Array)); 仅将一个指针存储在那里.注意 Array只是一个普通的指针,尽管它的名字。您应该使用顶点数据初始化顶点缓冲区:

CUSTOMVERTEX OurVertices[] =
{
// 1
{ 0, 0, 0.0f, 0.0f, D3DCOLOR_XRGB(255, 255, 0), }, //meaning x,y,z,RHW,Dword
{ 100, 0, 0.0f, 0.0f, D3DCOLOR_XRGB(255, 255, 0), },
{ 0, 100, 0.0f, 1.0f, D3DCOLOR_XRGB(255, 255, 0), },
{ 100, 100, 0.0f, 0.0f, D3DCOLOR_XRGB(255, 255, 0), },
// 2
{ 200, 200, 0.0f, 0.0f, D3DCOLOR_XRGB(255, 255, 255), },
{ 400, 200, 0.0f, 0.0f, D3DCOLOR_XRGB(255, 255, 255), },
{ 200, 400, 0.0f, 1.0f, D3DCOLOR_XRGB(255, 255, 255), },
{ 400, 400, 0.0f, 0.0f, D3DCOLOR_XRGB(255, 255, 255), },
};

memcpy(pVoid, OurVertices, sizeof(OurVertices));

或者您可以通过强制转换 static_cast<CUSTOMVERTEX *>(pVoid) 就地初始化这些顶点.

关于c++ - DirectX:在 vector 缓冲区中存储多个顶点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48359524/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com