SetInputLayout、VertexShader 和 PixelShader 之间不匹配
Mismatch between SetInputLayout, VertexShader, and PixelShader
它们之间有明显的不匹配,但我看不出它们不匹配的原因或方式。我已经看了很久了,现在什么都看不到了,所以也许再多几双眼睛....
Here are the members of the vertex struct:
XMFLOAT4 _vertexPosition;
XMFLOAT4 _vertexColor;
输入布局说明如下:
static const D3D11_INPUT_ELEMENT_DESC vertexLayout[] =
{
{ "SV_POSITION", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 },
{ "COLOR", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 16, D3D11_INPUT_PER_VERTEX_DATA, 0 },
};
这是顶点着色器输入:
struct VertexShaderInput
{
float4 Position : SV_POSITION0;
float4 Color : COLOR0;
};
最后,像素着色器输入:
struct PixelShaderInput
{
float4 Color : COLOR0;
};
目前仅在两个阶段之间的最终误差是:
D3D11 ERROR: ID3D11DeviceContext::Draw: Input Assembler - Vertex Shader linkage error: Signatures between stages are incompatible. The input stage requires Semantic/Index (SV_POSITION,0) as input, but it is not provided by the output stage. [ EXECUTION ERROR #342: DEVICE_SHADER_LINKAGE_SEMANTICNAME_NOT_FOUND]
D3D11 ERROR: ID3D11DeviceContext::Draw: Vertex Shader - Pixel Shader linkage error: Signatures between stages are incompatible. Semantic 'COLOR' is defined for mismatched hardware registers between the output stage and input stage. [ EXECUTION ERROR #343: DEVICE_SHADER_LINKAGE_REGISTERINDEX]
对我来说,vertexLayout 定义似乎与顶点着色器输入匹配,但运行时肯定不匹配!谁能发现我搞砸了什么?任何提示将不胜感激!谢谢!
顶点着色器需要输出 SV_POSITION
,因为光栅器使用它来确定像素着色器应该 运行 的位置。像素着色器输入没有 SV_POSITION
是合法的,但在这种情况下,您不能使用相同的 PixelShaderInput 结构作为 VS 输出和 PS 输入。
同样按照惯例,您不使用带位置的语义索引,因此在您的 HLSL 着色器中将 SV_POSITION0
更改为 SV_POSITION
——一个顶点不能同时出现在两个地方.
逐顶点颜色顶点着色器输入通常为 COLOR
,而 COLOR0
/COLOR1
用于顶点着色器 output/pixel 着色器输入用于漫反射与镜面反射颜色。
struct VertexShaderInput
{
float4 Position : SV_POSITION;
float4 Color : COLOR;
};
它们之间有明显的不匹配,但我看不出它们不匹配的原因或方式。我已经看了很久了,现在什么都看不到了,所以也许再多几双眼睛....
Here are the members of the vertex struct:
XMFLOAT4 _vertexPosition;
XMFLOAT4 _vertexColor;
输入布局说明如下:
static const D3D11_INPUT_ELEMENT_DESC vertexLayout[] =
{
{ "SV_POSITION", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 },
{ "COLOR", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 16, D3D11_INPUT_PER_VERTEX_DATA, 0 },
};
这是顶点着色器输入:
struct VertexShaderInput
{
float4 Position : SV_POSITION0;
float4 Color : COLOR0;
};
最后,像素着色器输入:
struct PixelShaderInput
{
float4 Color : COLOR0;
};
目前仅在两个阶段之间的最终误差是:
D3D11 ERROR: ID3D11DeviceContext::Draw: Input Assembler - Vertex Shader linkage error: Signatures between stages are incompatible. The input stage requires Semantic/Index (SV_POSITION,0) as input, but it is not provided by the output stage. [ EXECUTION ERROR #342: DEVICE_SHADER_LINKAGE_SEMANTICNAME_NOT_FOUND]
D3D11 ERROR: ID3D11DeviceContext::Draw: Vertex Shader - Pixel Shader linkage error: Signatures between stages are incompatible. Semantic 'COLOR' is defined for mismatched hardware registers between the output stage and input stage. [ EXECUTION ERROR #343: DEVICE_SHADER_LINKAGE_REGISTERINDEX]
对我来说,vertexLayout 定义似乎与顶点着色器输入匹配,但运行时肯定不匹配!谁能发现我搞砸了什么?任何提示将不胜感激!谢谢!
顶点着色器需要输出 SV_POSITION
,因为光栅器使用它来确定像素着色器应该 运行 的位置。像素着色器输入没有 SV_POSITION
是合法的,但在这种情况下,您不能使用相同的 PixelShaderInput 结构作为 VS 输出和 PS 输入。
同样按照惯例,您不使用带位置的语义索引,因此在您的 HLSL 着色器中将 SV_POSITION0
更改为 SV_POSITION
——一个顶点不能同时出现在两个地方.
逐顶点颜色顶点着色器输入通常为 COLOR
,而 COLOR0
/COLOR1
用于顶点着色器 output/pixel 着色器输入用于漫反射与镜面反射颜色。
struct VertexShaderInput
{
float4 Position : SV_POSITION;
float4 Color : COLOR;
};