我正在尝试将内容添加到我的工作代码中,但在调用CreateInputLayout()时它返回错误 [Invalid Arg] 。
在我添加纹理内容之前它可以工作,但是当我添加它时会失败。
编译的着色器文件没有错误。
我认为我制作布局的方式很糟糕。它是否正确?
C++ 顶点结构:
struct VertexData{
XMFLOAT3 Pos;
XMFLOAT4 Color;
XMFLOAT2 TexCoord;
};
C++ 布局:
D3D11_INPUT_ELEMENT_DESC inputLayout[]={
{ "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 },
{ "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, 28, D3D11_INPUT_PER_VERTEX_DATA, 0 },
}; uint lSize=sizeof(inputLayout)/sizeof(inputLayout[0]);
着色器代码:
// Stuff from DX Tutorial 7
Texture2D txDiffuse : register( t0 );
SamplerState samLinear : register( s0 );
cbuffer ViewData : register(b0){
matrix World;
matrix View;
matrix Projection;
}
struct VS_INPUT{
float4 pos : SV_POSITION;
float4 color : COLOR0;
float2 tex : TEXCOORD0;
};
struct PS_INPUT{
float4 pos : SV_POSITION;
float4 color : COLOR0;
float2 tex : TEXCOORD0;
};
PS_INPUT VS(VS_INPUT input){
PS_INPUT output=(PS_INPUT)0;
output.pos=mul(input.pos, World);
output.pos=mul(output.pos, View);
output.pos=mul(output.pos, Projection);
output.color = input.color;
output.tex = input.tex;
return output;
}
float4 PS(PS_INPUT input) : SV_Target {
return input.color;
}
编辑:
在对着色器代码进行了一堆玩弄之后,我发现如果我将...
1st position 的语义更改为: float4 pos : POSITION;
第二个位置: float4 pos : SV_POSITION;
...输入布局成功创建。
我在没有 SV_ [系统值] 前缀的情况下都尝试了,但这也失败了。我不知道为什么我不能让它们相同。
语义似乎有点神奇。不知道我是否应该用这个回答我自己的 Q,或者等待更聪明的人更好地回答。