我試圖使用由幾層材料組成的三維紋理實現地形紋理,並在材質之間進行平滑混合。多紋理 - 三維紋理兩層之間的插值
也許我的插圖將更好地解釋它:
試想一下,每個顏色是一個很酷的地形紋理,如草,石材等
我想,讓他們正確地混合,而是與當前的方法除了我想要出現的紋理之外,我得到了所需的所有紋理(這看起來合乎邏輯,因爲正如我所讀,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 .:對不起,如果我在本文中犯了一些錯誤,英語不是我的母語。
感謝您的回答:)不幸的是,幾乎沒有任何改變 - 我剛剛得到了相同的圖像,但平滑,從[截圖]中可以看到(http://i.imgur.com/kdVUswN.png )。 – 2013-05-13 18:51:07
哇,很棒的更新。似乎我沒有清楚地表明我的地形由「塊」(體素)組成,並且基於高度的方法無法使用,因爲我希望用戶通過添加其他材質來編輯地形。但紋理掩蓋似乎很有趣,也許我會嘗試它來實現splating效果。我希望ps_3_0中有足夠的紋理採樣器,我會研究它。謝謝,它變得更清晰了,我會告訴你我的進展情況:) – 2013-05-13 19:51:02
我是通過混合你的和我的方法來實現的。我沒有使用不同的採樣器,而是將紋理打包成一個3D紋理(就像我之前做的那樣),並按照我在問題中描述的因素進行混合。它給了我一個簡單的平滑紋理,我期待着使用你所描述的'紋理遮罩'來讓材質之間的過渡更具吸引力:) – 2013-05-18 15:34:42