2010-11-03 38 views
3

我有一個程序,我需要將二維紋理(簡單圖像)應用到使用marching-cubes算法生成的曲面。我可以訪問幾何圖形,並且可以相對容易地添加紋理座標,但生成座標的最佳方法是避開我。OpenGL,將紋理從圖像應用到等值面

該卷中的每個點表示一個數據單位,並且每個數據單位可能具有不同的屬性。爲了簡化事情,我正在考慮將它們分類爲「類型」,併爲每種類型分配紋理(或單個大紋理圖集的一部分)。

我的問題是我不知道如何生成適當的座標。我可以將類型紋理的位置存儲在類型類中,然後使用它,但接縫會嚴重拉伸(如果兩個相鄰點使用圖集的不同部分)。如果可能的話,我想在接縫處混合紋理,但我不確定最好的方式來做到這一點。混合是可選的,但我需要以某種方式紋理頂點。可能但不希望的是,將幾何體分成每個類型的部分,或者爲了紋理目的複製頂點。

我想盡量避免使用着色器,但如果有必要,我可以使用頂點和/或片段着色器來進行紋理混合。如果我使用着色器,告訴它的最有效方法是紋理或部分樣本?看起來像通過參數傳遞類型將是最簡單的方法,但可能很慢。

我的體積相對較小,每個維度8-16點(爲了加速生成,我將它們縮小了一些,但在特定時間有很多屏幕顯示)。我簡要地考慮使等值面的體積分辨率爲兩倍,因此每個點具有更多的頂點(理論上爲8),這可以簡化紋理。不過,似乎並不會讓混合更容易。

要構建曲面,我使用的是OpenGL的Visualization Library及其行進立方體和音量系統。我生成的幾何圖形很好,只需要弄清楚如何紋理。

有沒有辦法有效地做到這一點,如果是的話是什麼?如果沒有,有沒有人有更好的方法來處理卷的紋理的想法?

編輯:要注意,紋理不是簡單的顏色漸變。它實際上是一種紋理,通常具有圖案。因此,繪製它的困難,一個梯度將是微不足道的。

編輯2:爲了幫助澄清問題,我將添加一些示例。他們可能只是混淆事物,所以考慮一切超出明確的事實,如果可能的話,這些只是幫助。

我的幾何體是立方體,總是(加載,生成並保存在立方體中)。如果形狀影響可能的解決方案,就是這樣。

我需要應用紋理,包括模式和/或顏色(根據點的「類型」獨特的幾何)到幾何,在一種技術類似於爲地形完成的噴濺(這不是地形,但是,所以我不知道是否可以使用相同的技術)。

着色器是一個快速簡便的解決方案,儘管我想避免它們,如果可能的話,正如我之前提到的。在固定功能的流水線中可用的東西最好,主要是爲了稍微提高兼容性和開發時間。由於這只是一個小幅增加,如果需要,我將使用着色器和多通道渲染。

不知道是否有其他的澄清是必要的,但根據需要,我會及時更新的問題。

回答

0

由於紋理問題和我的一些約束,我選擇編寫一個不同的算法來構建幾何體,並直接處理紋理,因爲它會產生曲面。它比行軍立方體稍微光滑,但允許我以適用於我的項目的方式應用texcoords(並且速度更快)。

對於任何對紋理行軍立方體感興趣的人,或者只是混合紋理,湯米的答案是一個非常有趣的技術,並張貼鏈接timday貼出平坦的網格紋理的優秀資源。感謝他們兩人的答案,希望他們可以用於其他人。 :)

0

你可能想嘗試使紫外線地圖網格的攪拌機一樣的工具,看看他們是如何做到這一點。如果我瞭解你的問題,你有一個3D字段,它定義了一個固體量和一個(連續的)顏色。您已經從體積創建了一個網格,現在您需要使用從連續顏色空間中提取的紋理將UV網格映射到2D紋理。在一個工具中,您可以在3D網格中定義「接縫」,您可以將它們分開,以便整個網格可以放平以製作UV地圖。在接縫處紋理上可能出現鋸齒現象,所以當渲染網格時,它們在這些接縫處也是不連續的(例如,三角形條紋不能穿過接縫,因爲它是紋理中的不連續處)。

我不知道任何用於展平網格的正式方法,但您可以想象沿着接縫切割它,然後將整個事件視爲彈簧/約束系統,然後將其放到平坦表面上。我一切都是爲了解決困難的事情。 ;-)

