2013-02-08 83 views
3

我一直在問到下面分裂的問題分成多個問題:HLSL 3可以單獨聲明像素着色器嗎?

HLSL and Pix number of questions

這是問的第一個問題,我可以在HLSL 3運行像素着色器沒有頂點着色器。在HLSL 2中,我注意到你可以,但我似乎無法在3中找到方法?

着色器將編譯罰款,那麼我就要但是從Visual Studio中調用SpriteBatch繪製時出現此錯誤()。

「不能在早期着色模式的混合Shader Model 3.0的。如果兩個頂點着色器和像素着色器編譯爲3.0,它們必須是。」

我不相信我在着色器中定義的任何使用任何較早然後3,所以我離開了有點糊塗了。任何幫助,將不勝感激。

回答

7

的問題是,內置SpriteBatch着色器是2.0。如果僅指定像素着色器,則SpriteBatch仍使用其內置頂點着色器。因此版本不匹配。

的解決方案的話,同時指定一個頂點着色器自己。幸運的是,微軟提供了source to XNA's built-in shaders。它涉及的只是一個矩陣變換。下面的代碼,修改,以便您可以直接使用它:

float4x4 MatrixTransform; 

void SpriteVertexShader(inout float4 color : COLOR0, 
         inout float2 texCoord : TEXCOORD0, 
         inout float4 position : SV_Position) 
{ 
    position = mul(position, MatrixTransform); 
} 

然後 - 因爲SpriteBatch不會將它適合你 - 你的設置效果的MatrixTransform正確。這是「客戶」空間的簡單投影(源自this blog post)。代碼如下:

Matrix projection = Matrix.CreateOrthographicOffCenter(0, 
     GraphicsDevice.Viewport.Width, GraphicsDevice.Viewport.Height, 0, 0, 1); 
Matrix halfPixelOffset = Matrix.CreateTranslation(-0.5f, -0.5f, 0); 
effect.Parameters["MatrixTransform"].SetValue(halfPixelOffset * projection); 
+1

不要忘記「VertexShader = compile vs_3_0 SpriteVertexShader();」 'vs'vs'ps'滑倒了我的視線片刻! (很好的回答,http://gamedev.sleptlate.org/blog/165-implementing-a-pass-through-3vertex-shader-for-games-without-vertices/幫助你或其他方式?) – Lodewijk 2013-10-26 21:31:00

+0

@Lodewijk獨立 - 我以前沒見過這篇博文(雖然他的發佈日期早幾個月)。他們幾乎相同並不令人驚訝 - 看起來我們都使用了相同的源材料(請參閱我的鏈接)。 – 2014-05-06 04:56:14

+0

感謝您的回答。看到一些代碼集有這樣的生活,總是在博客中傳播很有趣。非常奇特的同時。 – Lodewijk 2014-05-06 22:33:14

-2

你可以試試簡單的例子here。灰度着色器是瞭解最小像素着色器如何工作的一個很好的示例。

基本上,你創建你的內容項目下的一個效果像這樣的:

sampler s0; 

float4 PixelShaderFunction(float2 coords: TEXCOORD0) : COLOR0 
{ 
    // B/N 
    //float4 color = tex2D(s0, coords); 
    //color.gb = color.r; 

    // Transparent 
    float4 color = tex2D(s0, coords); 
    return color; 
} 

technique Technique1 
{ 
    pass Pass1 
    { 
     PixelShader = compile ps_2_0 PixelShaderFunction(); 
    } 
} 

您還需要:

  1. 創建效果對象,並加載其內容。

    ambienceEffect = Content.Load( 「效果/環境」);

  2. 打電話給你SpriteBatch.Begin()方法,傳遞你想使用

    spriteBatch.Begin(SpriteSortMode.FrontToBack, BlendState.AlphaBlend, 空, 空, 空, ambienceEffect效果對象, camera2d.GetTransformation());

  3. 裏面的SpriteBatch.Begin() - SpriteBatch.End()塊,你必須調用影響內部的技術

    ambienceEffect.CurrentTechnique.Passes [0]。應用();

相關問題