利用 Direct3D 绘制几何体—1.顶点与输入布局

Direct3D 中的顶点可以存储其他属性数据。为了创建自定义的顶点格式,首先要创建一个结构体来容纳选定的顶点数据。

例如:

struct Vertex1 // 位置和颜色信息组成
{
  XMFLOAT3 Pos;
  XMFLOAT4 Color;
};
struct Vertex2 // 位置、法向量以及两组 2D 纹理坐标组成
{
  XMFLOAT3 Pos;
  XMFLOAT3 Normal;
  XMFLOAT2 Tex0;
  XMFLOAT2 Tex1;
};

定义了顶点结构体之后,我们还需要向 Direct3D 提供该顶点结构体的描述,使它了解应怎样来处理结构体中的每个成员。用户提供给 Direct3D 的这种描述被称为输入布局描述 (input layout description),用结构体 D3D12_INPUT_LAYOUT_DESC 来表示。

typedef struct D3D12_INPUT_LAYOUT_DESC
{
  const D3D12_INPUT_ELEMENT_DESC *pInputElementDescs;
  UINT NumElements;
} D3D12_INPUT_LAYOUT_DESC;

输入布局描述实由两部分组成:一个 D3D12_INPUT_ELEMENT_DESC 元素构成的数组,以及该数组的元素数量

D3D12_INPUT_ELEMENT_DESC 数组中的元素依次描述了顶点结构体中所对应的成员。这就是说,如果某顶点结构体中有两个成员,那么与之对应的 D3D12_INPUT_ELEMENT_DESC 数组也将存有两个元素。D3D12_INPUT_ELEMENT_DESC 结构体的定义如下:

typedef struct D3D12_INPUT_ELEMENT_DESC
{
  LPCSTR SemanticName;
  UINT SemanticIndex;
  DXGI_FORMAT Format;
  UINT InputSlot;
  UINT AlignedByteOffset;
  D3D12_INPUT_CLASSIFICATION InputSlotClass;
  UINT InstanceDataStepRate;
} D3D12_INPUT_ELEMENT_DESC;

1.SemanticName: 一个与元素相关联的特定字符串,我们称之为语义 (semantic),它传达了元素的预期用途。该参数可以是任意合法的语义名。通过语义即可将顶点结构体 (struct Vertex) 中的元素与顶点着色器输入签名 (vertex shader input signature,signature: 着色器的输入或输出参数列表) 中的元素一一映射起来。

2.SemanticIndex: 附加到语义上的索引

3.Format: 在 Direct3D 中,要通过枚举类型 DXGI_FORMAT 中的成员来指定顶点元素的格式 (即数据类型)。常用的格式:

DXGI_FORMAT_R32_FLOAT     // 1D 32位浮点标量

DXGI_FORMAT_R32G32_FLOAT    // 2D 32位浮点向量

DXGI_FORMAT_R32G32B32_FLOAT  // 3D 32位浮点向量

DXGI_FORMAT_R32G32B32A32_FLOAT // 4D 32位浮点向量

DXGI_FORMAT_R8_UINT     // 1D 8位无符号整型标量

DXGI_FORMAT_R16G16_SINT   // 2D 16位有符号整型向量

DXGI_FORMAT_R32G32B32_UINT // 3D 32位无符号整型向量

DXGI_FORMAT_R8G8B8A8_SINT  // 4D 8位有符号整型向量

DXGI_FORMAT_R8G8B8A8_UINT  // 4D 8位无符号整型向量

4.InputSlot: 指定传递元素所用的输入槽 (input slot index) 索引。Direct3D 共支持 16 个输入槽(索引值为 0~15),可以通过它们来向输入装配阶段传递顶点数据。目前我们只会用到输入槽 0(即所有的顶点元素都来自同一个输入槽)。

5.AlignedByteOffset: 在特定输入槽中,从 C++ 顶点结构体的首地址到其中某点元素起始地址的偏移量(用字节表示)。例如,在 Vertex2 中:

struct Vertex2
{
  XMFLOAT3 Pos;  // 偏移量为0字节
  XMFLOAT3 Normal; // 偏移量为12字节
  XMFLOAT2 Tex0;  // 偏移量为24字节
  XMFLOAT2 Tex1;  // 偏移量为32字节
};

InputSlotClass: 我们暂且把此参数指定为 D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA。而另一选项(D3D12_INPUT_CLASSIFICATION_PER_INSTANCE_DATA) 则用于实现实例化 (instancing) 这种高级技术。

InstanceDataStepRate: 目前仅将此值指定为 0。若要采用实例化这种高级技术,则将此参数设为1

前面的 Vertex1 和 Vertex2 这两个顶点结构体的例子来说,相应的输入布局描述为:

D3D12_INPUT_ELEMENT_DESC desc1[] =
{
  {"POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, 
    D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0},
  {"COLOR", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 12, 
    D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0}
};

D3D12_INPUT_ELEMENT_DESC desc2[] =
{
  {"POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, 
    D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0},
  {"NORMAL",  0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 12,
    D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0},
  {"TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT,  0, 24, 
    D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0}
  {"TEXCOORD", 1, DXGI_FORMAT_R32G32_FLOAT,  0, 32, 
    D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0}
};
  • 22
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Direct3D11 是 Windows 平台上的一种图形 API,用于开发 3D 游戏和应用程序。模型绘制Direct3D11 中最基本的操作之一,可以通过以下步骤实现: 1. 加载模型数据:从文件中读取模型数据,包括顶点、索引、材质等信息。可以使用第三方库(如 Assimp)来实现模型数据的加载。 2. 创建顶点缓冲区:将模型顶点数据存储到顶点缓冲区中,可以使用 ID3D11Device::CreateBuffer() 函数来创建顶点缓冲区对象。需要指定缓冲区的大小、用途(如顶点缓冲区)、CPU 访问方式等属性。 3. 创建索引缓冲区:将模型索引数据存储到索引缓冲区中,可以使用 ID3D11Device::CreateBuffer() 函数来创建索引缓冲区对象。需要指定缓冲区的大小、用途(如索引缓冲区)、CPU 访问方式等属性。 4. 创建常量缓冲区:定义渲染管线中的常量变量,可以使用 ID3D11Device::CreateBuffer() 函数来创建常量缓冲区对象。需要指定缓冲区的大小、用途(如常量缓冲区)、CPU 访问方式等属性。 5. 设置顶点输入布局:指定顶点缓冲区中的数据类型和排列方式,可以使用 ID3D11Device::CreateInputLayout() 函数来创建顶点输入布局对象。 6. 设置渲染状态:指定渲染管线中的各项状态,如混合、深度测试、采样等状态。 7. 设置着色器程序:指定渲染管线中的顶点着色器、像素着色器等程序。 8. 绘制模型:使用 ID3D11DeviceContext::DrawIndexed() 函数来绘制模型,该函数需要指定顶点数、索引数、起始索引等参数。 需要注意的是,以上步骤只是模型绘制的基本流程,实际应用中还需要根据具体需求进行调整和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值