2016-03-14 87 views
-2

我將我的monogame升級到最新版本。首先在流水線工具中構建着色器時,出現錯誤頂點着色器'SpriteVertexShader'必須是SM 4.0級別9.1或更高!所以我改變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;什麼是'技術'和'傳球'?另外,'SecondPassTextureSampler'不會出現在着色器中;你確定這是你的着色器失敗,而不是你的C#代碼嗎? –

+0

謝謝你的採訪。 techinque和pass均來自我鏈接的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,偏移[I] .Y))) 擴展到

SecondPassTexture.Sample(SecondPassTextureSampler,(input.texCoord + FLOAT2(0.0,偏移量[I] .Y))) 但是你的情況(原始信息)它應該是

Bitmap.Sample(SecondPassTexture,(input.texCoord + float2(0.0,offsetsets [i] .y))) 這裏是一個更簡單的解決方案,您可以嘗試: 只需將所有SAMPLE_TEXTURE替換爲tex2D即可。 (將採樣器保留在原始文章中。)

+0

另外需要注意的是,我遇到了額外的問題,並且發現安裝MonoGame 3.5時,我的以前安裝過程很糟糕,並且卸載並重新安裝了一些固定的問題。 –