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 }
};
OBS-D3D11渲染梳理





