You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在D3D11应用程序中将三角形修改为正方形?

D3D11中将三角形改为正方形的实现方法

针对你现有的绿色三角形渲染代码,只需修改顶点数据和绘制逻辑即可实现正方形,以下是两种适合新手的方案:

方案一:直接扩展顶点数组(简单易上手)

通过定义两个拼接的三角形顶点来组成正方形,无需额外创建索引缓冲区:

  1. 更新顶点数据
    替换原有的三角形顶点数组,改为包含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) }
};
  1. 修改绘制调用
    原代码中绘制三角形的Draw调用参数是3个顶点,现在改为6个:
pImmediateContext->Draw(6, 0);

方案二:使用索引缓冲区(更高效,适合进阶)

通过索引复用顶点,减少内存占用,是3D渲染的常用方式:

  1. 定义唯一顶点数组
    只需要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) }    // 右下
};
  1. 创建索引数组
    用索引指定两个三角形的顶点顺序:
unsigned int indices[] =
{
    0, 1, 2,  // 第一个三角形:左上→右上→左下
    1, 3, 2   // 第二个三角形:右上→右下→左下
};
  1. 创建并绑定索引缓冲区
    在创建顶点缓冲区的代码后,添加索引缓冲区的创建逻辑:
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);
  1. 修改绘制调用
    将原有的Draw替换为DrawIndexed,指定索引数量:
pImmediateContext->DrawIndexed(6, 0, 0);

注意:两种方案都不需要修改顶点输入布局(Input Layout),因为顶点结构体的属性没有变化。

内容的提问来源于stack exchange,提问作者Guy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 19:15:43