2016-03-14 2 views
-2

Я обновил свой моногейм до последней версии. При создании шейдера в инструменте конвейера сначала я получил ошибку Vertex shader «SpriteVertexShader» должен быть уровнем 4.0.0.0.0 или выше SM 4.0! Поэтому я изменил ps_2_0 на ps_4_0_level_9_1, но теперь я получаю сообщение об ошибке:Модернизированная MonoGame, и теперь я не могу получить свой шейдер для компиляции

ошибка X3004: необъявленный идентификатор «» SecondPassTextureSampler

Кто-нибудь имеет представление о том, как решить эту проблему?

#include "Macros.fxh" 

texture Bitmap; 

sampler2D FirstPassTexture = sampler_state{ 
    Texture = (Bitmap); 
    MagFilter = Linear; 
    MinFilter = Linear; 
    AddressU = Clamp; 
    AddressV = Clamp; 
}; 

sampler2D SecondPassTexture = sampler_state{ 
    Texture = (Bitmap); 
    MagFilter = Linear; 
    MinFilter = Linear; 
    AddressU = Clamp; 
    AddressV = Clamp; 
}; 

#define KERNEL_RADIUS 7 
#define KERNEL_WIDTH (2*KERNEL_RADIUS + 1) 

// Uniforms 
BEGIN_CONSTANTS 
    float kernel[KERNEL_WIDTH]; 
    float2 offsets[KERNEL_WIDTH]; 

MATRIX_CONSTANTS 
    float4x4 MatrixTransform _vs(c0) _cb(c0); 
END_CONSTANTS 

struct VSOutput 
{ 
    float4 position  : SV_Position; 
    float4 color  : COLOR0; 
    float2 texCoord  : TEXCOORD0; 
}; 

VSOutput SpriteVertexShader( float4 position : SV_Position, 
           float4 color : COLOR0, 
           float2 texCoord : TEXCOORD0) 
{ 
    VSOutput output; 
    output.position = mul(position, MatrixTransform); 
    output.color = color; 
    output.texCoord = texCoord; 
    return output; 
} 

float4 gaussH(VSOutput input): SV_Target0 
{ 
    float4 color = float4(0,0,0,0); 
    for(int i = 0; i < KERNEL_WIDTH; ++i) 
     color += SAMPLE_TEXTURE(SecondPassTexture, (input.texCoord + float2(offsets[i].x, 0.0))) * kernel[i]; 
    return color * input.color; 
} 

float4 gaussV(VSOutput input): SV_Target0 
{ 
    float4 color = float4(0.0,0.0,0.0,0); 
    for(int i = 0; i < KERNEL_WIDTH; ++i) 
     color += SAMPLE_TEXTURE(SecondPassTexture, (input.texCoord + float2(0.0, offsets[i].y))) * kernel[i]; 
    return color * input.color; 
} 

float4 gaussVGlow(VSOutput input): SV_Target0 
{ 
    float4 color = float4(1.0,1.0,1.0,0); 
    for(int i = 0; i < KERNEL_WIDTH; ++i) 
    { 
     float alpha = SAMPLE_TEXTURE(SecondPassTexture, (input.texCoord + float2(0.0, offsets[i].y))).a * kernel[i]; 
     color.a += alpha; 
    } 
    // This will make stripes on top of the glow 
    /* 
    float m = smoothstep(0.45, 0.55, 0.5*cos(25.0*atan2(input.texCoord.y-0.5, input.texCoord.x-0.5))+0.5) * 0.5 + 0.5; 
    color.a *= m; 
    */ 
    color.a = pow(color.a, 0.5); 
    color.rgb *= color.a; // Yeah, you have to pre multiply your alpha -- either that or render with premultiply option 
    return color * input.color; 
} 

technique Blur { 
    pass p0 { 
     VertexShader = compile vs_4_0_level_9_1 SpriteVertexShader(); 
     PixelShader = compile ps_4_0_level_9_1 gaussH(); 
    } 
    pass p1 { 
     VertexShader = compile vs_4_0_level_9_1 SpriteVertexShader(); 
     PixelShader = compile ps_4_0_level_9_1 gaussV(); 
    } 
    pass p1Glow { 
     VertexShader = compile vs_4_0_level_9_1 SpriteVertexShader(); 
     PixelShader = compile ps_4_0_level_9_1 gaussVGlow(); 
    } 
} 

Macros.fxh является: http://pastebin.com/y51kFfii

+2

Ваш шейдер не похож на GLSL; что такое 'техника' и' pass'? Также, 'SecondPassTextureSampler' не появляется в шейдере; вы уверены, что это ваш шейдерный сбой, а не ваш код на C#? –

+0

Спасибо, что посмотрели. techinque и пропуск от XNA Макросов, которые я связал. Думаю, что SecondPassTextureSampler get создается автоматически. Я даже не запускаю код C#, просто инструмент конвейера Monogame. –

ответ

0

С Monogame Форум: Вы получите ошибку, потому что вы используете SAMPLE_TEXTURE макрос для отбора проб, но не использовать DECLARE_TEXTURE макрос для объявления текстуры. Если вы хотите использовать макросы в Macros.fxh, тогда текстуру нужно называть SecondPassTexture, а сэмплер нужно назвать SecondPassTextureSampler. (Не изменяйте строку, в которой называется SAMPLE_TEXTURE.)

Если вы посмотрите на макро (_Macro.fxh, строка 31), код

SAMPLE_TEXTURE (SecondPassTexture (input.texCoord + float2 (0,0, смещения [я] .y))) расширяется до

SecondPassTexture.Sample (SecondPassTextureSampler, (input.texCoord + float2 (0,0, зачеты [я] .y))) Но в вашем случае (исходное сообщение) его должен быть

Bitmap.Sample (SecondPassTexture, (input.texCoord + float2 (0.0, offsets [i] .y))) Ниже вы можете найти более простое решение: Просто замените все SAMPLE_TEXTURE на tex2D. (Оставьте пробоотборники, как в исходном посте.)

+0

В качестве дополнительного примечания у меня возникли дополнительные проблемы, и я обнаружил, что установка MonoGame 3.5 поверх предыдущей установки была плоха и удалила и переустановила исправленные некоторые проблемы. –