【发布时间】:2012-10-15 02:40:06
【问题描述】:
我正在尝试向我的工作代码中添加内容,但在调用 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位置的语义更改为:float4 pos : POSITION;
第二个位置:float4 pos : SV_POSITION;
...输入布局成功创建。
我在没有 SV_ [系统值] 前缀的情况下都尝试了,但也失败了。我不知道为什么我不能让它们相同。
Semantics 看起来有点神奇。不知道我是应该用这个回答我自己的问题,还是等待更聪明的人更好地回答。
【问题讨论】: