DirectX11 创建输入布局

来源:互联网 发布:山治两年后的实力知乎 编辑:程序博客网 时间:2024/05/16 17:54

创建输入布局

1. 输入布局有什么作用?

当我们发送几何图形到显卡上时(发送给顶点着色器),我们是发送它的一大块数据。 为了让 Direct3D 知道所定义的各种属性,它们的顺序,和大小,我们使用一种叫做输入布局的东西告诉 API 关于我们所绘制的几何图形的数据的顶点布局。在Direct3D 中,我们使用一个类型为 D3D11_INPUT_ELEMENT_DESC 的数组来描述一个顶点结构的顶点布局。该类型结构有如下成员:

  • SemanticName,语义名字,是一个描述元素目的的字符串。例如元素作为顶点的位置,则它的语义就是“ POSITION”。我们可以使该元素通过语义“ COLOR”用于顶点颜色,通过“ NORMAL”用于法线向量等等。
  • SemanticIndex,语义索引,一个顶点有多个元素用于相同的语义但是却值不同,例如如果一个顶点有两种颜色,那么我们能够使用一个语义索引 0 表示第一种颜色,索引 1 表示第二种颜色。更多示例如,一个顶点有多个贴图坐标,当 UV 贴图和光照贴图同时使用时就产生了上述情况。
  • Format,元素的格式,例如使用 X,Y 和 Z 浮点值表示一个位置,我们在该顶点所使用的格式就是DXGI_FORMAT_R32G32B32_FLOAT, 这里 32bits(4 字节)是给 R,G,B 的分量大小。尽管格式分量以 R,G,B 来命名,但它能够用来表示 X,Y,Z。不要让颜色的概念迷惑了你,实际上这些格式可以用来表示很多而不仅仅是颜色。
  • InputSlot,输入槽,在 Direct3D 中,能够同时绑定和传递多套顶点缓存,我们使用该成员来指定的顶点缓存索引。
  • AlignedByteOffset,字节对齐偏移量,它用来告诉 Direct3D 顶点开始位置的偏移,当指定了元素的顶点缓存后。
  • InputSlotClass,它用于描述是否元素使用每一个顶点或者每一个实例(逐对象)。 逐对象属性处理一个高级主题,叫做实例化,这个技术用于绘制多个有相同网格表面的对象,而使用一个绘制调用——该技术使得渲染性能得到很大的提升。
  • InstanceDataStepRate,它用于告诉 Direct3D在场景中需要绘制多少个实例。

2. 如何创建顶点输入布局?

输入布局由调用 Direct3D 设备函数 CreateInputLayout所创建。该函数有5个参数:
第一个参数是顶点布局描述对象数组。
第二个参数是上面的数组的大小。
第三个参数有输入标识的已经编译的顶点着色器代字节码,它将会被数组的每个元素所验证
第四个参数是已经编译的顶点着色器字节码大小

3. 创建输入布局示例代码

D3D11_INPUT_ELEMENT_DESC vertexLayout[] ={    { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 }};unsigned int totalLayoutElements = ARRAYSIZE( vertexLayout );HRESULT result = d3dDevice_->CreateInputLayout( vertexLayout,    totalLayoutElements, vsBuffer->GetBufferPointer( ),    vsBuffer->GetBufferSize( ), &inputLayout );vsBuffer->Release( );if( FAILED( d3dResult ) ){    return false;}
0 0