DirectX:在矢量缓冲区中存储多个顶点
DirectX: Storing Multiple Vertices in Vector Buffer
我刚刚开始使用带有C++的DirectX。我一直在关注DirectX教程。我必须在屏幕上绘制多个矩形。我创建了一个数组来存储矩形的 4 个顶点。这个由 4 个顶点组成的数组放置在另一个新创建的数组的每个索引中。此数组被传递给 VectorBuffer。VectorBuffer 无法计算传递给它的数组的正确大小。因此,当渲染帧被称为时,屏幕上看不到任何内容。如何在单个矢量缓冲区中存储多个对象。
我的代码是:
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));
//render_frame
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);
}
但无法在屏幕上看到两个对象。有没有其他方法可以在矢量缓冲区中放置多个对象?
您正在创建缓冲区来容纳 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++中的稳定内存中
- std::原子加载和存储都需要吗
- C++:将控制台输出存储在宏中更好吗
- 使用QProcess执行命令,并将结果存储在QStringList中
- 访问存储在向量C++中的结构的多态成员
- 如何从存储在std::映射中的std::集中删除元素
- 存储模板类型以强制转换回派生<T>
- 使用 std::list 存储顶点并使用 SFML 绘制它们
- MoveToEx和LineTo不使用存储在顶点(push_back)win32 c++中的MAKEPOINTS进行绘制
- 使用OpenGL和Eigen来存储顶点数据和glVertexAttribPointer
- 可以在同一 VBO 中存储不同的顶点属性和索引
- DirectX:在矢量缓冲区中存储多个顶点
- 打开"GL着色器存储缓冲区对象"以替换"顶点属性"
- 着色器存储缓冲区中的 OpenGL 顶点
- OpenGL:将Z深度设置为统一深度,而不是冗余存储在顶点内
- BGL:使用绑定属性来存储另一个顶点的顶点描述符
- 存储顶点的所有邻居,快速找到顶点的邻居
- 在顶点着色器中修改着色器存储缓冲对象
- 在opengl阴影映射中存储纹理中的顶点深度信息