2015-09-16 3 views
0

Je suis en train de dessiner un quad avec un shader plein écran appliqué, mais je continue à obtenir l'erreur suivante lors de l'établissement:Monogame 3.4 - Lancement d'effet "InvalidOperationException: Une erreur est survenue lors de la préparation du dessin."

Une erreur est survenue lors de la préparation à dessiner. C'est probablement parce que la déclaration de vertex actuelle n'inclut pas tous les éléments requis par le vertex shader actuel. La déclaration de vertex actuelle inclut ces éléments: SV_Position0, TEXCOORD0.

Voilà comment je déclarais mes vertices pour le quad:

_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)); 

Et voici comment je dessine le quad (avec chose non nécessaire omis sur)

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

Et voici le shader qui est appliqué au quad

// 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(); 
    } 
} 

Une chose que j'ai remarquée est que la définition dans VertexPositionTexture fournie par MonoGame est un vec3 pour la position et un vec2 pour les texcoords. Cependant dans le shader c'est un float4 pour la position et un float2 pour les texcoords.

J'ai essayé de le changer en float3, mais le shader ne compile pas. J'ai alors essayé de créer ma propre structure "VertexPositionTexture" qui avait une vec4 avec ma propre définition mais j'ai fini par avoir la même erreur.

Je ne suis pas très bon à DirectX, et j'ai essayé partout sur google, mais je ne trouve rien qui puisse être la cause du problème.

Ai-je fait quelque chose de mal dans le shader? Est-ce que je manque quelque chose?

Répondre

0

Il s'est avéré que c'était une solution vraiment bête.

L'outil Content Pipeline n'a pas été compilant les fichiers convertis .fx où je pensais que ce serait, et une solution que j'ai fait (changement POSITION à SV_POSITION) n'a pas été réellement utilisé ...

Le shader fonctionne maintenant, maintenant qu'il utilise le shader correct