Monogame 3.4 - 效果投掷 "InvalidOperationException: An error occurred while preparing to draw."

Monogame 3.4 - Effect throwing "InvalidOperationException: An error occurred while preparing to draw."

我正在尝试绘制应用了着色器的全屏四边形,但在绘制时我不断收到以下错误:

An error occurred while preparing to draw. This is probably because the current vertex declaration does not include all the elements required by the current vertex shader. The current vertex declaration includes these elements: SV_Position0, TEXCOORD0.

这就是我声明四边形顶点的方式:

_vertices = new VertexPositionTexture[4];
_vertices[0] = new VertexPositionTexture(new Vector3(-1, 1, 0), new Vector2(0, 0));
_vertices[1] = new VertexPositionTexture(new Vector3(1, 1, 0), new Vector2(1, 0));
_vertices[2] = new VertexPositionTexture(new Vector3(-1, -1, 0), new Vector2(0, 1));
_vertices[3] = new VertexPositionTexture(new Vector3(1, -1, 0), new Vector2(1, 1));

这就是我绘制四边形的方式(省略了不需要的东西)

foreach (var pass in _lightEffect1.CurrentTechnique.Passes)
{
    pass.Apply();
    GraphicsDevice.DrawUserPrimitives(PrimitiveType.TriangleStrip, _vertices, 0, 2, VertexPositionTexture.VertexDeclaration);
}

这是应用于四边形的着色器

// Vertex shader input structure
struct VertexShaderInput
{
    float4 Pos : SV_Position;
    float2 TexCoord : TEXCOORD0;
};

// Vertex shader output structure
struct VertexShaderOutput
{
    float4 Pos : SV_Position;
    float2 TexCoord : TEXCOORD0;
};

VertexShaderOutput VertexToPixelShader(VertexShaderInput input)
{
    VertexShaderOutput output;

    output.Pos = input.Pos;
    output.TexCoord = input.TexCoord;

    return output;
}

float4 PointLightShader(VertexShaderOutput PSIn) : COLOR0
{
    //Pixel shader code here....
    return float4(shading.r, shading.g, shading.b, 1.0f);
}

technique DeferredPointLight
{
    pass Pass1
    {
        VertexShader = compile vs_4_0_level_9_1 VertexToPixelShader();
        PixelShader = compile ps_4_0_level_9_1 PointLightShader();
    }
}

我注意到的一件事是 MonoGame 提供的 VertexPositionTexture 中的定义是位置的 vec3 和纹理坐标的 vec2。然而在着色器中它是一个 float4 的位置和一个 float2 的 texcoords。

我尝试将其更改为 float3,但着色器无法编译。因此,我随后尝试创建自己的 "VertexPositionTexture" 结构,该结构具有我自己定义的 vec4,但我最终遇到了同样的错误。

我不是很擅长 DirectX,我试着四处寻找 google,但我找不到任何可能导致问题的原因。

我是不是在着色器中做错了什么?我错过了什么吗?

事实证明这是一个非常愚蠢的修复。

Content Pipeline 工具没有按照我认为的方式编译转换后的 .fx 文件,而且我所做的修复(将 POSITION 更改为 SV_POSITION)实际上并没有被使用...

着色器现在可以工作了,因为它实际上使用了正确的着色器