2015-12-17 27 views
0

我目前有3個紋理在我的地形項目中使用斜坡量進行混合。我通過對每個紋理進行採樣,確定斜率量並基於兩個紋理之間的lerp設置紋理顏色來完成此操作。這是該代碼段從我的像素着色器:DirectX11:基於高度的紋理混合

static const float TEX_LOW_BOUND = 0.4f; 
static const float TEX_HIGH_BOUND = 0.7f; 

...  

float4 texColour; 
float4 lowColour = lowerTex.Sample(SWrap, pin.Tex); 
float4 midColour = middleTex.Sample(SWrap, pin.Tex); 
float4 hiColour = upperTex.Sample(SWrap, pin.Tex); 
float slope  = 1.0f - pin.Normal.y; 

if (slope < TEX_LOW_BOUND) 
{ 
    texColour = lerp(lowColour, midColour, slope/TEX_LOW_BOUND); 
} 
else if (slope >= TEX_LOW_BOUND && slope < TEX_HIGH_BOUND) 
{ 
    texColour = lerp(midColour, hiColour, (slope - TEX_LOW_BOUND) * (1.0f/(TEX_HIGH_BOUND - TEX_LOW_BOUND))); 
} 
else if (slope >= TEX_HIGH_BOUND) 
{ 
    texColour = hiColour; 
} 

我想添加一個最終的雪質地,申請超過一定高度。我用得到我的頂點着色器的高度值:

vout.WHeight = mul(vin.Pos, worldMatrix).y; 

用這個然後我可以只設置紋理顏色上面一定高度的雪在我的像素着色器:

if (pin.WHeight > 35.0f) 
{ 
    texColour = snowTex.Sample(SWrap, pin.Tex); 
} 

將會產生以下內容:

Snow above a certain height

我怎樣才能融入雪與其他材質的邊緣,使邊緣不那麼苛刻。銘記其他紋理可能已經lerped,我想保持紋理的顏色。

謝謝您的時間

+0

與斜坡一樣。 – Drop

+0

我該如何將高度值與基於斜率的線性插值進行積分。我只是想融合雪的邊緣,所以它會逐漸消失。 – Daniel

+0

斜坡部分(我們稱之爲「草」)取最終顏色,取雪色。計算你的插值係數作爲高度的函數(例如:絕對雪:高度200和更高,雪色數量100%;絕對草:高度低於150,雪色數量0%)。做lerp(或者你喜歡的任何混合功能)。 – Drop

回答

1

你可以做基本上你在顏色爲雪帽加時,但你需要在這裏是一個遠程輸入,以確定它是否接近只是做同樣的事情邊緣。有幾種方法可以做到這一點。一種方法可以是將像素值與顏色加法或減法混合,然後在顏色值的範圍之間進行歸一化。另一個是應用多個紋理混合。正如您在if (pin.WHeight > 35.0f) 以上的條件中所述,我們知道35.0f是開始應用雪質地之前的最大高度值。根據您的預期結果,您的基於範圍的輸入可能類似於:if (height > 34.8f && height < 35.2f) { apply texture blending or color blending; }

另一種方法是在原始圖層頂部使用具有透明度漸變層的alpha值,使用相同的範圍輸入來生成所需的輸出。

這種類型的方法或算法的唯一的一點是,它可能看起來不像你想的那樣逼真。這是因爲所有的雪帽將具有完全相同的高度值,造成不切實際的邊界。

一個接近你原來的方法的建議可能會更好。將紋理或顏色應用於雪帽時,您可以使用非確定性算法,在最小範圍內隨機選擇特定高度以應用紋理 - 紋理混合,然後超過特定高度的任何東西都會平滑爲純白色。這樣,每個山頂都會有一個白色的帽子,但並不是所有的高度在下限都是一樣的。