2012-07-07 161 views
6

我們有一個iOS繪圖應用程序。目前,該繪圖是用OpenGL ES 1.1實現的。我們使用一些算法來平滑諸如貝塞爾曲線等線。所以,當觸摸事件發生時,我們從觸摸事件點(基於算法)中獲得一些點並繪製這些點。我們也使用筆刷紋理來獲得更自然的效果。使用OpenGL ES 2.0着色器的平滑紋理線條

我不知道是否有可能在OpenGL ES 2.0着色器中實現這些算法。像調用OpenGL函數來繪製由觸摸點和輸出組成的線條,可以呈現平滑的畫筆紋理曲線。

enter image description here

點P0,P1,P4 ......這裏是觸摸事件和紅色曲線的點 - 輸出點,對於T這樣的步驟,使得曲線上相鄰兩個點之間的距離不大於比1個像素。

這裏是用貝塞爾曲線算法解釋鏈接: Bézier curve - Wikipedia, the free encyclopedia

任何幫助深表感謝。 謝謝。

+0

你能更具體嗎?如果我們不知道算法是什麼,我們無法告訴您是否有可能在着色器中實現特定算法! – user1118321 2012-07-07 14:29:26

+0

我們使用什麼算法並不重要。這裏的要點是着色器應該比輸入點在輸出上產生更多的點。我編輯了我的問題,並用Bezier算法添加了一個例子。 – 2012-07-07 20:09:21

回答

6

您不能在頂點着色器內生成新的頂點(您可以在幾何着色器中執行此操作,而ES不具備此功能)。輸出頂點的數量總是與輸入頂點的數量相同,您只能更改它們的位置(當然還有其他屬性)。

所以你必須繪製一個由足夠的頂點組成的線條來保證足夠平滑的曲線。你可以做的是始終放在同一條線條上,曲線參數值T作爲1D頂點位置。在着色器中,然後使用此輸入位置(參數值),使用DeCasteljau算法(或其他)以及將着色器放置爲常量的點P0到P4來計算曲線上的實際2D/3D位置(統一變量用GLSL術語)。

但我不確定這是否真的會爲您購買任何東西,只是計算CPU上的這些點並將它們放入動態VBO中。你保存的是將曲線點從CPU複製到GPU和CPU上的計算,但另一方面你的頂點着色器要複雜得多。需要評估哪種方法更好。如果你需要計算每一幀的曲線點(因爲控制點改變了每一幀)並且曲線相當詳細,這可能不是那麼糟糕的想法。但否則我不認爲它真的付出。而且你的着色器在運行時不易適應變化的控制點/曲線度數。

但是再一次,您不能放入5個控制點並在GPU上生成N個曲線點。頂點着色器總是在單個頂點上工作,併產生單個頂點,與片段着色器一樣,它總是在單個片段上工作(比如像素,雖然它還沒有),並導致一個片段(或沒有片段) 。

+0

感謝您的非常全面的答案! 我一直在尋找一種方法來使代碼更清晰,並獲得一些性能。但是,正如我所看到的,情況並非如此。順便說一句,你提出了非常有趣的方法,傳遞代表T的一維線。我會考慮周圍的。 – 2012-07-07 21:29:22

+0

當然:)我只是按下輸入從新行寫,它發送評論:) 再次感謝! – 2012-07-07 21:33:56