OBS-D3D11渲染梳理
+ -

ShaderProcessor输入布局

2026-02-02 2 0

顶点着色器有三要素:

  • 顶点,输入布局对象描述如何将顶点缓冲区数据流式传输到 IA 管道阶段。
  • 顶点着色器,编译的字节码
  • 顶点常量空间

输入布局其实是CPU与内存进行数据交互的数据组织方式。所以对于解析的是着色器main函数的输入参数
着色器提供了2种方式来进行输入布局的配置,分别为slot和slot中的偏移,当然也可以混合使用。

  • slot类似于内存空间通道
  • slot偏移类似于内存空间中的偏移
    同一片数据来源可以使用slot的偏移实现,不同数据来源使用不同的slot.

输入布局结构体如下:

typedef struct D3D11_INPUT_ELEMENT_DESC {
  LPCSTR                     SemanticName;
  UINT                       SemanticIndex;
  DXGI_FORMAT                Format;
  UINT                       InputSlot;
  UINT                       AlignedByteOffset;
  D3D11_INPUT_CLASSIFICATION InputSlotClass;
  UINT                       InstanceDataStepRate;
} D3D11_INPUT_ELEMENT_DESC;
  • SemanticName:对应于着色器的参数的语义名,如VertInOut中的SV_Position和TEXCOORD0。

使用std::vector<D3D11_INPUT_ELEMENT_DESC>来存储。
如下着色器代码:

struct VertInOut {
    float4 pos : SV_Position;
    float2 uv : TEXCOORD0;
};
VertInOut main(VertInOut vert_in)
{
    return VSDefault(vert_in);
}

则生成的输入布局为:

名称 类型
SemanticName “SV_Position” const char *
SemanticIndex 0 unsigned int
Format DXGI_FORMAT_R32G32B32A32_FLOAT (2) DXGI_FORMAT
InputSlot 0 unsigned int
AlignedByteOffset 0 unsigned int
InputSlotClass D3D11_INPUT_PER_VERTEX_DATA (0) D3D11_INPUT_CLASSIFICATION
InstanceDataStepRate 0 unsigned int
名称 类型
SemanticName “TEXCOORD” const char *
SemanticIndex 0 unsigned int
Format DXGI_FORMAT_R32G32_FLOAT (16) DXGI_FORMAT
InputSlot 1 unsigned int
AlignedByteOffset 0 unsigned int
InputSlotClass D3D11_INPUT_PER_VERTEX_DATA (0) D3D11_INPUT_CLASSIFICATION
InstanceDataStepRate 0 unsigned int
// 推测的完整输入布局配置
D3D11_INPUT_ELEMENT_DESC layout[] =
{
    // 位置数据在缓冲区0
    { "SV_Position", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 0,D3D11_INPUT_PER_VERTEX_DATA, 0 },

    // UV数据在缓冲区1
    { "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 1, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 }
};

0 篇笔记 写笔记

作者信息
我爱内核
Windows驱动开发,网站开发
好好学习,天天向上。
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!