1. 程式人生 > >OSG 渲染(3) 動態剖切的實現方法

OSG 渲染(3) 動態剖切的實現方法

在CAD工程軟體裡,很多時候需要動態剖切模型來檢視模型截面情況。我們知道OpenGL 固定管線支援使用者自定義剖面,且最多支援6個剖平面,OpenGL3.0 以後的版本雖然已經逐步廢棄固定管線,但我們可以使用shader,並傳遞截平面方程引數給shader,使用discard 語句實現類似固定管線使用者自定義截面的效果。


下面將介紹如何實現上圖動態剖切且加蓋的效果,也將說明存在哪些技術難點。

一般方法:

    原理:開啟模版測試,並將模版快取清零操作,然後禁用深度測試,禁用剔除,繪製整個場景,同時模版快取中的值取反操作,最終在模版非零處填充顏色,就這麼簡單。

  • 存在的問題    

    該方法依賴於原實體閉合性,如果場景中有開放實體(也就是未封閉的實體),這種方法就沒有用武之地了,得到的是錯誤結果。所以在場景渲染初始化模版緩衝區時,先要過濾掉自由曲面和開放實體。    

   這種方法雖然簡單有效,但如果我們要求剖面用被剖物件顏色填充,而不是全部由一種顏色填充,這種方法就無能為力,因為它是與視口和觀察方向相關的。

改進方法:

  • 觀察方向無關的剖切

    先在剖面方向上使用正交投影使用RTT用上述方法生成截面紋理;

    將截面紋理應用到剖切平面上;

    問題?

    生成截面紋理時,深度測試如何配合剖面應用才能得到正確結果?

    你應該可以想得到,如果在shader中丟棄截面背面片元,深度測試設定為GL_GREATER,就可以得到正確結果。