+0

「網面展平」實際上研究得非常好(是的,可以視爲能量最小化問題);看到我的答案重新適形映射。 – timday 2010-11-04 01:04:11

+0

我不確定我是否正確說出我的問題。我有一個卷,是的,我從中產生幾何。但是,我需要(儘管這裏的術語可能不準確),根據表面屬性將各種2D紋理貼圖到該幾何圖形上。那些屬性目前並不存儲在幾何體或體積紋理中。我可以以某種方式添加它們,但它們現在保存爲整數,我想不出一種簡單的方法將頂點拼接到頂點,以便着色器可以在不通過浮動的情況下讀取它們。 – ssube 2010-11-04 02:28:10

+0

你不能避免着色器中的浮點數,但是你可以將24位整數數據(尾數)打包到每個浮點數中,並且每個屬性可以有一個浮點數vec4。 – 2010-11-04 03:22:07

2

關於問題的紋理結合部:

你看着3D紋理?當我們在談論行軍立方體時,我應該立即說我明確地不談論體積結構。相反,你將所有2D紋理堆疊成3d紋理。然後,將每個紋理座標編碼爲它將是的第2個位置,以及它將引用的紋理作爲第3個座標。如果你的紋理通常是從一種類型的模式轉換到另一種模式的邏輯上,你必須通過中介,那麼效果最好。

一個明顯的例子使用的是紋理映射到一個簡單的高度地圖 - 你可能有在頂部的積雪紋理,岩石質地低於,低於草地紋理和底部的紋理水。如果引用水的頂點與引用雪的頂點相鄰,則幾何填充可以通過岩石和草地紋理進行過渡。

一種替代方法是做在多個使用添加劑共混通行證。對於每個紋理,繪製使用該紋理的每個面,並繪製淡入淡出以延伸到從一個紋理切換到另一個紋理的任何面上。

您可能需要完整繪製深度緩衝區(顏色遮罩設置爲拒絕對顏色緩衝區的更改),然後切換到GL_EQUAL深度測試,然後再次繪製深度緩衝區時禁用。通過完全相同的變換繪製完全相同的幾何圖形應該產生完全相同的深度值,而不管精度和精度如何。如果您遇到問題,請使用glPolygonOffset。

上的座標部分:

受歡迎和容易映射爲圓柱形,箱體和球形。從概念上說,你的形狀是由圓柱體,盒子或球體以及從表面點到紋理位置的良好定義的映射來界定的。然後,對於形狀中的每個頂點,從它開始並按照常規出來,直到碰到邊界幾何。然後抓取位於邊界幾何體上該位置的紋理位置。

我想有一個潛在的問題,法陣在行進多維數據集後往往不會很出色,但我會打賭你比我更瞭解這個問題。

+0

我用來生成幾何圖形的庫確實提供了生成法線的方法,因此,如果我可以有效地映射它們,聽起來就像它可以工作。你對疊加紋理的建議也很有趣,絕對不是我想過的,但它聽起來像是會工作得很好。唯一的缺點是使用分層紋理,不過現在是時候升級Photoshop了。 :我肯定會嘗試。 – ssube 2010-11-04 03:41:28

1

這是一個棘手而有趣的問題。

最簡單的方法是通過使用3D紋理貼圖來完全避免該問題,特別是如果您只是想將一些隨機表面細節添加到等值面幾何中。在着色器中實現的基於Perlin噪聲的程序紋理對此非常適用。

困難的方法是尋找到各種算法用於conformal texture mapping(也稱爲conformal surface parametrization),其目的是產生2D紋理空間和3D幾何形狀,在某種意義上最佳的(至少扭曲)的表面之間的映射。這paper有一些很好的照片。請注意幾何的拓撲非常重要;很容易生成一個保形貼圖,將紋理映射到像大腦這樣的封閉表面上,對於需要引入剪切/眼淚/連接的更高對象來說要複雜得多。

+0

我使用perlin噪聲來生成幾何體(原始體積紋理),但這裏的技巧是我需要將現有紋理應用於生成的幾何體。我不添加噪點,它是基於紋理(RGB顏色)的表面細節。我正在檢查你鏈接的論文,希望他們中的一些人有一些有用的信息。 – ssube 2010-11-04 03:41:51