2015-09-16 5 views
0

Я пытаюсь сделать полноэкранный четырехугольник с шейдером нанесенного на него, но я получаю следующее сообщение об ошибке при рисовании произошлоMonogame 3.4 - Эффект throwing "InvalidOperationException: Произошла ошибка при подготовке к рисованию."

ошибки при подготовке к рисованию. Вероятно, это связано с тем, что текущее объявление вершины не включает все элементы, необходимые для текущего шейдера вершин. В текущую декларацию вершин входят следующие элементы: 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(); 
    } 
} 

Одна вещь, которую я заметил, заключается в том, что определение в VertexPositionTexture, которое предоставляет MonoGame, представляет собой vec3 для позиции и vec2 для texcoords. Однако в шейдере это float4 для позиции и float2 для texcoords.

Я попытался изменить его на float3, но шейдер не компилируется. Поэтому я попытался создать свою собственную структуру «VertexPositionTexture», у которой был vec4 с моим собственным определением, но в итоге я получил ту же ошибку.

Я не так хорош в DirectX, и я пробовал искать по всему Google, но я не могу найти ничего, что могло бы стать причиной проблемы.

Я сделал что-то неправильно в шейдере? Я что-то упускаю?

ответ

0

Оказалось, это было действительно глупое исправление.

Инструмента Pipeline Содержимое не компиляции преобразованного .fx файлов, где я думал, что это будет, и исправлением я сделал (изменение POSITION к SV_POSITION) была не используется на самом деле ...

Шейдер теперь работает, теперь, когда на самом деле используется правильный шейдер