2011-03-15 79 views
1

我想在HLSL中結合兩種紋理 - 具體來說,我想從基礎圖像中獲取alpha值,並從疊加圖像獲取顏色數據。HLSL - 混合紋理

我對這個像素着色器看起來是這樣的:

float4 PixelShaderFunction(VertexOut input) : COLOR0 
{ 
    float4 baseColor = tex2D(BaseSampler, input.baseCoords.xy).rgba; 
    float4 overlayColor = tex2D(OverlaySampler, input.overlayCoords.xy).rgba; 

    float4 color; 
    color.r = overlayColor.r; 
    color.g = overlayColor.g; 
    color.b = overlayColor.b; 
    color.a = baseColor.a; 

    return color.rgba; 
} 

和我交融的狀態如下:

BlendState bs = new BlendState(); 
    bs.AlphaSourceBlend = Blend.SourceAlpha; 
    bs.AlphaDestinationBlend = Blend.DestinationAlpha; 
    bs.ColorSourceBlend = Blend.SourceColor; 
    bs.ColorDestinationBlend = Blend.DestinationColor; 

什麼這給我留下的應該是什麼樣的一個衝出來的版本覆蓋顏色。 我已經嘗試了BlendState設置的衆多排列,並且使用了像素着色器數學,但效果不佳。

任何人都可以指向正確的方向嗎?

在此先感謝=)

+0

你可以使hlsl函數更好一點。 color = float4(baseColor.rgb,overlayColor.a); – 2011-03-15 08:24:39

回答

1

我不知道C#是如何處理的東西,但在一般情況下,你會想

AlphaSourceBlend = SrcAlpha 
AlphaDestinationBlend = InvSrcAlpha 

(C#分別稱之爲SourceAlpha和InvSourceAlpha)。而且,顯然,你會想啓用alpha混合,但我相信你做到了。

+0

事實證明,訣竅是將BlendState設置爲NonPremultiplied,並清除我首先明確定義的狀態。如果我沒有回去確認我已經啓用了Alpha Blending,那麼就不會試圖這麼做,所以謝謝:) – b34r 2011-03-15 08:33:57