Hello, I’m trying to port some shaders from XNA4.0 to Monogame, but I’m getting a weird error. The compilation on MGFX goes great, but when the actual code runs I get shader compilation error on drawing the mesh:
Unhandled Exception:
System.InvalidOperationException: Shader Compilation Failed occurred
Here’s the shader code:
float4x4 World;
float4x4 View;
float4x4 Projection;
float specularIntensity = 0.8f;
float specularPower = 0.5f;
texture Texture;
sampler diffuseSampler = sampler_state
{
Texture = <Texture>;
MAGFILTER = LINEAR;
MINFILTER = LINEAR;
MIPFILTER = LINEAR;
AddressU = WRAP;
AddressV = WRAP;
};
texture SpecularMap;
sampler specularSampler = sampler_state
{
Texture = <SpecularMap>;
MagFilter = LINEAR;
MinFilter = LINEAR;
Mipfilter = LINEAR;
AddressU = WRAP;
AddressV = WRAP;
};
texture NormalMap;
sampler normalSampler = sampler_state
{
Texture = <NormalMap>;
MagFilter = LINEAR;
MinFilter = LINEAR;
Mipfilter = LINEAR;
AddressU = WRAP;
AddressV = WRAP;
};
struct VertexShaderInput
{
float4 Position : SV_POSITION;
float3 Normal : NORMAL0;
float2 TexCoord : TEXCOORD0;
float3 Binormal : BINORMAL0;
float3 Tangent : TANGENT0;
};
struct VertexShaderOutput
{
float4 Position : SV_POSITION;
float2 TexCoord : TEXCOORD0;
float2 Depth : TEXCOORD1;
float3x3 tangentToWorld : TEXCOORD2;
};
VertexShaderOutput VertexShaderFunction(VertexShaderInput input)
{
VertexShaderOutput output;
float4 worldPosition = mul(float4(input.Position.xyz,1), World);
float4 viewPosition = mul(worldPosition, View);
output.Position = mul(viewPosition, Projection);
output.TexCoord = input.TexCoord;
output.Depth.x = output.Position.z;
output.Depth.y = output.Position.w;
// calculate tangent space to world space matrix using the world space tangent,
// binormal, and normal as basis vectors
output.tangentToWorld[0] = mul(input.Tangent, World);
output.tangentToWorld[1] = mul(input.Binormal, World);
output.tangentToWorld[2] = mul(input.Normal, World);
return output;
}
struct PixelShaderOutput
{
float4 Color : COLOR0;
float4 Normal : COLOR1;
float4 Depth : COLOR2;
};
PixelShaderOutput PixelShaderFunction(VertexShaderOutput input)
{
PixelShaderOutput output;
output.Color = tex2D(diffuseSampler, input.TexCoord);
float4 specularAttributes = tex2D(specularSampler, input.TexCoord);
//specular Intensity
output.Color.a = specularAttributes.r;
// read the normal from the normal map
float3 normalFromMap = tex2D(normalSampler, input.TexCoord);
//tranform to [-1,1]
normalFromMap = 2.0f * normalFromMap - 1.0f;
//transform into world space
normalFromMap = mul(normalFromMap, input.tangentToWorld);
//normalize the result
normalFromMap = normalize(normalFromMap);
//output the normal, in [0,1] space
output.Normal.rgb = 0.5f * (normalFromMap + 1.0f);
//specular Power
output.Normal.a = specularAttributes.a;
output.Depth = input.Depth.x / input.Depth.y;
return output;
}
technique Technique1
{
pass Pass1
{
VertexShader = compile vs_3_0 VertexShaderFunction();
PixelShader = compile ps_3_0 PixelShaderFunction();
}
}
Do you have any idea what’s wrong here?
The issue I had is due to the fact (I think) that Monogame on Android does not support setting multiple rendertargets. If you do so, it will fail when trying to populate the rendertargets therefore in code this will be the structure: