2013-05-13 58 views
2

我試圖使用由幾層材料組成的三維紋理實現地形紋理,並在材質之間進行平滑混合。多紋理 - 三維紋理兩層之間的插值

也許我的插圖將更好地解釋它:
Pretty picture

試想一下,每個顏色是一個很酷的地形紋理,如草,石材等
我想,讓他們正確地混合,而是與當前的方法除了我想要出現的紋理之外,我得到了所需的所有紋理(這看起來合乎邏輯,因爲正如我所讀,3D紋理被視爲三維數組而不是紋理柱)。
電流(和愚蠢,很明顯)的方法是簡單如餡餅(「當前」結果使用點插值呈現時,期望的結果是手繪):

頂點:
Vertex 1: Position = Vector3.Zero, UVW = Vector3.Zero
Vertex 2: Position = Vector3(0, 1, 0), UVW = Vector3(0, 1, 0.75f)
Vertex 3: Position = Vector3(0, 0, 1), UVW = Vector3(1, 0, 1)
正如你可以看到,三角形的第一頂點使用第一材料(紅色之一),第二頂點使用第三個材質(藍色一個)和第三個頂點使用第四個材質(黃色一個)。

這是它是如何在像素着色器完成(UVW而不改變直接傳遞):
float3 texColor = tex3D(ColorTextureSampler, input.UVW);
return float4(texColor, 1);
我的選擇的原因是我的地形結構。地形由體素(每個體素包含材質ID)使用行進立方體生成。每個頂點都是「焊接」的,因爲網格非常大,我不想讓每個三角形都是單獨的(但如果沒有辦法使用連接的頂點解決我的問題,我仍然可以做到)。
我最近想出了一個關於存儲三角形中其他兩個頂點的材質ID及其混合因子(我將在每個頂點中有一個float2 UV對,float3用於材質ID,float3用於每個材質ID的混合因子)但我沒有看到任何方式來完成這個沒有把我的網格劃分成單獨的三角形。
任何幫助將不勝感激。我使用C#和Direct3D 9 API針對SlimDX。謝謝閱讀。
P.S .:對不起,如果我在本文中犯了一些錯誤,英語不是我的母語。

回答

1

可能是您的ColorTextureSampler使用point filteringD3DTEXF_POINT)。使用D3DTEXF_LINEARD3DTEXF_ANISOTROPIC來獲得所需的插值效果。 我對SlimDX 9並不是很熟悉,但你已經明白了。下面

BTW,很好的例子=)

更新1 結果在您的評論似乎是適當的代碼。 看起來像獲得所需的效果,你必須改變整體方法。 這是不是你完整的解決方案,但我們如何讓它在普通3D地形:

  • 每個頂點有1對(U,V)texure coodrinates的
  • 您有n個紋理採樣成(T1,T2,T3,...,Tn)代表不同地形的不同層:沙,草, T在其頻道中:R頻道擁有T1爲T1的通道,G通道爲T2,B爲T3,...等。
  • 在像素着色器,你的採樣紋理層像往常一樣,並得到顏色值float4 val1, val2, val3,...
  • 然後你相應的混合係數,並得到採樣掩碼紋理(S)float blend1, blend2, blend3, ...
  • 然後你將某種混合algorith的,例如簡單的線性插值:
float4 terrainColor = lerp(val1, val2, blend1); 
terrainColor = lerp(terrainColor, val3, blend2); 
terrainColor = lerp(terrainColor, ..., blendN); 

例如,如果您的T1是草,你在你的地圖的中間有一個大的草地,你會波一個紅色的大場在裏面中間。

這個算法有點慢,因爲紋理採樣太多,但實現起來很簡單,給出了很好的視覺效果和最靈活的。您不僅可以使用蒙板作爲混合係數,而且可以使用任何值:例如高度(在山峯中採樣更多的雪,山中的岩石,低地中的灰塵),坡度(陡峭的岩石,平坦的草地),甚至固定值,或者混淆所有這些。此外,您還可以改變的混合:在內置lerp或更復雜的東西用(警告!這個例子是愚蠢的):

float4 terrainColor = val1 * val2 * blend1 + val2 * val3 * blend2;
terrainColor = saturate(terrainColor);

與融合算法中播放最有趣這個問題的一部分。你可以在谷歌找到許多技術。

不確定,但希望它有幫助! 快樂編碼! =)

+0

感謝您的回答:)不幸的是,幾乎沒有任何改變 - 我剛剛得到了相同的圖像,但平滑,從[截圖]中可以看到(http://i.imgur.com/kdVUswN.png )。 – 2013-05-13 18:51:07

+0

哇,很棒的更新。似乎我沒有清楚地表明我的地形由「塊」(體素)組成,並且基於高度的方法無法使用,因爲我希望用戶通過添加其他材質來編輯地形。但紋理掩蓋似乎很有趣,也許我會嘗試它來實現splating效果。我希望ps_3_0中有足夠的紋理採樣器,我會研究它。謝謝,它變得更清晰了,我會告訴你我的進展情況:) – 2013-05-13 19:51:02

+0

我是通過混合你的和我的方法來實現的。我沒有使用不同的採樣器,而是將紋理打包成一個3D紋理(就像我之前做的那樣),並按照我在問題中描述的因素進行混合。它給了我一個簡單的平滑紋理,我期待着使用你所描述的'紋理遮罩'來讓材質之間的過渡更具吸引力:) – 2013-05-18 15:34:42