如何在D3D11应用程序中将三角形修改为正方形?
D3D11中将三角形改为正方形的实现方法
针对你现有的绿色三角形渲染代码,只需修改顶点数据和绘制逻辑即可实现正方形,以下是两种适合新手的方案:
方案一:直接扩展顶点数组(简单易上手)
通过定义两个拼接的三角形顶点来组成正方形,无需额外创建索引缓冲区:
- 更新顶点数据
替换原有的三角形顶点数组,改为包含6个顶点(两个三角形)的数组:
// 假设你的顶点结构体包含位置和颜色属性 struct Vertex { XMFLOAT3 pos; XMFLOAT4 color; }; Vertex vertices[] = { // 第一个三角形:左上 → 右上 → 右下 { XMFLOAT3(-0.5f, 0.5f, 0.0f), XMFLOAT4(0.0f, 1.0f, 0.0f, 1.0f) }, { XMFLOAT3(0.5f, 0.5f, 0.0f), XMFLOAT4(0.0f, 1.0f, 0.0f, 1.0f) }, { XMFLOAT3(0.5f, -0.5f, 0.0f), XMFLOAT4(0.0f, 1.0f, 0.0f, 1.0f) }, // 第二个三角形:右下 → 左下 → 左上 { XMFLOAT3(0.5f, -0.5f, 0.0f), XMFLOAT4(0.0f, 1.0f, 0.0f, 1.0f) }, { XMFLOAT3(-0.5f, -0.5f, 0.0f), XMFLOAT4(0.0f, 1.0f, 0.0f, 1.0f) }, { XMFLOAT3(-0.5f, 0.5f, 0.0f), XMFLOAT4(0.0f, 1.0f, 0.0f, 1.0f) } };
- 修改绘制调用
原代码中绘制三角形的Draw调用参数是3个顶点,现在改为6个:
pImmediateContext->Draw(6, 0);
方案二:使用索引缓冲区(更高效,适合进阶)
通过索引复用顶点,减少内存占用,是3D渲染的常用方式:
- 定义唯一顶点数组
只需要4个顶点来描述正方形的四个角:
Vertex vertices[] = { { XMFLOAT3(-0.5f, 0.5f, 0.0f), XMFLOAT4(0.0f, 1.0f, 0.0f, 1.0f) }, // 左上 { XMFLOAT3(0.5f, 0.5f, 0.0f), XMFLOAT4(0.0f, 1.0f, 0.0f, 1.0f) }, // 右上 { XMFLOAT3(-0.5f, -0.5f, 0.0f), XMFLOAT4(0.0f, 1.0f, 0.0f, 1.0f) }, // 左下 { XMFLOAT3(0.5f, -0.5f, 0.0f), XMFLOAT4(0.0f, 1.0f, 0.0f, 1.0f) } // 右下 };
- 创建索引数组
用索引指定两个三角形的顶点顺序:
unsigned int indices[] = { 0, 1, 2, // 第一个三角形:左上→右上→左下 1, 3, 2 // 第二个三角形:右上→右下→左下 };
- 创建并绑定索引缓冲区
在创建顶点缓冲区的代码后,添加索引缓冲区的创建逻辑:
D3D11_BUFFER_DESC indexBufferDesc = {}; indexBufferDesc.Usage = D3D11_USAGE_DEFAULT; indexBufferDesc.ByteWidth = sizeof(indices); indexBufferDesc.BindFlags = D3D11_BIND_INDEX_BUFFER; indexBufferDesc.CPUAccessFlags = 0; D3D11_SUBRESOURCE_DATA indexData = {}; indexData.pSysMem = indices; ID3D11Buffer* pIndexBuffer = nullptr; pDevice->CreateBuffer(&indexBufferDesc, &indexData, &pIndexBuffer); // 将索引缓冲区绑定到渲染上下文 pImmediateContext->IASetIndexBuffer(pIndexBuffer, DXGI_FORMAT_R32_UINT, 0);
- 修改绘制调用
将原有的Draw替换为DrawIndexed,指定索引数量:
pImmediateContext->DrawIndexed(6, 0, 0);
注意:两种方案都不需要修改顶点输入布局(Input Layout),因为顶点结构体的属性没有变化。
内容的提问来源于stack exchange,提问作者Guy
相关产品推荐
相关产品推荐

