簡體   English   中英

替代默認的Open GLES線(3D)?

[英]Alternative to default Open GLES lines (3D)?

我目前正在嘗試在我的項目中實現剪影算法(使用Open GLES,它適用於移動設備,目前主要用於iPhone)。 要求之一是繪制一組3D線。 默認OpenGL線的問題是,粗線(出現間隙)時,它們的傾斜角度不好。 其他細微的偽影也很明顯,這會降低線條的視覺吸引力。

現在,我研究了使用某種四邊形條作為替代方法。 但是,在屏幕空間中繪制四邊形條需要某種可見性檢測-在實際3D世界中被遮蓋的線條不可見。

有許多解決此問題的方法-即定量隱形。 但是,考慮到需要采用射線投射,這種方法,特別是在處理能力有限的移動設備上,很難有效地實現。 環顧四周,我發現了本文 ,其中描述了使用z緩沖區采樣來實現這種效果的幾種方法。 但是,我不是該領域的專家,雖然我在某種程度上了解技術背后的理論,但是我不確定如何進行實際的實現。 我想知道是否有人可以在OpenGLES方面在更高的技術水平上指導我。 一般而言,我也歡迎任何有關3D線可見性的建議。

使用z緩沖區的技術對於iOS設備而言太復雜了-它需要沉重的像素着色器,並且(IMHO)會帶來一些視覺偽像。

如果模型不復雜,則可以在運行時找到幾何輪廓-例如,通過比較具有公共邊的多邊形法線:如果視圖空間中的direction的z值具有不同的形式(一個法線指向攝影機,另一個法線來自攝影機),則此邊緣應用於輪廓。

另一種方法是更“ FPS友好”:保留模型的拉伸版本。 然后首先渲染具有輪廓顏色(沒有紋理和光照)的拉伸模型,並在其上繪制普通模型。 您將需要更多的內存來存儲頂點,但不需要實時計算。

PS:在所有游戲中,我都看到輪廓是幾何的。

我已經找到了一種可以在iPhone 4S上很好地工作的解決方案(未經任何其他設備測試)。 它基於渲染世界空間四邊形的想法,並在GPU上全部進行輪廓檢測。 它遵循以下原則(雙關語無用):

  • 我們生成邊緣信息。 它由網格中的一條邊線/“線”列表組成,對於每條邊線,我們關聯兩個法線,分別代表邊線兩邊的tris。
  • 這被處理為一組四邊形,這些四邊形被上載到GPU-每個四邊形代表一個邊緣。 每個四邊形的每個頂點都帶有三個屬性(vec3),即邊緣方向矢量和兩個相鄰的三法線。 沒有通過“厚度”的所有四邊形都通過-即兩端的頂點在同一位置。 但是,邊緣方向向量在相同位置對每個頂點都是相反的。 這意味着它們將在需要時沿相反方向擠出以形成四邊形。
  • 我們通過在每個三范數和視圖向量之間執行兩個點積並檢查它們是否具有相反的符號,來確定頂點是否是頂點着色器中可見邊緣的一部分。 (有關詳細信息,請參見網上的標准輪廓算法)
  • 對於屬於可見邊緣的頂點,我們采用邊緣方向矢量與視圖矢量的叉積,以獲得面向屏幕的“拉伸”矢量。 我們將此矢量添加到頂點,但除以投影頂點的w值,以創建恆定的厚度四邊形。

這不能直接解決相鄰邊緣之間可能出現的間隙,但是要解決這個問題,它的靈活性要大得多。 一種解決方案可能涉及將大角度線之間的頂點與另一個四邊形橋接,目前我正在研究。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM