2012-10-06 52 views
1

根據用戶早期選擇的某些選項,我正在繪製一個介於100到2500個三角形面之間的中型到大型對象。對象本身是固定的 - 不移動,不經歷任何轉換,沒有任何東西。到目前爲止,您可以將事情想象爲「我的應用程序加載OBJ文件,然後用戶查看它們」,而且您不會錯的。我可以從片段着色器中知道我正在使用哪個三角形嗎?

棘手的是,在任何時候,對象的一些面將被「選中」,而有些不會。選定的面孔必須以不同的紋理顯示 - 相同的UV座標,但像素顏色來自不同的位圖。在任何時候都會選擇大約一半的臉部,並且哪些臉部會不斷變化。

因此,顯而易見的事情是,在片段着色器中,如果我正在處理選定的面部,請在該位圖上調用texture2D(),如果我處於未選定的三角形中,請使用THAT一。只是,我沒有看到從片段着色器中找出我處於哪個三角形的方法。這是我的問題:我可以知道嗎?

我確實有一個選擇 - 用自己的頂點副本設置每個面,將紋理位圖的大小加倍,設置每個面頂點的UV座標以指向「選定」或「取消選擇」位圖的一部分 - 但頂點的數量增加了6倍,並且我將每個單幀的整個UV陣列傳遞給GPU,並且...是的。即使對於小件物品也很慢。不好。

回答

3

片段着色器不知道它在哪個三角形中。但是,可以通過使用額外的頂點屬性來獲得所需的效果。

不幸的是,這通常意味着您必須以相同的方式複製每個三角形的頂點數據,因爲您在做摺痕時必須做到這一點 - 沒有簡單的方法來改變它,至少在不得不用任何種選擇。
但是,使用單獨的流,您實際上只需要每幀都上傳一個屬性,其餘部分是不變的。就目前而言,這是完全可以接受的帶寬方式。

片段着色器然後將靜態採樣兩者紋理和選擇一個或基於特殊頂點屬性是否爲1.0或0.0(這是比分支和每次採樣不同的紋理更加有效,這將可能樣品的其他值無論如何都是紋理)。您可以使用mix內部函數(通常會導致單個本地1週期指令)或三元運算符。

一種不需要你重複頂點數據是使用一個階躍函數的屬性在1.0切斷選擇的部分子集替代工作種類 - 的 - - 這需要重複頂點被插的問題。
如果任何單個頂點屬性爲零,則任何片段(除了恰好在具有「1.0」的頂點下的片段)的內插值將必然小於1.0。另一方面,除「0.0」頂點之外或者兩個「0.0」頂點之間的線上的任何片段將不爲零。這不適用於每個任意的選擇,但在很多情況下,使用諸如「選擇非零的任何東西」(或其他方式)的策略可以工作,而不復制頂點數據。

擁有ARB_provoking_vertex可以讓你的生活更輕鬆,但是可惜...沒有ES 2.0的實現可能會提供這個功能。

+0

我很害怕這會成爲答案。至少,使用額外的頂點屬性而不是UV座標將大大減少我必須複製到GPU每幀的數量。 – mjfgates

相關問題