输入布局
2024-11-25
20
0
输入布局不得不从文章https://www.vaczh.com/article/detail-48.html 中引用下张图片:
输入布局指的是顶点着色器的输入布局
输入布局使用D3D11_INPUT_ELEMENT_DESC结构体来描述
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;
语义支持的有:
输入 | 说明 | 类型 |
---|---|---|
BINORMAL[n] | Binormal | float4 |
BLENDINDICES[n] | 混合索引 | uint |
BLENDWEIGHT[n] | 混合权重 | FLOAT |
COLOR[n] | 漫射和反射颜色 | float4 |
NORMAL[n] | 法向矢量 | float4 |
POSITION[n] | 对象空间中的顶点位置。 | float4 |
POSITIONT | 变换的顶点位置。 | float4 |
PSIZE[n] | 点大小 | FLOAT |
TANGENT[n] | 正切 | float4 |
TEXCOORD[n] | 纹理坐标 | float4 |
一个示例如下:
// 创建顶点布局
D3D11_INPUT_ELEMENT_DESC vertexLayout[2] = {
{ "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 },
{ "COLOR", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0 },
};
HR(md3dDevice->CreateInputLayout(vertexLayout, ARRAYSIZE(vertexLayout), blob->GetBufferPointer(), blob->GetBufferSize(), &mVertexLayout));
md3dImmediateContext->IASetInputLayout(mVertexLayout);// 设定输入布局
ReleaseCOM(blob)
顶点着色器的代码可见:
cbuffer cbPerObject : register(b0)
{
row_major matrix wvp; // 默认列主矩阵
float gTime;
};
struct VertexIn
{
float3 PosL : POSITION;
float4 Color : COLOR;
};
struct VertexOut
{
float4 PosH : SV_POSITION;
float4 Color : COLOR;
};
VertexOut VS(VertexIn pIn)
{
// 练习6.6 shader在重新生成时,记得将vso和pso文件给删除
//pIn.PosL.xy += 0.5f*sin(pIn.PosL.x)*sin(3.0f*gTime);
//pIn.PosL.z *= 0.6f + 0.4f*sin(2.0f*gTime);
VertexOut pOut;
pOut.PosH = mul(float4(pIn.PosL, 1.0f), wvp);
pOut.Color = pIn.Color;
return pOut;
}